В моем веб-приложении ASP.NET я пытаюсь создать универсальный способ предупреждения пользователей перед тем, как перейти от формы, когда они внесли изменения, с помощью jQuery. Довольно стандартные вещи, но после долгих поисков мне еще предстоит найти технику, которая работает.
Вот что у меня есть на данный момент:
addToPostBack = function(func) {
var old__doPostBack = __doPostBack;
if (typeof __doPostBack != 'function') {
__doPostBack = func;
} else {
__doPostBack = function() {
old__doPostBack();
func();
}
}
}
var isDirty = false;
$(document).ready(function() {
addToPostBack(function() {
alert("Postback detected.")
clearDirty();
});
$(':input').bind("change select keydown", setDirty);
window.onbeforeunload = function(e) {
var msg = "You have unsaved changes. "
if (isDirty == true) {
var e = e || window.event;
if (e) { e.returnValue = msg; }
return msg;
}
};
});
setDirty = function() {isDirty = true;}
clearDirty = function() {isDirty = false;}
Это работает, если вы предупреждаете пользователя о том, что он не может уйти. Проблема в том, что я получаю предупреждение при каждой обратной передаче на той же странице. В моих формах есть несколько вещей, которые могут вызвать обратную передачу:
- На странице есть кнопки Сохранить, Отмена и Удалить
- На странице могут быть другие кнопки ссылок, которые выполняют функции на стороне сервера, оставаясь на той же странице
- Могут быть и другие элементы управления с autopostback = true, к которым также прикреплены серверные функции, но которые не приводят к тому, что пользователь покидает страницу.
Ничто из этого не должно вызывать предупреждение, поскольку пользователь не покидает страницу. Мой код пытается перехватить addToPostBack ( подробнее об этом в этом вопросе ), чтобы очистить бит isDirty перед отправкой назад, но проблема в том, что в IE onbeforeunload
срабатывает до __doPostBack, по-видимому, потому что IE запускает onbeforeunload немедленно при нажатии на ссылку (, как описано здесь ).
Конечно, я мог бы подключить каждый из этих элементов управления, чтобы очистить бит isDirty, но я бы предпочел решение, которое работает на уровне формы и не требует, чтобы я касался каждого элемента управления, который мог бы вызвать обратную передачу ,
Есть ли у кого-нибудь подход, который работает в ASP.NET и не предусматривает подключения всех элементов управления, которые могут вызвать обратную передачу?