12

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

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

Вот пример.

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

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

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

3 ответа3

5

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

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);
0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .