Ось як я це зробив (без використання jQuery).
У моєму випадку я хотів, щоб один конкретний елемент форми не враховувався, оскільки саме цей елемент ініціював перевірку, і тому він завжди буде змінюватися. Винятковий елемент називається 'report_period' і жорстко закодований у функції '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());
}