Подтвердить что ты не робот

Запуск setTimeout только при активной вкладке

Есть ли способ остановить setTimeout("myfunction()",10000); от подсчета, когда страница не активна. Например,

  • Пользователь приходит к "некоторой странице" и остается там в течение 2000 мс
  • Пользователь переходит на другую вкладку, открывая "какую-то страницу".
  • myfunction() не срабатывает, пока они не вернутся на другие 8000 мс.
4b9b3361

Ответ 1

(function() {
  var time = 10000,
      delta = 100,
      tid;

  tid = setInterval(function() {
    if ( document.hidden ) { return; }    
    time -= delta;
    if ( time <= 0 ) {
      clearInterval(tid);
      myFunction(); // time passed - do your work
    }        
  }, delta);
})();

Демонстрационная версия: https://jsbin.com/xaxodaw/quiet


Changelog:

  • 9 июня 2019 года. Я перешел на использование document.hidden чтобы определить, когда страница не видна.

Ответ 2

Отличный ответ от Šime Vidas, это помогло мне с моей собственной кодировкой. Для полноты я сделал пример, если вы хотите использовать setTimeout вместо setInterval:

(function() {

    function myFunction() {
        if(window.blurred) {
            setTimeout(myFunction, 100);
            return;
        }

        // What you normally want to happen

        setTimeout(myFunction, 10000);
    };
    setTimeout(myFunction, 10000);

    window.onblur = function() {window.blurred = true;};
    window.onfocus = function() {window.blurred = false;};

})();

Вы увидите, что проверка размытого окна имеет более короткое время, чем обычно, поэтому вы можете установить это в зависимости от того, как скоро вам потребуется, чтобы остальная часть функции запускалась, когда окно восстанавливает фокус.

Ответ 3

Вы можете сделать что-то вроде:

$([window, document]).blur(function(){
        // Clear timeout here
}).focus(function(){
        // start timeout back up here
});

Окно для IE, документ для остальной части мира браузера.

Ответ 4

Что вам нужно сделать, так это настроить механизм для установки таймаутов с небольшими интервалами, отслеживая общее время прошедшего времени. Вы также будете отслеживать "mouseenter" и "mouseleave" на всей странице (<body> или что-то еще). Когда истекают кратковременные таймауты, они могут проверять состояние окна (в или из) и не перезапускать процесс, когда окно не находится в фокусе. Обработчик "mouseenter" запускает все приостановленные таймеры.

edit — @Šime Vidas опубликовал отличный пример.

Ответ 5

Я использую почти тот же подход, что и Шиме Видас, в моем слайдере, но мой код основан на document.visibilityState для проверки видимости страницы:

var interval = 4000;

function slideshow() {
  // slideshow code
};

$(document).ready(function() {

var switchInterval;

function intervalHandler() {
  switchInterval = setInterval(function() {
    if (document.visibilityState === "visible") {
      slideshow();
    } else {
      return;
    }
  }, interval);
}

intervalHandler();

});