Обратите внимание, что в вашем коде вы используете onbeforeclose
, но имя события beforeunload
, поэтому свойство onbeforeunload
, а не onbeforeclose
.
Я просто хотите работать с этим кодом только для обновления и закрытия браузера. Есть ли способ поймать обновление или просмотр браузера, чтобы он мог его использовать.
blockquote>Нет. Вместо этого вам нужно будет захватить каждую ссылку и отправить форму и установить флаг, указывающий вашему обработчику
onbeforeunload
, чтобы он не возвращал строку или не удалял ваш обработчикonbeforeunload
(возможно, флаг является более чистым).Например:
var warnBeforeClose = true; function unloadPage(){ if (warnBeforeClose) { return "Your changes will not be saved."; } } window.onbeforeunload = unloadPage; // ...when the elements exist: $("a").click(dontWarn); $("form").submit(dontWarn); function dontWarn() { // Don't warn warnBeforeClose = false; // ...but if we're still on the page a second later, set the flag again setTimeout(function() { warnBeforeClose = true; }, 1000); }
Или без
setTimeout
(но все еще с таймаутом):var warningSuppressionTime = 0; function unloadPage(){ if (+new Date() - warningSuppressionTime > 1000) { // More than a second return "Your changes will not be saved."; } } window.onbeforeunload = unloadPage; // ...when the elements exist: $("a").click(dontWarn); $("form").submit(dontWarn); function dontWarn() { // Don't warn for the next second warningSuppressionTime = +new Date(); }
Обновление в 2017 году: Также обратите внимание, что с по крайней мере пару лет назад, браузеры не показывают сообщение, которое вы возвращаете; они просто используют тот факт, что вы вернули что-то другое, кроме
null
, в качестве флага, чтобы вместо этого отображать собственное встроенное сообщение.