使用html5 visibility api检测页面活动状态

几年前,我们浏览网页的时候是没有选项卡浏览模式的,每一个网页都会是一个浏览器窗口,如果我没有记错,Win7之前我们都是这样浏览网页的。作为一个程序员,我们经常会同时打开10-15个网页,多的时候超过20个也不足为奇。

为什么要使用这个API?

早期我们没有办法确定哪些选项卡是活动状态的,但是现在通过HTML Visibility API,我们可以检测访客是否正在浏览我们的界面。

在这个教程中我们会介绍如何使用HTML5 Visibility API,同时我们也为你准备了一个简单的demo来查看页面的状态。在demo中,我们将会根据页面的状态来修改文档的标题。

查看页面的状态

随着这个API的出现,我们又迎来了两个新的document属性,他们分别是document.visibilityState和document.hidden。

document.visibilityState 有四个可选值:

  • hidden: 页面在任何屏幕上都没有被浏览。
  • prerender: 页面在选项卡中,但访客现在没有在这个选项卡上。
  • visible: 访客正在浏览。
  • unloaded: 页面已经被加载过了,现在跳转在其它界面上了。

document.hidden是一个布尔类型的属性。

现在我们可以根据页面状态来控制我们的网站了。

现在我们可以马上知道我们页面的availability属性了。但是首先我们要做的是监听这个事件,这样一来我们就可以做出相应的事情。我已经写好了一个简单的监听事件:

 
 
  1. document.addEventListener('visibilitychange', function(event) {
  2. if (!document.hidden) {
  3. // The page is visible.
  4. } else {
  5. // The page is hidden.
  6. }
  7. });

 这段代码非常简单,只是检测页面的状态。但是你必须清楚这两个属性和方法必须有固定的前缀。因为这个事件和属性有部分浏览器中是基于前缀的。现在我们来看一看上面这些代码的跨浏览器写法的前提:

  
  
  1. // Get Browser-Specifc Prefix
  2. function getBrowserPrefix() {
  3. // Check for the unprefixed property.
  4. if ('hidden' in document) {
  5. return null;
  6. }
  7. // All the possible prefixes.
  8. var browserPrefixes = ['moz', 'ms', 'o', 'webkit'];
  9. for (var i = 0; i < browserPrefixes.length; i++) {
  10. var prefix = browserPrefixes[i] + 'Hidden';
  11. if (prefix in document) {
  12. return browserPrefixes[i];
  13. }
  14. }
  15. // The API is not supported in browser.
  16. return null;
  17. }
  18. // Get Browser Specific Hidden Property
  19. function hiddenProperty(prefix) {
  20. if (prefix) {
  21. return prefix + 'Hidden';
  22. } else {
  23. return 'hidden';
  24. }
  25. }
  26. // Get Browser Specific Visibility State
  27. function visibilityState(prefix) {
  28. if (prefix) {
  29. return prefix + 'VisibilityState';
  30. } else {
  31. return 'visibilityState';
  32. }
  33. }
  34. // Get Browser Specific Event
  35. function visibilityEvent(prefix) {
  36. if (prefix) {
  37. return prefix + 'visibilitychange';
  38. } else {
  39. return 'visibilitychange';
  40. }
  41. }

 得到这些前缀之后,我们可以请求所有浏览器的前缀属性和事件,现在我们要做的是改变之前的代码:

  
  
  1. // Get Browser Prefix
  2. var prefix = getBrowserPrefix();
  3. var hidden = hiddenProperty(prefix);
  4. var visibilityState = visibilityState(prefix);
  5. var visibilityEvent = visibilityEvent(prefix);
  6. document.addEventListener(visibilityEvent, function(event) {
  7. if (!document[hidden]) {
  8. // The page is visible.
  9. } else {
  10. // The page is hidden.
  11. }
  12. });

我们可以在哪里使用这个API?

下面我举了几个我认为这个API比较适用的地方:

  1. 当页面属性是hidden的时候,我们可以禁止调用RSS API。
  2. 当页面状态是隐藏的时候,我们可以禁止运动的物体继续运动。
  3. 我们可以在页面状态是隐藏的时候在标题上显示一些通知。

我只是大概举了几个例子,有更好主意的可以在评论中告诉大家。下面我们使用这个API写一些实例。

例子

  • Demo 1: 这个例子在页面状态是隐藏的时候改变标题栏内容。查看 Demo
  • Demo 2: 这个例子演示在页面状态是隐藏的时候,计数量停止计数,可见后继续计数。

这Demo 2中,我们会详细向你介绍它的实现原理:

HTML代码

 
 
 
  1. <!-- This element will show updated count -->
  2. <h1 id="valueContainer">0</h1>

 

JavaScript代码

 
   
   
  1. <script type="text/javascript">
  2. // Get Browser Prefix
  3. var prefix = getBrowserPrefix();
  4. var hidden = hiddenProperty(prefix);
  5. var visibilityState = visibilityState(prefix);
  6. var visibilityEvent = visibilityEvent(prefix);
  7. var timer = null;
  8. function increaseVal() {
  9. var newVal = parseInt($('#valueContainer').text()) + parseInt(1);
  10. $('#valueContainer').text(newVal);
  11. document.title = newVal + ': Running';
  12. timer = setTimeout(function() {
  13. increaseVal();
  14. }, 1);
  15. }
  16. // Visibility Change
  17. document.addEventListener(visibilityEvent, function(event) {
  18. if (document[hidden]) {
  19. clearTimeout(timer);
  20. var val = parseInt($('#valueContainer').text());
  21. document.title = val + ': Pause';
  22. } else {
  23. increaseVal();
  24. }
  25. });
  26. increaseVal();
  27. </script>

查看Demo

浏览器支持

如果你想让所有的浏览器都支持这个API,我建议你看一下这篇文章。如果想检测当前浏览器是否运行这个API,可以看一看Detect Support for Various HTML5 Features.。到目前为止,我们已经可以很好的在各个浏览器中使用这个功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值