В последней документации sendBeacon на MDN говорится, что Navigator Метод .sendBeacon() асинхронно отправляет небольшой объем данных по HTTP на веб-сервер. Он предназначен для использования в сочетании с событием visibilitychange (но не с событиями unload и beforeunload).
Чтобы использовать событие visibilitychange
, как было предложено, вы можете
document.addEventListener('visibilitychange', function() {
if (document.visibilityState === 'hidden') {
navigator.sendBeacon(handleClose);
}
});
У меня возникли аналогичные проблемы с попыткой отправить данные о событии unload
. Все ли пользователи на рабочем столе? Мобильные устройства не всегда надежно запускают событие unload
. API жизненного цикла страницы обеспечивает событие изменения видимости и pagehide
событий, которые можно использовать вместе, чтобы приблизиться к желаемому результату.
Page Lifecycle API пытается решить эту проблему следующим образом: Введение и стандартизация концепции состояний жизненного цикла в Интернете. Определение новых, инициируемых системой состояний, которые позволяют браузерам ограничивать ресурсы, которые могут потребляться скрытыми или неактивными вкладками. Создание новых API и событий, которые позволяют веб-разработчикам реагировать на переходы в эти новые состояния, инициируемые системой, и из них. источник
Проблема, с которой вы столкнулись, скорее всего, связана с тем, что браузеры не приостанавливают работу страниц или полностью их отбрасывают. К сожалению, браузеры не унифицированы в том, как они это делают, и, чтобы добавить сложности, существует различное поведение на настольных компьютерах и мобильных устройствах.
Есть несколько тем, которые углубляются в эту проблему, если вам это интересно. Пока браузеры не стандартизируют это, я не уверен, что есть простой ответ, такой как use x event.
Ошибка в отношении видимости страницы
Проблема с рекомендациями MDN по поводу sendBeacon
person
mitchellcarroll
schedule
23.12.2020
unload and beforeunload aren’t the right events to use with sendBeacon. Instead, use visibilitychange.
, оно также не работает при закрытии с событиемvisibilitychange
! - person Brackets   schedule 23.12.2020