В моем веб-приложении 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 bit перед отправкой назад, но проблема в том, что в IE onbeforeunload
срабатывает перед __doPostBack, по-видимому, потому, что IE запускается onbeforeunload сразу же при нажатии ссылки (как описано здесь).
Конечно, я могу подключить каждый из этих элементов управления, чтобы очистить isDirty bit, но я бы предпочел решение, которое работает на уровне формы, и это не требует, чтобы я касался каждого элемента управления, который может вызвать обратную передачу,
Есть ли у кого подход, который работает в ASP.NET, и это не связано с подключением каждого элемента управления, который может вызвать обратную передачу?