`

【转】用 visibilitychange 事件判断页面可见性

 
阅读更多

visibilitychange事件介绍

简单的说,浏览器标签页被隐藏或显示的时候会触发visibilitychange事件。

这个事件可以满足一些用户需求,比如标签页隐藏的时候停止播放音乐视频、停止一些不必要的轮询,还有停止一些诸如轮播等循环动画效果等等。这些可以节省服务器和本地的开销。

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

Chrome (Webkit) Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
13前缀webkit
33无需前缀
10前缀moz
18无需前缀
10前缀ms 12.10 最新的测试已经支持

注:Opera 12.10浏览器在最小化时不触发visibilitychange事件,也不将hidden属性设置为true.

document的可见性属性

Page Visibility (Second Edition)中定义了2个只读的document属性:hiddenvisibilityState。

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

  • visible : 页面内容至少部分可见。这意味着在实际情况中,该网页是一个非最小化窗口的可见标签页。
  • hidden : 页面内容是对用户不可见。实际上,这意味着该文档是后台标签页或最小化窗口的一部分,或者系统锁屏是时的状态。
  • prerender : 网页内容被预渲染并且用户不可见。
  • unloaded : 如果文档被卸载,那么这个值将被返回。

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

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

js 代码:
  1. function getHiddenProp(){
  2. var prefixes =['webkit','moz','ms','o'];
  3. // if 'hidden' is natively supported just return it
  4. if('hidden' in document)return'hidden';
  5. // otherwise loop over all the known prefixes until we find one
  6. for(var i =0; i < prefixes.length; i++){
  7. if((prefixes[i]+'Hidden') in document)
  8. return prefixes[i]+'Hidden';
  9. }
  10.  
  11. // otherwise it's not supported
  12. returnnull;
  13. }

同样的,我们可以获取document.visibilityState属性:

js 代码:
  1. function getVisibilityState(){
  2. var prefixes =['webkit','moz','ms','o'];
  3. if('visibilityState' in document)return'visibilityState';
  4. for(var i =0; i < prefixes.length; i++){
  5. if((prefixes[i]+'VisibilityState') in document)
  6. return prefixes[i]+'VisibilityState';
  7. }
  8. // otherwise it's not supported
  9. returnnull;
  10. }

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

js 代码:
  1. function isHidden(){
  2. var prop = getHiddenProp();
  3. if(!prop)returnfalse;
  4. return document[prop];
  5. }

visibilitychange监听事件

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

js 代码:
  1. // use the property name to generate the prefixed event name
  2. var visProp = getHiddenProp();
  3. if(visProp){
  4. var evtname = visProp.replace(/[H|h]idden/,'')+'visibilitychange';
  5. document.addEventListener(evtname,function(){
  6. document.title = document[getVisibilityState()]+"状态";
  7. },false);
  8. }

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

demo:http://www.css88.com/demo/visibilitychange-event/

参考阅读:

https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API

http://www.html5rocks.com/en/tutorials/pagevisibility/intro/?redirect_from_locale=zh

分享到:
评论

相关推荐

    HTML5中判断用户是否正在浏览页面的方法

    现在,HTML5里页面可见性接口就提供给了程序员一个方法,让他们使用visibilitychange页面事件来判断当前页面可见性的状态,并针对性的执行某些任务。同时还有新的document.hidden属性可以使用。 document.hidden 这...

    jquery.pagevisibility:浏览器之间的页面可见性标准化

    该插件规范了页面可见性 API 的前缀名称,以便您可以简单地使用带有 jQ​​uery 的无前缀的“visibilitychange”事件并使用无前缀的 document.hidden 和 document.visibilityState 属性。 在不支持页面可见性 API ...

    PostgreSQL 行可见性验证

    在PostgreSQL中,行可见性验证会涉及对事务ID的比较,以判断数据行是否被创建或修改于当前事务开始之前,并且是否被删除。具体来说,如果数据行的t_xmin(创建事务ID)是在当前事务开始之前,并且t_xmax(删除事务ID...

    vulkan 可见性剔除算法

    GPU Occlusion Culling 使用专门的硬件单元,如Occlusion Query,来判断一个物体是否可见。在Vulkan中,这通常通过创建查询池、开始和结束查询、以及在渲染完成后解析查询结果来实现。 2. **多级剔除**:为了优化...

    JQ 可见性过滤选择器

    总结来说,jQuery的可见性过滤选择器`:visible`和`:hidden`是开发者处理页面元素显示状态的强大工具。它们可以帮助我们更高效地定位和操作DOM中的元素,提升用户体验,尤其在处理动态内容和用户交互时。理解并熟练...

    jquery可见性过滤选择器使用示例

    例如,如果你想要获取当前页面上所有可见的段落,你可以使用以下代码: ```javascript $("p:visible").each(function() { console.log($(this).text()); }); ``` `:hidden` 选择器: 相反,`:hidden` 选择器则...

    silverlight实例:图层可见性控制

    在本文中,我们将深入探讨Silverlight中的图层可见性控制技术。Silverlight是微软开发的一个强大的Web应用程序框架,它允许开发者创建丰富的、交互式的多媒体内容。在这个实例中,我们将学习如何利用Silverlight来...

    增长的需求可见性对生产和库存控制效率的影响

    标题中的“增长的需求可见性对生产和库存控制效率的影响”是一个重要的管理学概念,尤其是在现代商业环境中,企业需要更好地理解和预测市场需求以优化生产计划和库存管理。需求可见性是指企业能够准确、实时地了解...

    蓝牙Demo(设置蓝牙可见性 扫描周围蓝牙)

    然而,在应用程序开发中,我们可以使用BluetoothAdapter类的setDiscoverable方法来改变设备的可见性。这个方法需要一个参数,即设备可见的时间限制(以秒为单位),默认值是120秒。请注意,频繁调用此方法可能需要...

    14、深入理解并发可见性、有序性、原子性与JMM内存模型

    深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...

    vue-lazy-container:检测页面中元素的可见性

    Vue懒惰的容器 English |介绍vue惰性容器,通过检测页面中元素的可见性,决定是否加载资源并进行渲染。为什么当页面内容超过一个屏幕时,我们通常只希望加载和呈现当前屏幕的数据。随着页面的滚动,加载并呈现以下...

    前端项目-visibly.js.zip

    3. **事件处理**:`visibly.js` 会自动处理`visibilitychange`事件,确保在任何浏览器下,当页面可见性状态改变时,开发者注册的回调函数都能得到正确的调用。 4. **性能优化**:通过利用页面可见性API,开发者可以...

    Java可见性学习

    java语言中可见性方面的描述。对初学者有一定的帮助!

    Detecting-Idle-Browser-Tabs:使用基于浏览器JavaScript页面可见性来暂停视频播放

    除了基本的页面可见性检测,项目可能还涉及其他高级功能,如设置一定的闲置时间阈值,在用户一段时间未交互后自动暂停视频,或者结合其他用户交互事件(如鼠标移动、键盘按键)来更准确地判断用户是否在关注页面。...

    多视纹理映射中无需设定偏差的快速可见性检测.docx

    传统的Z缓冲区算法和光线追踪算法虽然常用,但它们的精度受到人为设定的偏差影响,可能导致可见性和遮挡判断不准确。针对这一问题,文章提出了一个无需设定偏差的快速可见性检测方案。 首先,该方案利用倾斜摄影的...

    倒计时demo.7z

    在本项目"倒计时demo.7z"中,我们主要探讨的是如何在HTML5(H5)页面上实现多处倒计时功能,并利用页面可见性API('visibilitychange'事件)进行智能管理,确保当用户切换页面或浏览器标签时,倒计时能正确暂停与...

Global site tag (gtag.js) - Google Analytics