Как определить скрытие веб-страницы из-за наложения на мобильных устройствах?
Определить, скрыта ли веб-страница из-за наложения, например, системного уровня на мобильном устройстве (уведомление о входящем звонке, управление громкостью или переключение приложений), может быть непросто. API видимости страницы (Page Visibility API, document.visibilityState) обычно не обнаруживает такие случаи, так как страница технически остается "видимой" для браузера.
Почему visibilityState может не работать
- Системные наложения не обязательно вызывают событие visibilitychange, так как страница всё ещё считается "видимой" для браузера.
- Браузер может не распознавать такие наложения как изменение состояния видимости страницы.
Альтернативные подходы
Для обнаружения таких ситуаций можно использовать косвенные методы, такие как мониторинг взаимодействий пользователя, фокусировки окна или тайминговых механизмов. Вот несколько стратегий:
1. Обнаружение потери фокуса
Отслеживайте события window.onblur и window.onfocus. Эти события могут срабатывать, когда появляется или исчезает системное наложение, хотя это зависит от типа наложения и поведения браузера.
let isHiddenByOverlay = false;
window.addEventListener('blur', () => {
console.log('Страница может быть скрыта наложением.');
isHiddenByOverlay = true;
});
window.addEventListener('focus', () => {
console.log('Страница снова активна.');
isHiddenByOverlay = false;
});
2. Тайм-аут активности
Отслеживайте взаимодействие пользователя (например, движения мыши, касания или нажатия клавиш). Если в течение разумного времени не происходит взаимодействий, а visibilityState остаётся "видимым", можно предположить наличие наложения.
let lastActivityTime = Date.now();
const resetActivityTimer = () => {
lastActivityTime = Date.now();
};
document.addEventListener('mousemove', resetActivityTimer);
document.addEventListener('touchstart', resetActivityTimer);
document.addEventListener('keydown', resetActivityTimer);
setInterval(() => {
if (Date.now() - lastActivityTime > 10000 && document.visibilityState === 'visible') {
console.log('Страница может быть скрыта наложением или неактивна.');
}
}, 5000);
3. Изменения CSS и события изменения размеров
Некоторые наложения могут вызывать изменения в области просмотра или макете страницы. Отслеживайте события resize и наблюдайте за необычными изменениями.
window.addEventListener('resize', () => {
console.log('Область просмотра или макет могли измениться.');
// Дополнительная логика для обнаружения наложений
});
4. Использование requestAnimationFrame (для анализа производительности)
Можно измерять частоту кадров или отзывчивость анимаций. Значительное падение частоты кадров может указывать на наложение, влияющее на рендеринг.
let lastFrameTime = Date.now();
const detectOverlay = () => {
const now = Date.now();
if (now - lastFrameTime > 500) { // Обнаружение задержек кадров
console.log('Возможно, обнаружено наложение (низкая отзывчивость).');
}
lastFrameTime = now;
requestAnimationFrame(detectOverlay);
};
detectOverlay();
Комбинирование подходов
Для большей надежности объедините несколько сигналов, таких как: - Отсутствие взаимодействия с пользователем - События blur - Падение частоты кадров - Отсутствие значительных обновлений контента
Ограничения
- Нет полной гарантии: Эти методы дают лишь косвенные признаки, но не являются абсолютно точными из-за разнообразия наложений на устройствах и браузерах.
- Системные наложения: Некоторые наложения полностью находятся вне контроля браузера и не могут быть обнаружены программно.
Если эти методы не полностью соответствуют вашим потребностям, можно рассмотреть возможность подачи запроса на улучшение браузеров, чтобы расширить возможности visibilityState для таких случаев.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.