Як запобігти появі сповіщень JavaScript, які виникають під час виходу зі сторінки?


12

На багатьох сторінках з’являються сповіщення, коли ви їх залишаєте: якщо ви закриваєте вкладки, переходите без збереження тощо, є численні причини, через які сайт попереджатиме / блокує вас від виходу, поки ви не підтвердите сповіщення, наприклад, "Ви впевнені, що хочете перейти від цієї сторінки? ".

Зазвичай це робиться з обробниками onbeforeunloadта / або onunload.

Ось приклад.

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

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

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


Чи можете ви опублікувати URL-адресу, яка це робить?
голумар

Відредаговано, додано приклад. Також я розумію, чому така поведінка часто бажана і що вона потрібна для запобігання випадкових втрат даних у багатьох випадках. Я все-таки хотів би знати, як це змінити / відключити.
Zac B

Примітка. Усі поточні відповіді (які змінюються 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;і про це слід подбати.


Така робота, але що робити, якщо onbeforeunloadобробник зробив щось інше важливе? Наприклад, що це робити, якщо він зробив короткий запит AJAX або щось зробив для локального зберігання HTML5? Чи є спосіб просто запобігти onbeforeunloadобробникам робити певні дзвінки (тобто alert()) або працювати довше певного періоду часу? Ось чому я поцікавився розширенням, а не просто сценарієм типу "gresemonkey": схоже, щоб зробити це правильно, потрібно було б щось змінити на рівні двигуна JavaScript.
Zac B

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

1
Чому ви коли-небудь створювали такий сценарій?
Бред

3
@anywho. Це може бути корисно, якщо ви спробуєте пояснити свій сценарій, щоб допомогти іншим знати, що вони роблять. Це також дозволить багатьом використовувати відповіді, оскільки певний фрагмент сценарію може бути змінений таким чином, щоб поліпшити сценарій, або фрагмент може бути використаний у зовсім іншому сценарії. Також непогано пояснити відповідь у будь-якому випадку, щоб допомогти людям знати, як це стосується їхнього питання. Дякую, що опублікували свою відповідь.
Давид

0

Є приємний інструмент, який може впоратися з будь-яким дратівливим спливаючим вікном системи Windows - ClickOff . Ви можете завантажити його звідси . Я перевірив це, і воно працює з попередженням "Зміни, які ви внесли, можливо, не збережено" для сайту SharePoint.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.