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

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

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

Обычно это делается с помощью обработчиков onbeforeunloadи/или onunload.

Здесьявляется примером.

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

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

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

решение1

Ну, самое простое, что можно сделать, это просто переопределить скрипт pages напрямую и переназначить событие на null.

window.onbeforeunload = null;

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

while(true) {
    if (window.onbeforeunload != null) {
        window.onbeforeunload = null;
    }
}

Теперь, будьте осторожны, некоторые страницы используют это во благо. Возьмите страницу загрузки YouTube: если вы уходите во время загрузки, вы можете потерять часы прогресса! Или, возможно, веб-форму, которую вы заполняете, и которую вы не хотите заполнять снова, или сообщение (форум/электронная почта), которое вы не хотите перепечатывать. С этой функцией вы защищены.

Другая проблема — любая страница, использующая это для какой-то вторичной цели, например, сохранения данных с помощью AJAX. Они могут использовать это событие для запуска действия сохранения и надеяться, что пользователь достаточно долго нажмет кнопку, чтобы запрос прошел. Опять же, это часто делается, чтобы спасти вас от вас самих.

Но, очевидно, мы все знаем, что многие страницы используют это во зло. Так что если вы знаете какие-либо страницы, на которых вы хотите, чтобы это работало, вы всегда можете иметь систему белого списка. На самом деле нет способа заблокировать это действие, без полной блокировки window.onbeforeunloadи любых (возможно хороших) действий, которые оно может предпринять.

Нет способа (без предварительного знания кода данной страницы) сохранить хорошие действия при остановке всплывающего окна. Это окнонетan alert(). Поле генерируется браузером, как предполагаемое поведение onbeforeunload. Его создают, заставляя любую функцию, которую они назначают, window.onbeforeunloadвозвращать строку. Эта строка будет напечатана во всплывающем окне.

window.onbeforeunload = function() {
    //Whatever
    return "WARNING! You have unsaved changes that may be lost!";
}

Таким образом, вы не сможете заблокировать всплывающее окно, не удалив функцию.

Плюс, если бы вы нашли способ, любой AJAX бы провалился. Всплывающее окно дает запросам время для прохождения, без него данные могут быть потеряны.

Что касается onunload, то заблокировать вас этим не должно быть возможным. Поскольку он срабатываетпослестраница выгружается. Но чтобы быть в безопасности, вы всегда можете сделать window.onunload = null;и это должно быть сделано.

решение2

    // ==/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);

решение3

Есть отличный инструмент, который может справиться с любым раздражающим всплывающим окном в системе Windows -НажмитеВыкл.. Вы можете скачать его здесьздесь. Я проверил, и это работает с предупреждением «Внесенные вами изменения могут быть не сохранены» для сайта SharePoint.

Связанный контент