• JavaScript 页面可见性 Page Visibility API 监听用户离开页面


    一、API 简介

    Page Visibility API 用来检测页面当前是否可见,以及打开网页的时间等

    以前监听用户正在离开页面常用的方法是下面三个事件:

    1、pagehide
    2、beforeunload
    3、unload

    但这些事件在手机上不触发,因为手机系统可以将进程直接转入后台,然后杀死,为了解决这个问题,就诞生了 Page Visibility API
    不管手机或桌面电脑,所有情况下,这个 API 都会监听到页面的可见性发生变化
    这个 API 常用于页面被切换到其他后台进程时,自动暂停音乐或视频的播放,达到节省资源,减缓电能消耗等效果

    二、document.visibilityState 属性

    这个 API 主要在 document 对象上,新增了一个 document.visibilityState 属性,该属性返回一个字符串,表示页面当前的可见性状态,共有三个可能的值:

    1、hidden:页面彻底不可见
    2、visible:页面至少一部分可见
    3、prerender:页面即将或正在渲染,处于不可见状态

    关于 hidden & visible,

    hidden 状态和 visible 状态是所有浏览器都支持的
    只要页面可见,哪怕只露出一个角,document.visibilityState 属性就返回 visible,只有以下四种情况,才会返回 hidden:

    1、浏览器最小化
    2、浏览器没有最小化,但是当前页面切换成了背景页
    3、浏览器将要卸载(unload)页面
    4、操作系统触发锁屏屏幕

    关于 prerender,

    prerender 状态只在支持"预渲染"的浏览器上才会出现,比如 Chrome,可以在用户不可见的状态下,预先把页面渲染出来,等到用户要浏览的时候,直接展示渲染好的网页

    可以看到,上面四种场景涵盖了页面可能被卸载的所有情况
    也就是说,页面卸载之前,document.visibilityState 属性一定会变成 hidden

    三、visibilitychange 事件

    只要 document.visibilityState 属性发生变化,就会触发 visibilitychange 事件
    因此,可以通过监听这个事件跟踪页面可见性的变化,举个例子:

    document.addEventListener('visibilitychange', function () {
      // 用户离开了当前页面
      if (document.visibilityState === 'hidden') {
        document.title = '页面不可见';
      }
    
      // 用户打开或回到页面
      if (document.visibilityState === 'visible') {
        document.title = '页面可见';
      }
    });
    

    上面代码是 Page Visibility API 的最基本用法,可以监听可见性变化
    下面是另一个例子,一旦页面不可见,就暂停视频播放:

    var vidElem = document.getElementById('video-demo');
    document.addEventListener('visibilitychange', startStopVideo);
    
    function startStopVideo() {
      if (document.visibilityState === 'hidden') {
        vidElem.pause();
      } else if (document.visibilityState === 'visible') {
        vidElem.play();
      }
    }
    
  • 相关阅读:
    博客搬迁
    android中listview的item滑动删除效果(已解决listview点击问题)
    来把博客园变成“原谅”的颜色
    Datatables后台服务器端分页、根据条件重新查询、主要技术问题
    JQuery双列表交互模态窗口,列表项互相、上下移动
    Angular页面刷新保存变量数据,运用localstorage
    Angular中使用datatable.js出现错误“ui-router TypeError: Cannot read property 'childNodes' of undefined”的解决方法
    使用swiper-animate.js制作h5宣传页
    使用JavaScript/JQuery 操作SVG元素的几个关键技巧
    mac os系统使用Visual Studio Code打开浏览器查看HTML文件
  • 原文地址:https://www.cnblogs.com/Leophen/p/13854413.html
Copyright © 2020-2023  润新知