Приостановка 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 );
});