So habe ich es gemacht (ohne jQuery zu verwenden).
In meinem Fall wollte ich, dass ein bestimmtes Formularelement nicht gezählt wird, da es das Element war, das die Prüfung ausgelöst hat und sich daher immer geändert hat. Das außergewöhnliche Element heißt 'reporting_period' und ist in der Funktion 'hasFormChanged ()' fest codiert.
Lassen Sie zum Testen ein Element die Funktion "changeReportingPeriod ()" aufrufen, die Sie wahrscheinlich etwas anderes benennen möchten.
WICHTIG: Sie müssen setInitialValues () aufrufen, wenn die Werte auf ihre ursprünglichen Werte gesetzt wurden (normalerweise beim Laden der Seite, in meinem Fall jedoch nicht).
HINWEIS: Ich behaupte nicht, dass dies eine elegante Lösung ist. Tatsächlich glaube ich nicht an elegante JavaScript-Lösungen. Mein persönlicher Schwerpunkt in JavaScript liegt auf der Lesbarkeit, nicht auf struktureller Eleganz (als ob dies in JavaScript möglich wäre). Ich beschäftige mich beim Schreiben von JavaScript überhaupt nicht mit der Dateigröße, da dies der Zweck von gzip ist und der Versuch, kompakteren JavaScript-Code zu schreiben, ausnahmslos zu unerträglichen Problemen bei der Wartung führt. Ich entschuldige mich nicht, drücke keine Reue aus und lehne es ab, darüber zu debattieren. Es ist JavaScript. Entschuldigung, ich musste dies klarstellen, um mich davon zu überzeugen, dass ich mir die Mühe machen sollte, etwas zu posten. Sei glücklich! :) :)
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());
}