Я сделал это, используя javascript для хранения начальных значений входных данных при загрузке страницы. Затем у меня есть обработчик beforeunload, который проверяет, имеет ли какой-либо из входов значение, отличное от того, когда страница была загружена. Если какие-либо входы изменены, он предлагает пользователю подтвердить, что он хочет покинуть страницу, отменяя действие, если он отменяет. В моей логике отправки я установил флажок, который предотвращает проверку перед загрузкой, поэтому отправка не получает приглашение.
Я подозреваю, что для этого есть плагин jQuery, но я не реализовал это с тех пор, как начал использовать jQuery. Мой предыдущий код использовал Prototype.
Редактировать : Не удалось найти плагин jQuery, но я мог просто пропустить его. Вот пример того, как я могу это сделать. Очевидно, что это еще не все. Обратите внимание, что я не смог заставить его работать с чистым jQuery - точно не знаю почему, всплывающее окно появилось бы дважды.
Это должно работать со всеми элементами ввода. Вы могли бы хотеть изменить это, чтобы игнорировать / обрабатывать кнопки, все же. Я только настроил его, чтобы игнорировать кнопку отправки (чтобы он мог публиковать сообщения без всплывающего окна). Если другие типы кнопок могут вызвать выгрузку страницы, вам может потребоваться решить эту проблему.
var CheckOnClose = function() {
this.initialize();
}
CheckOnClose.prototype = {
submitting: false,
initialize: function() {
var that = this;
window.onbeforeunload = function() { return that.checkLeavePage(); }
},
isChanged: function() {
var changed = false;
$('input:not(:submit)').each( function() {
var iv = $(this).data('initialValue');
if ($(this).val() != iv) {
changed = true;
return false;
}
});
return changed;
},
setSubmitting: function() {
this.submitting = true;
},
checkLeavePage: function() {
if (!this.submitting && this.isChanged()) {
return 'You have some unsaved changes.';
}
}
}
var checker = new CheckOnClose();
$(document).ready(function() {
$(':input:not(:submit)').each( function() {
$(this).data('initialValue',$(this).val() );
});
$(':submit').click( function() {
checker.setSubmitting();
});
});