Oto jak to zrobiłem (bez użycia jQuery).
W moim przypadku chciałem, aby jeden element formularza nie był liczony, ponieważ był to element, który wyzwalał sprawdzanie i zawsze będzie się zmieniać. Wyjątkowy element nosi nazwę „okres_raportowania” i jest zakodowany na stałe w funkcji „hasFormChanged ()”.
Aby przetestować, spraw, aby element wywołał funkcję „changeReportingPeriod ()”, której prawdopodobnie będziesz chciał nazwać coś innego.
WAŻNE: musisz wywołać metodę setInitialValues (), gdy wartości zostały ustawione na ich oryginalne wartości (zwykle podczas ładowania strony, ale nie w moim przypadku).
UWAGA: Nie twierdzę, że jest to eleganckie rozwiązanie, tak naprawdę nie wierzę w eleganckie rozwiązania JavaScript. Mój osobisty nacisk w JavaScript kładzie się na czytelność, a nie na strukturalną elegancję (tak jakby było to możliwe w JavaScript). Nie przejmuję się w ogóle rozmiarem pliku podczas pisania JavaScript, ponieważ do tego służy gzip, a próba napisania bardziej zwartego kodu JavaScript niezmiennie prowadzi do nieznośnych problemów z konserwacją. Nie przepraszam, nie wyrażam wyrzutów sumienia i odmawiam dyskusji. To jest JavaScript. Przepraszam, musiałem to wyjaśnić, aby przekonać się, że powinienem zawracać sobie głowę wysyłaniem. Bądź szczęśliwy! :)
var initial_values = new Array();
function getAllFormElements() {
var all_form_elements = Array();
var form_activity_report = document.getElementById('form_activity_report');
var inputs = form_activity_report.getElementsByTagName('input');
var textareas = form_activity_report.getElementsByTagName('textarea');
var selects = form_activity_report.getElementsByTagName('select');
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;
}
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());
}