window.onbeforeunload в Chrome: какое самое последнее исправление? - PullRequest
24 голосов
/ 09 марта 2012

Очевидно, что window.onbeforeunload столкнулся со значительной долей проблем с Chrome, как я видел из всех проблем, с которыми я столкнулся. Какая самая последняя работа вокруг?

Единственное, что у меня есть даже близко к работе, это это :

window.onbeforeunload = function () { return "alert" };

Однако, если я заменю return «alert» чем-то вроде alert («бла»), я ничего не получу от Chrome.

Я видел в этом вопросе , что Google намеренно блокирует это. Хорошо для них ... но что, если я хочу сделать AJAX-вызов, когда кто-то закрывает окно? В моем случае я хочу знать, когда кто-то вышел из комнаты чата на моем веб-сайте, и это сигнализирует закрытие окна.

Я хочу знать, есть ли способ либо 1014 * (a): исправьте вызов window.onbeforeunload, чтобы я мог поместить туда AJAX
или
(б): получить другой способ определить, что окно закрыто в Chrome

Ответы [ 4 ]

14 голосов
/ 09 марта 2012

Ответ:

$(window).on('beforeunload', function() {
    var x =logout();
    return x;
});
function logout(){
        jQuery.ajax({
        });
        return 1+3;
}

Немного смешать и сочетать, но у меня это сработало. 1 + 3 гарантирует, что функция выхода из системы вызывается (вы увидите 4, если она будет успешной во всплывающем окне, когда вы попытаетесь выйти).

3 голосов
/ 29 июня 2015

Вот более простой подход.

$(window).on('beforeunload', function() {
    return "You should keep this page open.";
});

Возвращаемое сообщение может быть любым, включая пустую строку, если вам нечего добавить к сообщению, которое Chrome уже показывает. Результат выглядит так:

enter image description here

2 голосов
/ 21 июня 2016

Согласно MDN ,

Функция должна присвоить строковое значение свойству returnValue объекта Event и возвращает ту же строку.

Это следующее

window.addEventListener( 'beforeunload', function(ev) { 
    return ev.returnValue = 'My reason';
})
1 голос
/ 17 сентября 2018

По состоянию на 69.0.3497.92 Chrome не соответствует стандарту. Тем не менее, сообщение об ошибке подано, и проверка выполняется.

  • Chrome требует, чтобы returnValue устанавливалось путем ссылки на объект события, а не на значение, возвращаемое обработчиком.
  • Стандарт гласит , что запросом можно управлять, отменив событие или установив для возвращаемого значения ненулевое значение .
  • Стандарт гласит, что авторам следует использовать Event.preventDefault () вместо returnValue.
  • Стандарт гласит , что сообщение, отображаемое для пользователя, не настраивается.

window.addEventListener('beforeunload', function (e) {
    // Cancel the event as stated by the standard.
    e.preventDefault();
    // Chrome requires returnValue to be set.
    e.returnValue = '';
});
    
window.location = 'about:blank';
...