Підтвердження перед закриттям вкладки / браузера


76

Як запитати підтвердження у користувача, перш ніж він покине сторінку, як у Gmail?

Я шукав це запитання в різних місцях, але все, що вони згадують, це використання javascript window.unload & window.onbeforeunload . Крім того, він не працює в хромі в більшості випадків, оскільки блокується.


Я спробував window.unload і window.onbeforeunload, але вони не працювали відповідно до вимог.

3
@CiroSantilli: Ні, це не так. Це інше питання стосується проблем із onbeforeunloadправильним використанням
Бергі

Відповіді:


121

Спробуйте це:

<script>
window.onbeforeunload = function (e) {
    e = e || window.event;

    // For IE and Firefox prior to version 4
    if (e) {
        e.returnValue = 'Sure?';
    }

    // For Safari
    return 'Sure?';
};
</script>

Ось робочий jsFiddle


2
також це не може бути вимкнено будь-яким браузером, оскільки воно походить від клацання користувача
gopi1410

Дуже дякую! це те, що мені потрібно було. До речі, люблю демонстрацію скрипки, саме те, що я хотів.

Привіт .. Ваш код працює, але він не може розрізнити, натиснув користувач кнопку закриття браузера чи кнопку навігації, щоб перейти на якусь іншу сторінку.
user3217843

ОП про це конкретно не запитувала. Якщо вам це потрібно, я думаю, вам потрібно перевірити event.targetта перевірити, чи відбулася подія кліку з контейнера вашої сторінки.
gopi1410

9
Я спробував, і це працює, лише якщо спочатку клацнути щось інше, наприклад. посилання було натиснуто правою кнопкою миші. Тоді, якщо я натискаю кнопку закриття браузера, він запитує перед закриттям, як очікувалося. В іншому випадку, якщо я заходжу безпосередньо на сторінку, наприклад, і відразу натискаю кнопку закрити, це не працює, і сторінка закривається. Код всередині функції onbeforeunload вражає кожен, але в останньому випадку явно не має ефекту.
nickornotto

11

Спробуйте це:

<script>
    window.onbeforeunload = function(e) {
       return 'Dialog text here.';
    };
</script>

більше інформації тут MDN .


6

Я читав коментарі до відповіді, встановленої як " Добре" . Більшість користувачів просять дозволити кнопку та деякі посилання. Тут до існуючого коду додається ще один рядок, який буде працювати.

<script type="text/javascript">
  var hook = true;
  window.onbeforeunload = function() {
    if (hook) {

      return "Did you save your stuff?"
    }
  }
  function unhook() {
    hook=false;
  }

Виклик unhook () onClick для кнопки та посилань, які ви хочете дозволити. Напр

<a href="#" onClick="unhook()">This link will allow navigation</a>

1
Ви могли б це зробити безпосередньоonclick="hook = false;"
невизначено

5

Найкоротша рішення для 2020 року (за винятком тих щасливих людей , які не повинні підтримувати IE)

Перевірено в Chrome, Firefox, Safari.

function onBeforeUnload(e) {
    if (thereAreUnsavedChanges()) {
        e.preventDefault();
        e.returnValue = '';
        return;
    }

    delete e['returnValue'];
}

window.addEventListener('beforeunload', onBeforeUnload);

Насправді жоден сучасний браузер (Chrome, Firefox, Safari) не відображає "повернене значення" як запитання до користувача. Натомість вони показують власний текст підтвердження (це залежить від браузера). Але нам все одно потрібно повернути деякий (навіть порожній) рядок, щоб запустити це підтвердження в Chrome.

Більше пояснень див. На MDN тут і тут .


3

Просто

function goodbye(e) {
        if(!e) e = window.event;
        //e.cancelBubble is supported by IE - this will kill the bubbling process.
        e.cancelBubble = true;
        e.returnValue = 'You sure you want to leave?'; //This is displayed on the dialog

        //e.stopPropagation works in Firefox.
        if (e.stopPropagation) {
            e.stopPropagation();
            e.preventDefault();
        }
    }
window.onbeforeunload=goodbye;

0

Якщо ви хочете запитати на основі умови:

var ask = true
window.onbeforeunload = function (e) {
    if(!ask) return null
    e = e || window.event;
    //old browsers
    if (e) {e.returnValue = 'Sure?';}
    //safari, chrome(chrome ignores text)
    return 'Sure?';
};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.