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