Комментарии 32
Да. Вот, кстати, оригинальный документ: Background tabs & offscreen frames: further plans
Это теперь музыка онлайн-радио или любых музыкальных сервисов будет сразу затыкаться если я переключусь на другую вкладку? О_0
Конечно, нет, "Ограничение также не распространяется на фоновые вкладки, в которых используется API для воспроизведения звука, WebSockets или WebRTC". Это уже реализовано во некоторых браузерах, вот и chrome с оптимизацией подтянулся (пока что кривовато).
… через WebWorker? Держать данные в воркере, держать логику переодических обновлений там же. С целевой страницы (когда она живая) делать запросы к воркеру о получении актуальных данных. Судя по caniuse, актуальные браузеры поддерживают воркеры, но не могу говорить нюансах, потому что работал с ними только в Хроме.
К сожалению коллбэки, которые передаются в системные API в Workers вынести нельзя. Потому что само API их будет вызывать. И API в фоновых вкладках тоже затормаживается, то есть, например, IndexedDB тоже работает медленнее.
Одних *Worker-ов недостаточно, чтобы решить проблему.
Да, в Safari и вдруг браузерах есть похожие оптимизации.
Гм, а я думал, почему всякие онлайн-банкинги так любят ссылки вида javascript:
, как следствие полную невозможность открыть новую вкладку, оказывается и это workaround, дабы не случилось что-то, а пользователь потом не удивлялся (читать: возмущался/подавал в суд/ваш вариант).
В подавляющем большинстве случаев, ссылка вида javascript:...
или #doAction
говорит о том, что над страницей работала команда специалистов, неподозревающих о существовании тега <button>
.
Подскажите (вопрос к автору), а при уходе с вкладки выполняется unload
? Возможно поможет Navigator.sendBeacon().
unload — нет. Но можно подписаться на visibilitychange. При этом я не уверен, будет ли он успевать выполняться.
Если будет дополнительная информация о тестировании этой фичи — поделитесь.
Сделал маленький тестик (index.html
):
<script>
document.addEventListener("visibilitychange", function() {
navigator.sendBeacon('http://0.0.0.0:8080/hello?s=' + document.visibilityState, '');
});
window.addEventListener("unload", function() {
navigator.sendBeacon('http://0.0.0.0:8080/hello?s=unload', '');
});
</script>
php -S 0.0.0.0:8080 -t ./
И смотрите какие запросы падают в консоль при разных действиях.
В хроме 56.0.2924 работает нормально, пока нет воможности потестировать в последнем, подскажите работает ли у вас?
Этот пример работает без проблем:
PHP 5.6.28 Development Server started at Thu Mar 23 14:00:24 2017
Listening on http://0.0.0.0:8080
Document root is /Users/dkaigorodov/phproot
Press Ctrl-C to quit.
[Thu Mar 23 14:00:38 2017] 127.0.0.1:61159 [200]: /
[Thu Mar 23 14:00:38 2017] 127.0.0.1:61161 [404]: /favicon.ico - No such file or directory
[Thu Mar 23 14:00:47 2017] 127.0.0.1:61182 [200]: /hello?s=hidden
[Thu Mar 23 14:00:49 2017] 127.0.0.1:61196 [200]: /hello?s=visible
[Thu Mar 23 14:00:50 2017] 127.0.0.1:61201 [200]: /hello?s=hidden
[Thu Mar 23 14:00:58 2017] 127.0.0.1:61234 [200]: /hello?s=visible
[Thu Mar 23 14:00:58 2017] 127.0.0.1:61235 [200]: /hello?s=hidden
[Thu Mar 23 14:00:59 2017] 127.0.0.1:61240 [200]: /hello?s=visible
[Thu Mar 23 14:01:02 2017] 127.0.0.1:61253 [200]: /hello?s=hidden
[Thu Mar 23 14:01:02 2017] 127.0.0.1:61254 [200]: /hello?s=unload
Непредсказуемые последствия оптимизации производительности Chrome