Is there a way to detect if a browser window is not currently active?

Is there a way to detect if a browser window is not currently active?

I have JavaScript that is doing activity periodically. When the user is not looking at the site (i.e., the window or tab does not have focus), it'd be nice to not run.

Is there a way to do this using JavaScript?

My reference point: Gmail Chat plays a sound if the window you're using isn't active.

 

评论1

For those who are not satisfied with the answers below, check out the requestAnimationFrame API, or use the modern feature that the frequency of setTimeout/setInterval is reduced when the window is not visible (1 sec in Chrome, for example).
– Rob W
Feb 10 '13 at 17:05
 
 
评论2
 
80% of the answers below are not answers to this question. The question asks about not currently active but tons of answer below are about not visible which is not an answer to this question. They should arguably be flagged as "not an answer"
– gman
Aug 31 '18 at 7:19
 
 
回答1

Since originally writing this answer, a new specification has reached recommendation status thanks to the W3C. The Page Visibility API (on MDN) now allows us to more accurately detect when a page is hidden to the user.

document.addEventListener("visibilitychange", onchange);

Current browser support:

  • Chrome 13+
  • Internet Explorer 10+
  • Firefox 10+
  • Opera 12.10+ [read notes]

The following code falls back to the less reliable blur/focus method in incompatible browsers:

(function() {
  var hidden = "hidden";

  // Standards:
  if (hidden in document)
    document.addEventListener("visibilitychange", onchange);
  else if ((hidden = "mozHidden") in document)
    document.addEventListener("mozvisibilitychange", onchange);
  else if ((hidden = "webkitHidden") in document)
    document.addEventListener("webkitvisibilitychange", onchange);
  else if ((hidden = "msHidden") in document)
    document.addEventListener("msvisibilitychange", onchange);
  // IE 9 and lower:
  else if ("onfocusin" in document)
    document.onfocusin = document.onfocusout = onchange;
  // All others:
  else
    window.onpageshow = window.onpagehide
    = window.onfocus = window.onblur = onchange;

  function onchange (evt) {
    var v = "visible", h = "hidden",
        evtMap = {
          focus:v, focusin:v, pageshow:v, blur:h, focusout:h, pagehide:h
        };

    evt = evt || window.event;
    if (evt.type in evtMap)
      document.body.className = evtMap[evt.type];
    else
      document.body.className = this[hidden] ? "hidden" : "visible";
  }

  // set the initial state (but only if browser supports the Page Visibility API)
  if( document[hidden] !== undefined )
    onchange({type: document[hidden] ? "blur" : "focus"});
})();

onfocusin and onfocusout are required for IE 9 and lower, while all others make use of onfocus and onblur, except for iOS, which uses onpageshow and onpagehide.

 

评论1

@AndyE I tried this solution on chromium. It works if I change tabs, but it doesn't if I change windows (ALT+tab). Should it? Here's a fiddle - jsfiddle.net/8a9N6/17 Sep 16 '13 at 21:25
 
评论2
@AndyE Your solution seems to only work if the user changes tabs, or minimizes/maximizes the window. However, the onchange event is not triggered if the user leaves the tab active, but maximizes another program over it from the taskbar. Is there a solution for that scenario? Thanks! Nov 4 '14 at 18:43
 

 

回答2

I would use jQuery because then all you have to do is this:

$(window).blur(function(){
  //your code here
});
$(window).focus(function(){
  //your code
});

Or at least it worked for me.

 评论 

This no longer works for current versions of modern browsers, see the approved answer (Page Visibility API)
– Jon z
Feb 25 '14 at 17:10
 
 
 
 

JS监听浏览器TAB被激活或者被离开

监听窗口被离开或者被选中可以使用以下方法来实现

document.addEventListener('visibilitychange', function () {
    // 用户息屏、或者切到后台运行 (离开页面)
    if (document.visibilityState === 'hidden') {
        console.log('hidden')
    }
    // 用户打开或回到页面
    if (document.visibilityState === 'visible') {
        console.log('页面可见')
    }
})
 
 
 

 

 

作者:Chuck Lu    GitHub    
posted @   ChuckLu  阅读(43)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2019-09-23 Access the value of a member expression
2019-09-23 Publish site through visual studio
2016-09-23 sqlite中的自增主键
2016-09-23 How to: Update an .edmx File when the Database Changes
2015-09-23 IPAddress
点击右上角即可分享
微信分享提示