仅当选项卡处于活动状态时才运行setTimeout

Kyl*_*yle 19 javascript jquery

setTimeout("myfunction()",10000);当页面不活动时,有没有办法停止计数.例如,

  1. 用户到达"某个页面"并在那里停留2000ms
  2. 用户转到另一个选项卡,打开"某个页面".
  3. myfunction() 直到他们再回来8000ms才开火.

Šim*_*das 37

干得好:

(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);
})();
Run Code Online (Sandbox Code Playgroud)

现场演示: http ://jsfiddle.net/simevidas/J68dJ/3/show/


Pet*_*dIt 6

您可以执行以下操作:

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

窗口适用于 IE,文档适用于浏览器世界的其余部分。


Jas*_*ten 6

ŠimeVidas给出了很好的答案,它帮助我完成了自己的编码.为了完整起见,我举了一个例子,如果你想使用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;};

})();
Run Code Online (Sandbox Code Playgroud)

您将看到窗口模糊检查的时间设置比正常时间短,因此您可以根据窗口重新获得焦点时需要多长时间运行该功能来设置此值.