Вот как я это сделал (без использования jQuery).
В моем случае я хотел, чтобы один конкретный элемент формы не учитывался, потому что именно этот элемент инициировал проверку и поэтому всегда будет изменяться. Исключительный элемент называется 'accounting_period' и жестко запрограммирован в функции hasFormChanged ().
Чтобы проверить, заставьте элемент вызвать функцию "changeReportingPeriod ()", которую вы, вероятно, захотите назвать как-нибудь еще.
ВАЖНО: Вы должны вызывать setInitialValues (), когда значения были установлены на свои первоначальные значения (обычно при загрузке страницы, но не в моем случае).
ПРИМЕЧАНИЕ. Я не утверждаю, что это элегантное решение, на самом деле я не верю в элегантные решения JavaScript. Мой личный акцент в JavaScript сделан на удобочитаемости, а не на структурной элегантности (как если бы это было возможно в JavaScript). При написании JavaScript я вообще не занимаюсь размером файла, потому что для этого и нужен gzip, а попытка написать более компактный код JavaScript неизменно приводит к невыносимым проблемам с обслуживанием. Я не приношу никаких извинений, не выражаю сожаления и отказываюсь обсуждать это. Это JavaScript. Извините, я должен был прояснить это, чтобы убедить себя, что мне стоит заняться публикацией. Будь счастлив! :)
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());
}