Изменение видимости документа по сравнению с размытием / фокусировкой окна, в чем разница, когда использовать?
В ECMAscript (=Javascript) есть два способа проверить, находится ли пользователь за пределами вашей страницы или нет. Вы можете либо послушать "visibilitychange
"мероприятие на document
или вы можете послушать "blur
" а также "focus
"события на window
. Есть ли между ними разница?
1 ответ
Да. Наиболее существенную разницу между ними можно увидеть на телефонах. На настольных компьютерах и планшетах, если вы хотите изменить вкладку браузера, есть только ОДИН шаг. Вы просто щелкаете / нажимаете, куда хотите пойти, и вы там. Это выглядит так,
Но на телефоне обычно есть ДВА шага. Вы сначала так начинаете,
и когда вы нажимаете на значок TABS, вы видите всплывающее меню, подобное этому,
Здесь основное различие между изменением видимости и размытием / фокусировкой становится очевидным и также может быть важным. Согласно с "visibilitychange
"на данном этапе пользователь еще не ушел с вашей страницы. Но согласно"blur
/focus
"пользователь отсутствует.
Что касается других случаев, я использовал оба, чтобы увидеть, какой из них срабатывает раньше. Код такой,
document.addEventListener("visibilitychange", visChngF);
function visChngF()
{
if (document.hidden) {
console.log("hidden means user is gone");
} else {
console.log("visible means user is back");
}
}
window.addEventListener('blur', blurHappenedF);
function blurHappenedF()
{
console.log("blur means user is away");
}
window.addEventListener('focus', focusHappenedF);
function focusHappenedF()
{
console.log("focus means user is here");
}
Результат: это непредсказуемо. Иногда изменение видимости срабатывает до размытия / фокуса, а иногда после. Он может даже срабатывать между событием размытия и событием фокусировки.
По данным MDN
window.onBlur
имеет лучшую совместимость с браузером.
https://developer.mozilla.org/en-US/docs/Web/API/Document/visibilitychange_eventhttps://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onblur
(Safari - частичная поддержка)
Я предполагаю, что проще использовать
window
обработчик событий на
document