На многих страницах появляются оповещения, когда вы покидаете их: если вы закрываете вкладки, уходите без сохранения и т. Д., Существует множество причин, по которым сайт будет предупреждать / блокировать вас, пока вы не подтвердите оповещение, например: «Вы уверены, что хотите отойти от этой страницы?
Обычно это делается с помощью обработчиков onbeforeunload
и и / или onunload
.
Вот пример.
Можно ли как-то предотвратить предупреждения / события блокировки пользователей, генерируемые этими обработчиками? По сути, я хотел бы оставить JS включенным, и, в частности, запретить вещи, которые мешали бы мне покинуть страницу без лишних нажатий.
onbeforeunload
и onunload
обработчики все еще должны стрелять; им просто нельзя позволять делать вещи, которые блокируют пользователя. Это означает отсутствие предупреждений и операций, занимающих более нескольких секунд.
Я нашел несколько плагинов, которые редактируют / greasemonkey, исправляют javascript для определенных страниц, и немного поигрались с их кодом, чтобы попытаться сделать их более универсально применимыми. Тем не менее, я надеюсь найти решение, которое работает на любой странице, которая пытается заблокировать выход пользователя.
источник
onbeforeunload
) будет работать только для страниц, которые используютonbeforeunload
, но не для страниц, которые используют один из других методов для прикрепления событий.Ответы:
Ну, самое простое, что нужно сделать, это просто переопределить скрипт страниц напрямую и переназначить событие на
null
.Это должно сработать где угодно, если только они не являются действительно вредоносными, и продолжайте переназначать их сами. В таком случае цикл для сохранения настроек
null
, вероятно, будет работать.Теперь, имейте в виду, некоторые страницы используют это навсегда. Возьмите страницу загрузки YouTube: если вы уйдете во время загрузки, вы можете потерять часы прогресса! Или, возможно, веб-форму, которую вы заполняете, которую вы, возможно, не захотите заполнять снова, или сообщение (форум / электронная почта), которое вы, возможно, не хотите перепечатывать. С помощью этой функции вы защищены.
Другая проблема - любая страница, использующая это для каких-то второстепенных целей, таких как сохранение данных с помощью AJAX. Они могут использовать это событие, чтобы инициировать действие сохранения, и надеются, что пользователю потребуется достаточно много времени, чтобы нажать кнопку, чтобы пройти запрос. Опять же, это часто делается, чтобы спасти вас от себя.
Но, очевидно, мы все знаем, что многие страницы используют это плохо. Так что, если вам известны какие-либо страницы, на которых вы хотите, чтобы они работали, у вас всегда может быть система белого списка. На самом деле не существует способа заблокировать это действие без полной блокировки
window.onbeforeunload
и каких-либо (возможно, хороших) действий, которые оно может предпринять.Невозможно (без предварительного знания заданного кода страниц) сохранить хорошие действия при остановке всплывающего окна. Эта коробка не является
alert()
. Окно генерируется браузером как предполагаемое поведениеonbeforeunload
. Каждый создает это, делая любую функцию, которую они назначают, чтобыwindow.onbeforeunload
возвратить строку. Эта строка будет напечатана во всплывающем окне.Таким образом, вы не сможете заблокировать всплывающее окно, не удалив функцию.
Кроме того, если бы вы нашли способ, любой AJAX потерпит неудачу. Всплывающее окно дает запросам время для прохождения, без него данные могут быть потеряны.
Что касается
onunload
, не должно быть возможности заблокировать вас этим. Так как он срабатывает после выгрузки страницы. Но чтобы быть в безопасности, вы всегда можете сделать это,window.onunload = null;
и об этом нужно позаботиться.источник
onbeforeunload
обработчик сделал что-то еще важное? Например, что он сделал, если сделал короткий AJAX-запрос или зафиксировал что-то в локальном хранилище HTML5? Есть ли способ просто запретитьonbeforeunload
обработчикам делать определенные вызовы (т.е.alert()
) или работать дольше определенного периода времени? Вот почему я спросил о расширении, а не только о скрипте типа greasemonkey: похоже, чтобы сделать это правильно, нужно было бы что-то изменить на уровне движка JavaScript.источник
Существует хороший инструмент, который может обрабатывать любое раздражающее всплывающее окно в системе Windows - ClickOff . Вы можете скачать его здесь . Я проверил его, и он работает с предупреждением «Изменения, которые вы внесли, возможно, не сохранены» для сайта SharePoint.
источник