Приостановка setInterval, когда страница / браузер не в фокусе
У меня есть простое слайд-шоу, которое я сделал на главной странице клиента, используя setInterval для времени вращения.
чтобы браузеры не испортили setInterval, когда страница не находится в фокусе (просматривается другая вкладка или другая программа), я использую:
function onBlur() {
clearInterval(play);
};
function onFocus() {
mySlideRotateFunction();
};
if (/*@cc_on!@*/false) {
document.onfocusin = onFocus;
document.onfocusout = onBlur;
} else {
window.onfocus = onFocus;
window.onblur = onBlur;
}
где mySlideRotateFunction устанавливает setInterval и запускает некоторый jQuery. Хотя это работает большую часть времени, я нахожу, что иногда кажется, что onBlur не работает, и когда я вернитесь на страницу, тайминги "построили", и вращения сходят с ума.
Я не могу определить причину, почему это происходит иногда, а не на других.
мой вопрос - есть ли проблема с моим кодом, и у кого-нибудь есть лучшее предложение для "приостановки" setInterval, когда окно браузера не в фокусе?
спасибо
2 ответов
попробуйте что-то вроде этого:
var myInterval;
var interval_delay = 500;
var is_interval_running = false; //Optional
$(document).ready(function () {
$(window).focus(function () {
clearInterval(myInterval); // Clearing interval if for some reason it has not been cleared yet
if (!is_interval_running) //Optional
myInterval = setInterval(interval_function, interval_delay);
}).blur(function () {
clearInterval(myInterval); // Clearing interval on window blur
is_interval_running = false; //Optional
});
});
interval_function = function () {
is_interval_running = true; //Optional
// Code running while window is in focus
}
некоторые тесты, выполненные в IE9 и FF6
сразу внутри setInterval
, установите проверку, чтобы увидеть, если документ сфокусирован. Интервал будет продолжать работать как обычно, но код внутри будет выполняться только в том случае, если документ сфокусирован. Если окна размыто, а потом переориентировали, интервал будет иметь продолжение учета времени, но document.hasFocus()
был false
в течение этого времени, так что нет необходимости для браузера, чтобы" догнать", выполнив блок кода кучу раз, когда фокус восстанавливается.
var timePerInterval = 7000;
$(document).ready(function() {
setInterval(function(){
if ( document.hasFocus() ) {
// code to be run every 7 seconds, but only when tab is focused
}
}, timePerInterval );
});