Что ж, самое простое, что нужно сделать, это просто переопределить скрипт страниц напрямую и переназначить событие на null
.
window.onbeforeunload = null;
Это должно работать где угодно, если только они не являются действительно вредоносными, и продолжайте переназначать их сами. В таком случае цикл для установки null
, вероятно, будет работать.
while(true) {
if (window.onbeforeunload != null) {
window.onbeforeunload = null;
}
}
Теперь, имейте в виду, некоторые страницы используют это навсегда. Возьмите страницу загрузки YouTube: если вы уйдете во время загрузки, возможно, вы потеряли часы прогресса! Или, возможно, веб-форму, которую вы заполняете, которую вы, возможно, не захотите заполнять снова, или сообщение (форум / электронная почта), которое вы, возможно, не хотите перепечатывать. С помощью этой функции вы защищены.
Другой проблемой является любая страница, использующая это для каких-то вторичных целей, например, для сохранения данных с помощью AJAX. Они могут использовать это событие, чтобы инициировать действие сохранения, и надеются, что пользователю потребуется достаточно много времени, чтобы нажать кнопку, чтобы пройти запрос. Опять же, это часто делается, чтобы спасти вас от себя.
Но, очевидно, мы все знаем, что многие страницы используют это плохо. Так что, если вам известны какие-либо страницы, на которых вы хотите, чтобы они работали, у вас всегда может быть система белого списка. На самом деле нет способа заблокировать это действие без полной блокировки window.onbeforeunload
и любых (возможно, хороших) действий, которые оно может выполнить.
Невозможно (без предварительного знания заданного кода страниц) сохранить хорошие действия при остановке всплывающего окна. Это поле не является alert()
. Окно генерируется браузером как предполагаемое поведение onbeforeunload
. Каждый создает его, заставляя любую функцию, которую они назначают для window.onbeforeunload
возвращает строку. Эта строка будет напечатана во всплывающем окне.
window.onbeforeunload = function() {
//Whatever
return "WARNING! You have unsaved changes that may be lost!";
}
Таким образом, вы не сможете заблокировать всплывающее окно, не удалив функцию.
Кроме того, если бы вы нашли способ, любой AJAX потерпит неудачу. Всплывающее окно дает запросам время для прохождения, без него данные могут быть потеряны.
Что касается onunload
, то не должно быть возможности заблокировать вас этим. Так как он срабатывает после выгрузки страницы. Но, чтобы быть в безопасности, вы всегда можете сделать window.onunload = null;
и об этом нужно позаботиться.