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

12

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

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

Вот пример.

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

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

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

Зак Б
источник
Можете ли вы опубликовать URL, который делает это?
Голимар
Отредактировано, добавлен пример. Кроме того, я понимаю, почему такое поведение часто желательно, и что оно необходимо для предотвращения случайной потери данных во многих случаях. Я все еще хотел бы знать, как переопределить / отключить его.
Зак Б
Примечание: весь текущий ответ (который изменяется onbeforeunload) будет работать только для страниц, которые используют onbeforeunload, но не для страниц, которые используют один из других методов для прикрепления событий.
Synetech

Ответы:

7

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

Zeel
источник
Такого рода работы, но что, если onbeforeunloadобработчик сделал что-то еще важное? Например, что он сделал, если сделал короткий AJAX-запрос или зафиксировал что-то в локальном хранилище HTML5? Есть ли способ просто запретить onbeforeunloadобработчикам делать определенные вызовы (т.е. alert()) или работать дольше определенного периода времени? Вот почему я спросил о расширении, а не только о скрипте типа greasemonkey: похоже, чтобы сделать это правильно, нужно было бы что-то изменить на уровне движка JavaScript.
Зак Б.
1
Я добавил еще немного информации. Что касается фактического исправления этого на более низком уровне, расширения на самом деле не являются более низким уровнем. Они имеют более высокие разрешения и некоторые специальные API, но им не хватает возможности изменять основные функции браузера. Я не уверен, насколько глубоким может быть подключение FF, у меня нет опыта в этой области. Очевидно, что, будучи открытым исходным кодом, вы можете внести эти изменения. Но это будет немного далеко, чтобы исправить всплывающее окно.
Zeel
Не работает для меня :(
Phuc Nguyen
0
    // ==/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);
Anywho
источник
1
Зачем вам когда-нибудь создавать такой сценарий?
Брэд
3
@anywho. Это может быть полезно, если вы попытаетесь объяснить свой сценарий, чтобы помочь другим узнать, что они делают. Это также позволит вам ответить на многие вопросы, поскольку конкретный фрагмент сценария может быть изменен таким образом, чтобы улучшить сценарий, или фрагмент может быть использован в совершенно другом сценарии. Это также хорошая идея, чтобы объяснить ваш ответ в любом случае, чтобы помочь людям узнать, как это относится к их вопросу. Спасибо за размещение вашего ответа, хотя.
Дэвид
0

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

Serhiy
источник