Как предотвратить появление предупреждений JavaScript при выходе из страницы?

На многих страницах появляются оповещения, когда вы покидаете их: если вы закрываете вкладки, уходите без сохранения и т. Д., Существует множество причин, по которым сайт будет предупреждать / блокировать вас, пока вы не подтвердите оповещение, например: "Вы уверены, что хотите отойти от этой страницы?

Обычно это делается с onbeforeunload и / или onunload обработчики.

Вот пример.

Можно ли как-то предотвратить предупреждения / события блокировки пользователей, генерируемые этими обработчиками? По сути, я хотел бы оставить JS включенным, и, в частности, запретить вещи, которые мешали бы мне покинуть страницу без лишних нажатий.

onbeforeunload а также onunload обработчики должны все еще стрелять; им просто нельзя позволять делать вещи, которые блокируют пользователя. Это означает отсутствие предупреждений и операций, занимающих более нескольких секунд.

Я нашел несколько плагинов, которые редактируют / greasemonkey, исправляют javascript для определенных страниц, и немного поигрались с их кодом, чтобы попытаться сделать их более универсально применимыми. Тем не менее, я надеюсь найти решение, которое работает на любой странице, которая пытается заблокировать выход пользователя.

3 ответа

Что ж, самое простое, что нужно сделать, это просто переопределить скрипт страниц напрямую и переназначить событие на 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; и об этом нужно позаботиться.

Существует хороший инструмент, который может обрабатывать любое раздражающее всплывающее окно в системе Windows - ClickOff. Вы можете скачать его здесь. Я проверил его, и он работает с предупреждением "Изменения, которые вы внесли, возможно, не сохранены" для сайта SharePoint.

    // ==/UserScript==

var th = document.getElementsByTagName('body')[0];
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.innerHTML = "window.onbeforeunload = function() {}";
th.appendChild(s);
Другие вопросы по тегам