iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Page Visibility API 教程示例
  • 275
分享到

Page Visibility API 教程示例

2024-04-02 19:04:59 275人浏览 薄情痞子
摘要

目录一、简介二、document.visibilityState三、document.hidden四、visibilitychange 事件五、页面卸载一、简介 有时候,开发者需要知

一、简介

有时候,开发者需要知道,用户正在离开页面。常用的方法是监听下面三个事件。

pagehide

beforeunload

unload

但是,这些事件在手机上可能不会触发,页面就直接关闭了。因为手机系统可以将一个进程直接转入后台,然后杀死。

  • 用户点击了一条系统通知,切换到另一个 App。
  • 用户进入任务切换窗口,切换到另一个 App。
  • 用户点击了 Home 按钮,切换回主屏幕。
  • 操作系统自动切换到另一个 App(比如,收到一个电话)。

上面这些情况,都会导致手机将浏览器进程切换到后台,然后为了节省资源,可能就会杀死浏览器进程。

以前,页面被系统切换,以及系统清除浏览器进程,是无法监听到的。开发者想要指定,任何一种页面卸载情况下都会执行的代码,也是无法做到的。为了解决这个问题,就诞生了 Page Visibility api。不管手机或桌面电脑,所有情况下,这个 API 都会监听到页面的可见性发生变化。

这个新的 API 的意义在于,通过监听网页的可见性,可以预判网页的卸载,还可以用来节省资源,减缓电能的消耗。比如,一旦用户不看网页,下面这些网页行为都是可以暂停的。

  • 服务器的轮询
  • 网页动画
  • 正在播放的音频或视频

二、document.visibilityState

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

hidden:页面彻底不可见。

visible:页面至少一部分可见。

prerender:页面即将或正在渲染,处于不可见状态。

其中,hidden状态和visible状态是所有浏览器都必须支持的。prerender状态只在支持"预渲染"的浏览器上才会出现,比如 Chrome 浏览器就有预渲染功能,可以在用户不可见的状态下,预先把页面渲染出来,等到用户要浏览的时候,直接展示渲染好的网页。

只要页面可见,哪怕只露出一个角,document.visibilityState属性就返回visible。只有以下四种情况,才会返回hidden

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

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

事实上,这也是设计这个 API 的主要目的。

另外,早期版本的 API,这个属性还有第四个值unloaded,表示页面即将卸载,现在已经被废弃了。

注意,document.visibilityState属性只针对顶层窗口,内嵌的<iframe>页面的document.visibilityState属性由顶层窗口决定。

使用 CSS 属性隐藏<iframe>页面(比如display: none;),并不会影响内嵌页面的可见性。

三、document.hidden

由于历史原因,这个 API 还定义了document.hidden属性。该属性只读,返回一个布尔值,表示当前页面是否可见。

document.visibilityState属性返回visible时,document.hidden属性返回false;其他情况下,都返回true

该属性只是出于历史原因而保留的,只要有可能,都应该使用document.visibilityState属性,而不是使用这个属性。

四、visibilitychange 事件

只要document.visibilityState属性发生变化,就会触发visibilitychange事件。

因此,可以通过监听这个事件(通过document.addEventListener()方法或document.onvisibilitychange属性),跟踪页面可见性的变化。

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();
  }
}

五、页面卸载

下面专门讨论一下,如何正确监听页面卸载。

页面卸载可以分成三种情况。

  • 页面可见时,用户关闭 Tab 页或浏览器窗口。
  • 页面可见时,用户在当前窗口前往另一个页面。
  • 页面不可见时,用户或系统关闭浏览器窗口。

这三种情况,都会触发visibilitychange事件。前两种情况,该事件在用户离开页面时触发;最后一种情况,该事件在页面从可见状态变为不可见状态时触发。

由此可见,visibilitychange事件比pagehidebeforeunloadunload事件更可靠,所有情况下都会触发(从visible变为hidden)。因此,可以只监听这个事件,运行页面卸载时需要运行的代码,不用监听后面那三个事件。

甚至可以这样说,unload事件在任何情况下都不必监听,beforeunload事件只有一种适用场景,就是用户修改了表单,没有提交就离开当前页面。另一方面,指定了这两个事件的监听函数,浏览器就不会缓存当前页面。

参考链接

  • Page Visibility Level 2, W3C
  • Page Visibility API, David Walsh
  • Using the pageVisbility API, Joe Marini
  • Don't lose user and app state, use Page Visibility, Ilya GriGorik

以上就是Page Visibility API 教程示例的详细内容,更多关于Page Visibility API 教程的资料请关注编程网其它相关文章!

--结束END--

本文标题: Page Visibility API 教程示例

本文链接: https://www.lsjlt.com/news/154208.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Page Visibility API 教程示例
    目录一、简介二、document.visibilityState三、document.hidden四、visibilitychange 事件五、页面卸载一、简介 有时候,开发者需要知...
    99+
    2022-11-13
  • iReport使用教程(示例教程)
    在使用ireport的过程中,因为各种功能都要百度,但是大家使用的例子又千差万别让人很苦恼,所以用一个简单例子贯穿的展示一下ireport的常见功能。 iReport简介 说到iRe...
    99+
    2022-11-12
  • tcpdump示例和教程
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、如何安装“tcpdump”二、如何使用 tcpdump 捕获数据包:过滤数据包以修复网络问题:如何使用...
    99+
    2023-09-15
    tcpdump 服务器 网络
  • vue3CompositionAPI使用示例教程
    Vue3新增了Composition API。我们只需将实现某一功能的相关代码全部放进一个函数中,然后return需要对外暴露的对象。不同功能的代码都是一个个函数,最终在setup(...
    99+
    2022-12-21
    vue3 Composition API使用 vue3 Composition API
  • Shell教程的示例分析
    这篇文章主要为大家展示了“Shell教程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Shell教程的示例分析”这篇文章吧。Shell 是一个用 C 语言编写的程序,它是用户...
    99+
    2023-06-05
  • iOS xcconfig编写示例教程
    目录引言注释include导入其他设置变量优先级(由高到低)引言 xcconfig文件的语法比较简单,每个配置文件都由一系列键值分配组成,这些键值分配具有以下语法: BUILD_SE...
    99+
    2022-11-13
  • Centos 安装 mysql5.7 示例教程
    创建mysql 用户组和用户 groupadd mysqluseradd -r -g mysql mysql 从官网下载 MySQL wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5...
    99+
    2023-08-19
    mysql 数据库 database
  • Ajax教程的示例分析
    今天就跟大家聊聊有关Ajax教程的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 由于它的灵活性、优美以及快速...
    99+
    2022-10-19
  • react Scheduler 实现示例教程
    目录正文简单的css动画etTimeout来实现循环处理具体思路正文 最近在看react源码,react构建fiber树这一块逻辑还比较好理解,但是一旦涉及到任务调度相关的逻辑,看起...
    99+
    2022-11-13
  • Python defaultdict教程示例详解
    1. 概述 在我们使用Python中的dict时,常常需要判断某个关键字是否已经在dict中,如果不存在则初始化,存在则进行另外的操作。例如统计一篇文章中所有单词出现次数的代码,大...
    99+
    2023-01-11
    Python defaultdict教程 Python defaultdict
  • ZooKeeper Java API编程的示例分析
    这篇文章主要为大家展示了“ZooKeeper Java API编程的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ZooKeeper Java API编程的示例分析”这篇文章吧。开发应用...
    99+
    2023-05-30
    zookeeper java
  • TypeScript基础class类教程示例
    目录class 类示例构造函数继承class 类 类是面向对象语言的程序设计中的概念,是面向对象编程的基础。 类是创建对象的模板,是对现实生活中一类具有共同特征的事物的抽象 类的内部...
    99+
    2022-11-13
  • SpringBoot整合Apache Pulsar教程示例
    目录正文准备工作创建 SpringBoot 项目添加 Maven 依赖编写消息生产者编写消息消费者测试总结正文 推荐一个基于SpringBoot开发的全平台数据(数据库管理工具)功...
    99+
    2023-03-10
    SpringBoot整合Apache Pulsar SpringBoot 整合
  • 手写vite插件教程示例
    目录前言1. 什么是 vite 插件2. 为什么要写 vite 插件创建  vite 插件通用模板1. 初始化2. 配置 eslint 和 prettier(可选)3. 新...
    99+
    2022-11-13
  • Kotlin函数使用示例教程
    目录我们先看看简单的函数我们写一个求和函数函数头函数体调用函数非常简单反编译Java源代码步骤接下来我们来看看匿名函数这是接口的声明我们先看看简单的函数 // 前面的文章我们了解到它...
    99+
    2022-11-13
  • JavaScript稀疏数组示例教程
    目录前言什么是稀疏数组?创建带有孔洞的稀疏数组删除元素的映射现象稀疏数组的快速映射(强制创建映射关系)总结前言 最近有空在看一本关于 JS 数据结构和算法的书,里面有提到数组,却对数...
    99+
    2022-11-13
  • 网站SEO分析教程示例
    这篇文章给大家分享的是有关网站SEO分析教程示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  网站分析是每个从事SEO行业的小伙伴都要熟悉掌握的东西,但是很多刚刚入行的小伙伴对网站分析并没有一个清晰和完整的思...
    99+
    2023-06-10
  • Leaflet基础入门教程示例
    目录什么是Webgis?什么是Leaflet?在Vue中安装Leaflet,与其他依赖在App.vue中使用初始化地图chinaProvider地图瓦片addControls使用工具...
    99+
    2023-01-04
    Leaflet 基础 Leaflet 入门教程
  • Python的OptionParser模块示例教程
    Python中强大的选项处理模块。 关于Python之OptionParser模块使用详解可以参考这篇。 示例 #!/usr/bin/pythonfrom optparse impo...
    99+
    2023-01-07
    Python的OptionParser模块 Python的OptionParser
  • Golang语言反射示例教程
    本篇内容主要讲解“Golang语言反射示例教程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Golang语言反射示例教程”吧!1. 反射简介1.1 反射是什么?Go语言提供了一种机制在运行时更新...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作