Подтвердить что ты не робот

Есть ли обратный вызов для отмены window.onbeforeunload

У меня нет фактического варианта использования, но мне любопытно, есть ли способ реагировать (обратный вызов), если пользователь нажимает "оставаться на этой странице", когда запускается window.onbeforeunload.

http://jsfiddle.net/rWHU9/

function warning(){
    if(true){
      console.log('leaving');
      return "You are leaving the page";
    }
}
window.onbeforeunload = warning;​
4b9b3361

Ответ 1

Нет обратного вызова для оставления на странице, но есть один для выхода из страницы, window.unload.

Попробуйте установить таймаут в beforeunload, затем очистите его при разгрузке. Если вы останетесь, тайм-аут будет работать, иначе он будет очищен.

var timeout;

function warning() {
    timeout = setTimeout(function() {
        alert('You stayed');
    }, 1000);
    return "You are leaving the page";
}

function noTimeout() {
    clearTimeout(timeout);
}

window.onbeforeunload = warning;
window.unload = noTimeout;​

DEMO: http://jsfiddle.net/aPwfz/1/

Ответ 2

Короткий ответ: Нет, нет обратного вызова или какого-либо прямого способа перехватить событие "остаться на этой странице".

Однако вы можете немного обмануть и создать такую ​​конструкцию:

function warning() {
    setTimeout(function() {
        setTimeout(function() {
            alert('user choosed to stay on this site: ' + location.href);
        }, 100);
    },1);
    return "You are leaving the page";
}
window.onbeforeunload = warning;​

Поскольку вопрос является модальным диалогом, обратный вызов setTimeout не срабатывает, пока вы не подтвердите это модальное поле. Но, как вы правильно предполагаете сейчас, это также срабатывает, если вы нажмете "покинуть этот сайт". Так что это сложно. Чтобы решить эту проблему, вам нужно увеличить setTimeout, чтобы предоставить браузеру достаточно времени для unload страницы.

Почему есть два setTimeout() вложенных? Ну, таймер "запустится", как только появится модальное диалоговое окно. Поэтому мы не хотим запускать этот таймер, пока модальный диалог не будет закрыт. Как только это произойдет, наш внутренний setTimeout запустится и со временем что-то сделает.

Я думаю, что реалистичное значение для большинства реальных сценариев - это 2.000 ms для внутреннего setTimeout

Ответ 3

Единственный способ сказать, что пользователь нажал кнопку "Отменить", - это запустить setTimeout и посмотреть, не срабатывает ли он. Невозможно допросить возврат из системного блока confirm -esque.

http://jsfiddle.net/rWHU9/2/

Ответ 4

Попробуйте запустить setTimeout в качестве первого кода для вызова любой другой функции (например, через 5-10 секунд) перед возвратом "вопрос здесь". то есть.

window.onbeforeunload = confirmExit;
function confirmExit() {
    setTimeout("thisFunction;", 10000);
    return "do you realy want to close?";
}

И для отмены onbeforeclose это сработало для меня: попробуйте пустую функцию:

window.onbeforeunload = function(){};

Спасибо, удачи!

Ответ 5

$(window).bind('beforeunload', function(){
     return '\n Your custom message';
 });

При подключенном событии "beforeunload", когда вы закрываете страницу, нажимаете кнопку "Назад" или перезагружаете страницу, окно подтверждения подскажет вам, хотите ли вы действительно пойти, выберите "ОК", чтобы выйти из страницы: отменить, чтобы остановить страницу с выхода и оставаться на той же странице.