Событие onbeforeunload не запускается в Chrome Incognito

Я пытался отправить маяк на beforeunload, и, похоже, он работает почти во всех современных браузерах, кроме Chrome в режиме инкогнито.

Это код, который работает во всех современных браузерах, кроме Chrome в режиме инкогнито:

window.onbeforeunload = function() {
    navigator.sendBeacon("url");
}

Даже этот код не работает:

window.onbeforeunload = function() { 
    console.log('before unload') 
}

Я делаю что-то не так или это только вина Chrome?


person Alex    schedule 13.02.2020    source источник
comment
Фрагмент, который вы разместили, работает для меня в Windows 10, Chrome 80.0.3987.87 инкогнито   -  person blex    schedule 14.02.2020
comment
Вы не должны полагаться на onbeforeunload. developer.mozilla.org/en-US/docs/Web/ API/WindowEventHandlers/   -  person Dan    schedule 14.02.2020
comment
Мне не нужно, чтобы он был на 100% надежным, но мне любопытно, почему он не работает в режиме инкогнито. Также я не хочу отправлять сообщение пользователю, просто маяк на сервер.   -  person Alex    schedule 14.02.2020
comment
Все блокирующие действия, скорее всего, будут запрещены в режиме инкогнито, поэтому может быть запущено событие выгрузки, но ваша функция не будет завершена до того, как экземпляр окна/навигатора будет уничтожен... дикая догадка... вы можете попробовать добавить статический iframe и попробуйте вызвать выгрузку из него, поместив код JS в атрибут srcDoc   -  person Anonymous    schedule 19.02.2020
comment
Инкогнито — не лучший способ проверки. В режиме инкогнито у вас все еще активированы ваши надстройки, которые могут помешать тесту. Вместо этого вы должны попробовать гостевой режим.   -  person Jorjon    schedule 24.02.2020


Ответы (1)


Какая у вас установка (SO, версия Chrome)?

В Chrome 80.0.3987.116/Ubuntu 64 и Chrome 79.0.3945.130/Windows 10 приведенный ниже фрагмент кода работает без ошибок:

window.addEventListener('beforeunload', (event) => {
  console.log("BEFORE")
  navigator.sendBeacon("http://www.google.it");
  // Cancel the event as stated by the standard.
  event.preventDefault();
  // Chrome requires returnValue to be set.
  event.returnValue = '';
});

Скрин запроса (режим инкогнито), отправленного перед выгрузкой:

введите здесь описание изображения Кроме того, обратите внимание:

Для борьбы с нежелательными всплывающими окнами некоторые браузеры не отображают подсказки, созданные в обработчиках событий beforeunload, если только со страницей не взаимодействовали. Более того, некоторые вообще их не отображают.

Ссылка: https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload

person Mosè Raguzzini    schedule 24.02.2020
comment
Я не хочу показывать подсказку, просто чтобы отправить маяк, не мешая пользователю покинуть сайт. - person Alex; 24.02.2020
comment
Приведенный выше фрагмент показывает как диалог, так и console.log. - person Mosè Raguzzini; 24.02.2020
comment
Каков ваш вывод для navigator.sendBeacon(url, data)? - person Mosè Raguzzini; 24.02.2020
comment
Я не хочу, чтобы он показывал какие-либо журналы, просто чтобы отправить маяк. - person Alex; 24.02.2020
comment
Посмотрите на мою правку и мой экран из сеанса инкогнито - person Mosè Raguzzini; 24.02.2020
comment
Я сделал, но я сказал вам, что мне нужно только отправить маяк, а не просто показать сообщение пользователю и прервать его. - person Alex; 24.02.2020
comment
Если вы хотите избежать диалога, просто верните undefined или null, например window.onbeforeunload = function() { ... return null } - person Mosè Raguzzini; 24.02.2020
comment
Не работает в сафари. - person Adrian; 13.01.2021