如何使用JavaScript检测空闲的浏览器选项卡

在某些情况下,当用户与我们的最终产品或应用程序进行交互时,我们发现自己会执行许多密集的,占用大量CPU的任务。启动轮询器,建立WebSocket连接,甚至加载视频或图片等媒体,都有可能成为性能障碍,尤其是当这些任务在不需要的情况下消耗资源的时候。

在用户没有主动与界面交互的同时,从不必要的工作负载或网络请求中释放主线程是一个非常好的和有意义的实践。换一种方式,在大多数主机提供商都在引入基于配额的定价模式的行业中,减少网络请求也可以降低运行应用程序或服务的成本。

页面可见性(Page Visibility) API

所有现代的网页浏览器都加入了页面可见性API,它允许我们检测浏览器的标签页何时被隐藏,此外,我们还可以注册一个事件监听器,以检测可见性变化时的信号。

document.visibilityState

当页面处于前台时,document.visibilityState 可能是 visible ,最小化窗口的“标签”或隐藏。

我们可以通过以下方式直接访问 document.visibilityState:

console.log(document.visibilityState);
// => 它可以是“visible”或“hidden” 

visibilitychange Event

我们还可以使用事件侦听器轻松检测可见性属性中的更改。

const onVisibilityChange = () => {
 if (document.visibilityState === 'hidden') {
  console.log('> 这个窗口是隐藏的.');
 } else {
  console.log('> 这个窗口是可见的.');
 }
};
document.addEventListener('visibilitychange', onVisibilityChange, false); 

轮询示例

考虑一种情况,在这种情况下,我们正在轮询API以获取更新,并且希望避免对空闲用户进行不必要的调用。一个简化的示例如下所示:

const poll = () => {
 const interval = 1500;
 let _poller = null;
 const repeat = () => {
  console.log(`~ Polling: ${Date.now()}.`);
 }; 

 return {
  start: () => {
   _poller = setInterval(repeat, interval);
  },
  stop: () => {
   console.log('~ Poller stopped.');
   clearInterval(_poller);
  }
 };
}; 

const poller = poll();
poller.start(); 

const onVisibilityChange = () => {
 if (document.visibilityState === 'hidden') {
  poller.stop();
 } else {
  poller.start();
 }
}; 

document.addEventListener('visibilitychange', onVisibilityChange, false); 

在后台异步加载

但有时我们可以通过反其道而行之,加速用户的终端体验。我们可以异步加载外部依赖或资产,而不是取消所有的作业和请求。这样,当用户回来时,他们的最终体验将更加“充实”并且丰富。

/ Webpack /

使用ES2015动态导入建议和适当的Webpack配置清单,我们可以轻松地在后台加载额外的模块或资产。

let loaded = false;
const onVisibilityChange = () => {
 if (document.visibilityState === 'hidden') {
  // Aggresively preload external assets ans scripts
  if (loaded) {
   return;
  }
  Promise.all([
   import('./async.js'),
   import('./another-async.js'),
   import(/* webpackChunkName: "bar-module" */ 'modules/bar'),
   import(/* webpackPrefetch: 0 */ 'assets/images/foo.jpg')
  ]).then(() => {
   loaded = true;
  });
 }
}; 

document.addEventListener('visibilitychange', onVisibilityChange, false);

/ Rollup /

Rollup还支持开箱即用的动态导入。

let loaded = false;
const onVisibilityChange = () => {
 if (document.visibilityState === 'hidden') {
  // Aggresively preload external assets ans scripts
  if (loaded) {
   return;
  }
  Promise.all([
   import('./modules.js').then(({default: DefaultExport, NamedExport}) => {
    // do something with modules.
   })
  ]).then(() => {
   loaded = true;
  });
 }
}; 

document.addEventListener('visibilitychange', onVisibilityChange, false); 

/ 用Javascript预加载 /

除了使用捆绑器,我们还可以仅使用几行JavaScript来预加载静态资源(例如图像)。

let loaded = false;
const preloadImgs = (...imgs) => {
 const images = [];
 imgs.map(
  url =>
   new Promise((resolve, reject) => {
    images[i] = new Image();
    images[i].src = url;
    img.onload = () => resolve();
    img.onerror = () => reject();
   })
 );
};
const onVisibilityChange = () => {
 if (document.visibilityState === 'hidden') {
  // Aggresively preload external assets ans scripts
  if (loaded) {
   return;
  }
  Promise.all(
   preloadImgs(
    'https://example.com/foo.jpg',
    'https://example.com/qux.jpg',
    'https://example.com/bar.jpg'
   )
  )
   .then(() => {
    loaded = true;
   })
   .catch(() => {
    console.log('> Snap.');
   });
 }
};
document.addEventListener('visibilitychange', onVisibilityChange, false); 

微互动

最后,一种吸引用户注意力的巧妙方法是动态更改图标,只需使用几个像素就可以保持交互。

const onVisibilityChange = () => {
 const favicon = document.querySelector('[rel="shortcut icon"]');
 if (document.visibilityState === 'hidden') {
  favicon.href = '/come-back.png';
 } else {
  favicon.href = '/example.png';
 }
}; 

document.addEventListener('visibilitychange', onVisibilityChange, false); 

总结

到此这篇关于如何使用JavaScript检测空闲的浏览器选项卡的文章就介绍到这了,更多相关js浏览器选项卡内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript浏览器选项卡效果

    有图如下: 代码如下: 复制代码 代码如下: /* head html : <span></span> body html : <iframe></iframe> */ var Tab = function(id,title,url,isClose){ this.id = id; this.title = title; this.url = url; this.head = jQuery('<span class="tab-head"

  • AngularJS标签页tab选项卡切换功能经典实例详解

    本文实例讲述了AngularJS实现标签页tab选项卡功能.分享给大家供大家参考,具体如下: 选项卡一: JavaScript+html+css <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>www.jb51.net js标签页tab切换</title> <style> #div1 .active{ background:blue

  • js实现简单选项卡功能

    本文为大家分享了js实现简单选项卡功能的具体代码,供大家参考,具体内容如下 首先我们来写HTML代码,构建出整体结构 代码如下: <!--导航栏部分HTML代码--> <nav id="nav"> <ul> <li class="act">选卡1</li> <li>选卡2</li> <li>选卡3</li> <li>选卡4</li> &

  • 跨浏览器通用、可重用的选项卡tab切换js代码

    由于近来学了点js,于是我装逼道...不太难吧...就切一下display属性?同学无视我..说要搞个通用的...什么还要跟ajax交互..???我愣是没有听懂...到底要搞什么...权当作练手,我自己胡弄了一个. 需求:同学口中的通用我不知道神马意思...那我就按自己的理解吧.. ①跨浏览器,IE6+,FF,Chrome,Safari,Opera ②同一个页面可以用同一个js设置不同的选项卡. 说太多没啥米用,来看代码吧. 一.html部分(其实这还没啥好看的,设置了三个,前两个是一样的,通过

  • js实现Tab选项卡切换效果

    本文实例为大家分享了js实现Tab选项卡切换效果展示的具体代码,供大家参考,具体内容如下 html部分 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="tab.css"> <script src="tab.js&quo

  • vuejs实现标签选项卡动态更改css样式的方法

    html <ul class="header-list"> <li v-cloak v-for="(item,index) in headerList" v-on:click="selectMainTheme(index)"><a href="java:;" rel="external nofollow" :class="{'active':idx == index}

  • 如何使用JavaScript检测空闲的浏览器选项卡

    在某些情况下,当用户与我们的最终产品或应用程序进行交互时,我们发现自己会执行许多密集的,占用大量CPU的任务.启动轮询器,建立WebSocket连接,甚至加载视频或图片等媒体,都有可能成为性能障碍,尤其是当这些任务在不需要的情况下消耗资源的时候. 在用户没有主动与界面交互的同时,从不必要的工作负载或网络请求中释放主线程是一个非常好的和有意义的实践.换一种方式,在大多数主机提供商都在引入基于配额的定价模式的行业中,减少网络请求也可以降低运行应用程序或服务的成本. 页面可见性(Page Visibi

  • JavaScript检测浏览器cookie是否已经启动的方法

    本文实例讲述了JavaScript检测浏览器cookie是否已经启动的方法.分享给大家供大家参考.具体分析如下: JavaScript检测浏览器cookie是否已经启动,代码稍显复杂,通过写入一个测试cookie判断cookie是否已经启动 var dt = new Date(); dt.setSeconds(dt.getSeconds() + 60); document.cookie = "cookietest=1; expires=" + dt.toGMTString(); var

  • JavaScript检测浏览器是否支持CSS变量代码实例

    JavaScript可以同样式进行交互,你可以通过编写程序来动态改变文档上元素的样式. 有三种方法可以实现这样的效果: 控制样式表-可以添加.删除.修改样式表. 控制样式规则-可以添加.删除.修改样式规则. 控制DOM中的单个元素-可以不依赖样式表来修改元素样式. JavaScript 检测浏览器是否支持 CSS 变量: const isSupported = window.CSS && window.CSS.supports && window.CSS.supports(

  • 如何用JavaScript检测当前浏览器是无头浏览器

    什么是无头浏览器(headless browser)? 无头浏览器是指可以在图形界面情况下运行的浏览器.我可以通过编程来控制无头浏览器自动执行各种任务,比如做测试,给网页截屏等. 为什么叫"无头"浏览器? "无头"这个词来源于最初的"无头计算机(Headless computer)".维基百科关于的"无头计算机"词条: 无头系统(headless system)是指已配置为无须显示器(即"头").键盘和鼠标

  • JavaScript检测上传文件大小的方法

    本文实例讲述了JavaScript检测上传文件大小的方法.分享给大家供大家参考.具体如下: 通过JS客户端代码限制用户上传文件的大小,但是客户端的验证只是辅助的,服务器端一定还要再做验证 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http

  • JavaScript检测原始值、引用值、属性

    在 JavaScript 中,我们常常会看到这样的代码:变量与 null 的比较(这种用法很有问题),用来判断变量是否被赋予了一个合理的值.比如: var Controller = { process: function(items) { if (items !== null) { // 不好的写法 items.sort(); items.forEach(function(item) { // 执行一些逻辑 }); } } } 在这段代码中, process() 方法显然希望 items 是一个

  • JavaScript检测是否开启了控制台(F12调试工具)

    js检测用户是否打开调试工具(chrome) (function(){ var re=/x/; var i=0; console.log(re); re.toString=function(){ window.close(); return '第'+(++i)+'次打开控制台'; } })(); JavaScript检测是否开启了控制台(调试工具) 测试后在chrome有效 不少人防止别人趴源码,一般采用检测按键F12之类的,但是这些基本没什么用 现在介绍一个方法,非常管用,可以检测到你是否开启

  • JavaScript中防止微信浏览器被整体拖动的方法

    在微信网页开发中,我使用的页面结构是在body下的container覆盖全屏,container下有个header和page的容器,page负责显示所有内容并实现滚动. 结构如图: 但是遇到了一个问题:在页面已经滚动到顶部时,继续往下拖动page容器,会将微信浏览器整体往下拖,漏出"该网页由XXX提供"的提示,然后在安卓下,影响并不大,但是在iphone下,就没那么简单了,经过测试,在苹果下,往下拖动后快速滑动页面中的page,page并不会滚动,上拖同样遇到了这个问题,非常影响体验.

  • javascript学习随笔(编写浏览器脚本 Navigator Scripting )

    在 HTML 中使用JavaScript JavaScript能以两种方式嵌入HTML: 作为语句和函数使用时,用 SCRIPT 标记 作为事件处理程序使用时,用 HTML 标记 SCRIPT 标记 使用SCRIPT标记把脚本嵌入在HTML中,格式如舷: <SCRIPT> _ JavaScript 语句</SCRIPT> LANGUAGE属性作为可选项,用于指定脚本语言,用法如下: <SCRIPT LANGUAGE="JavaScript"> _Ja

  • JavaScript检测弹出窗口是否已经关闭的方法

    本文实例讲述了JavaScript检测弹出窗口是否已经关闭的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: var win = window.open('foo.html','windowName',"width=200,height=200,scrollbars=no"); var timer = setInterval(function() {       if(win.closed) {          clearInterval(timer);     

随机推荐