То, что я пытаюсь достичь, состоит в том, чтобы предупредить пользователя о несохраненных изменениях, если он пытается закрыть страницу или перейти от нее без сохранения в первую очередь.Активация OnBeforeUnload ТОЛЬКО при изменении значений полей
Мне удалось открыть диалоговое окно OnBeforeUnload()
для всплывающего окна ... но я не хочу, чтобы он отображался вообще, если пользователь не изменил значения полей. Для этого я использую это скрытое поле ввода is_modified, которое начинается со значения по умолчанию false и переворачивается до true при редактировании любого поля.
Я попытался связать событие событие в это поле is_modified, чтобы попытаться обнаружить изменение значения ... и только затем активировать OnBeforeUnload.
$('#is_modified').change(function() {
if($('#is_modified').val() == 'true')
window.onbeforeunload = function() { return "You have unsaved changes."; }
});
Но от того, что я полагаю, что change()
событие работает только после того, как эти 3 шага - поле получает фокус, значение изменяется, а поле теряет фокус. В случае скрытого поля ввода, я не уверен, как это происходит и теряется часть фокуса! Следовательно, функция onbeforeunload никогда не активируется.
Может ли кто-нибудь предложить способ поддержания триггера по is_modified?
Спасибо.
"true" не является надлежащим значением. В некоторых браузерах (по крайней мере, Firefox, возможно, больше) возврат «null» отменяет диалог. Howerver, в IE, я не смог найти способ отменить диалог внутри обработчика. Единственное, что сработало для меня, - это удалить обработчик полностью заранее (например, «window.beforeunload = null»), как в ответе Брайана Ларсена. –
Достаточно честный. К сожалению, я не тщательно тестировал свое решение, прежде чем ответить. :( –
Я знаю, что я немного опоздал на вечеринку, но я просто наткнулся на это. Однако в IE, если функция возвращает 'undefined' (или ничего не возвращает), диалог не отображается (это также работает в FF). Я попытался вернуть true/false/null, и IE просто поместил бы «true»/«false»/«null» в качестве текста в диалоговом окне. Не знаю, почему. Надеюсь, это поможет кому-то еще. –