Voici comment je l'ai fait (sans utiliser jQuery).
Dans mon cas, je voulais qu'un élément de formulaire particulier ne soit pas compté, car c'est l'élément qui a déclenché la vérification et qui aura donc toujours changé. L'élément exceptionnel est nommé 'reporting_period' et est codé en dur dans la fonction 'hasFormChanged()'.
Pour tester, faites en sorte qu'un élément appelle la fonction "changeReportingPeriod()", que vous voudrez probablement nommer autrement.
IMPORTANT : Vous devez appeler setInitialValues() lorsque les valeurs ont été fixées à leur valeur initiale (généralement au chargement de la page, mais pas dans mon cas).
REMARQUE : Je ne prétends pas qu'il s'agit d'une solution élégante. En fait, je ne crois pas aux solutions JavaScript élégantes. En JavaScript, je mets l'accent sur la lisibilité et non sur l'élégance structurelle (comme si cela était possible en JavaScript). Je ne me préoccupe pas du tout de la taille des fichiers lorsque j'écris du JavaScript car c'est à cela que sert gzip, et essayer d'écrire du code JavaScript plus compact conduit invariablement à des problèmes intolérables de maintenance. Je ne présente aucune excuse, n'exprime aucun remords et refuse d'en débattre. C'est JavaScript. Désolé, je devais être clair afin de me convaincre que je devais prendre la peine de poster. Soyez heureux ! :)
var initial_values = new Array();
// Gets all form elements from the entire document.
function getAllFormElements() {
// Return variable.
var all_form_elements = Array();
// The form.
var form_activity_report = document.getElementById('form_activity_report');
// Different types of form elements.
var inputs = form_activity_report.getElementsByTagName('input');
var textareas = form_activity_report.getElementsByTagName('textarea');
var selects = form_activity_report.getElementsByTagName('select');
// We do it this way because we want to return an Array, not a NodeList.
var i;
for (i = 0; i < inputs.length; i++) {
all_form_elements.push(inputs[i]);
}
for (i = 0; i < textareas.length; i++) {
all_form_elements.push(textareas[i]);
}
for (i = 0; i < selects.length; i++) {
all_form_elements.push(selects[i]);
}
return all_form_elements;
}
// Sets the initial values of every form element.
function setInitialFormValues() {
var inputs = getAllFormElements();
for (var i = 0; i < inputs.length; i++) {
initial_values.push(inputs[i].value);
}
}
function hasFormChanged() {
var has_changed = false;
var elements = getAllFormElements();
for (var i = 0; i < elements.length; i++) {
if (elements[i].id != 'reporting_period' && elements[i].value != initial_values[i]) {
has_changed = true;
break;
}
}
return has_changed;
}
function changeReportingPeriod() {
alert(hasFormChanged());
}
0 votes
Un site solution intéressante a été publié par Craig Buckler sur SitePoint. Il est particulièrement intéressant de noter que la solution ne repose pas sur jQuery et qu'elle est compatible avec tous les navigateurs.