我有JavaScript,它定期进行活动.当用户没有查看站点时(即窗口或选项卡没有焦点),最好不要运行.

有没有办法使用JavaScript来做到这一点呢?

我的参考点是:如果你正在使用的窗口处于非活动状态,Gmail聊天就会播放声音.

推荐答案

自从最初写下这个答案以来,多亏了W3C,一个新的规范已经达到了recommendation个状态. Page Visibility API(在MDN上)现在允许我们更准确地检测用户何时隐藏页面.

document.addEventListener("visibilitychange", onchange);

当前浏览器支持:

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

在不兼容的浏览器中,以下代码采用了不太可靠的模糊/聚焦方法:

(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"});
})();

onfocusinonfocusoutrequired for IE 9 and lower,而所有其他的都使用onfocusonblur,除了iOS,iOS使用onpageshowonpagehide.

Javascript相关问答推荐

在JavaScript中逐一播放随机生成的音频文件数组

将数据从strapi提取到next.js,但响应延迟API URL

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

如何分配类型脚本中具有不同/额外参数的函数类型

模块与独立组件

Google图表时间轴—更改hAxis文本 colored颜色

当Redux提供程序访问Reduxstore 时,可以安全地从Redux提供程序外部调用钩子?

使用POST请求时,Req.Body为空

确保函数签名中的类型安全:匹配值

如何使用TypeScrip设置唯一属性?

如何在箭头函数中引入or子句?

如何在JAVASCRIPT中临时删除eventListener?

OpenAI转录API错误请求

有效路径同时显示有效路径组件和不存在的路径组件

在表单集中保存更改时删除';禁用';

在D3条形图中对具有相同X值的多条记录进行分组

如何为仅有数据可用的点显示X轴标签?

输入的值的类型脚本array.排序()

Reaction useState和useLoaderData的组合使用引发无限循环错误