Window.onbeforeunload в Chrome: какое последнее исправление?

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

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

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

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

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

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

Ответ 1

Ответ:

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

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

Ответ 2

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

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

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

enter image description here

Ответ 3

Согласно MDN,

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

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

window.addEventListener( 'beforeunload', function(ev) { 
    return ev.returnValue = 'My reason';
})

Ответ 4

По состоянию на 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';