博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS 监听浏览器各个标签间的切换
阅读量:6777 次
发布时间:2019-06-26

本文共 2657 字,大约阅读时间需要 8 分钟。

以前看到过一些网页,在标签切换到其它地址时,网页上的标题上会发生变化,一直不知道这个是怎么做的,最近查了一些资料才发现有一个 visibilitychange 事件就可以搞定,这里将介绍一下页面可见性(Page Visibility)API的简单应用。

 

visibilitychange事件介绍

简单的说,当用户最小化网页或移动到另一个标签时,API会发送 visibilitychange 有关该网页的可见性的事件。你可以检测到该事件并执行一些操作或行为。例如:标签页隐藏的时候停止播放音乐视频、停止一些不必要的轮询,还有停止一些诸如轮播等循环动画效果等等。这些可以节省服务器和本地的开销。

用例

  • 网站有一个图片轮播,不应前进到下一张幻灯片,除非用户正在查看该页面。

  • 显示信息仪表板的应用程序不希望在页面不可见时轮询服务器以进行更新。

  • 网页要检测其是否正在进行预渲染,以便其可以准确计算网页浏览量。

以前开发人员往往在客串上注册 onblur onfocus 来检测页面是不是活动页面,但它不会告诉您页面对用户是隐藏的。Page Visibility API 解决了这个问题。

浏览器兼容性

这个事件已经得到现代浏览器广泛的支持,不过一些老版本的浏览器需要加相应的前缀。

Chrome (Webkit) Firefox (Gecko) Internet Explorer Opera Safari (WebKit)

13前缀webkit 

33无需前缀  

10前缀moz

18无需前缀

10前缀ms 12.10 7

 

document的可见性属性

Page Visibility (Second Edition) 中定义了2个只读的 document 属性:hidden 和 visibilityState

其中 document.hidden 是一个布尔值,简单的表示标签页显示或者隐藏。而 document.visibilityState 属性更为详细,目前有四个可能的值:

visible : 页面内容至少部分可见。这意味着在实际情况中,该网页是一个非最小化窗口的可见标签页。

hidden : 页面内容是对用户不可见。实际上,这意味着该文档是后台标签页或最小化窗口的一部分,或者系统锁屏是时的状态。

prerender : 网页内容被预渲染并且用户不可见。

unloaded : 如果文档被卸载,那么这个值将被返回。

一般情况下我们使用 document.hidden 就能满足通常的需求。

为了支持老版本的浏览器,我们需要对 document.hidden 在做一些前缀处理:

 

function getHiddenProp(){    var prefixes = ['webkit','moz','ms','o'];        // if 'hidden' is natively supported just return it    if ('hidden' in document) return 'hidden';        // otherwise loop over all the known prefixes until we find one    for (var i = 0; i < prefixes.length; i++)    {        if ((prefixes[i] + 'Hidden') in document)             return prefixes[i] + 'Hidden';    }     // otherwise it's not supported    return null;}

 

 同样的,我们可以获取 document.visibilityState 属性:
 
function getVisibilityState() {    var prefixes = ['webkit', 'moz', 'ms', 'o'];    if ('visibilityState' in document) return 'visibilityState';    for (var i = 0; i < prefixes.length; i++)     {        if ((prefixes[i] + 'VisibilityState') in document)            return prefixes[i] + 'VisibilityState';    }    // otherwise it's not supported    return null;}

 

这样我们可以写一个跨浏览器的函数,检查文档是否可见。

 
function isHidden() {    var prop = getHiddenProp();    if (!prop) return false;        return document[prop];}

 

visibilitychange监听事件

你可以在 document对象上注册一个监听 visibilitychange 事件,根据 document.hidden 或者 document.visibilityState 属性做一些业务逻辑:

 
// use the property name to generate the prefixed event namevar visProp = getHiddenProp();if (visProp) {    var evtname = visProp.replace(/[H|h]idden/, '') + 'visibilitychange';    document.addEventListener(evtname, function ()     {        document.title = document[getVisibilityState()]+"状态";    }, false);}

 

上面的代码会在页面可见性发生变化时修改 document.title 的值。

 

http://www.yduba.com/qianduan-1491588986.html 

转载于:https://www.cnblogs.com/fangsmile/p/8296348.html

你可能感兴趣的文章
【远程用户建立】
查看>>
各种编程语言下字符串分割及foreach遍历对比
查看>>
MySQL常用操作基本操作
查看>>
秒开缓存服务器详细介绍
查看>>
WebGoat题目解答(General~XSS)
查看>>
网页页面 自动刷新的3种代码
查看>>
Android 实现推送功能
查看>>
【framework】spring3-mvc-开篇
查看>>
网络基础
查看>>
Eclipse智能提示及快捷键
查看>>
数据驱动安全架构升级---“花瓶”模型迎来V5.0(一)
查看>>
Linux安装nginx
查看>>
把字符串转换成整数
查看>>
产品入库与倒冲领料不匹配查询
查看>>
我的友情链接
查看>>
一次真实的比特币敲诈***经历
查看>>
Java Mail 发送邮件 接收邮件
查看>>
Cisco 交换机3750密码破解(二)
查看>>
centos 6.3 bind
查看>>
我的友情链接
查看>>