如何利用浏览器的可见性API优化网站性能
最近在使用微软AI聊天工具Bing时,发现一个有趣的东西。我向它提问后,它在持续输出的过程中,如果我离开了当前它的浏览器会话,比如切屏,看当前浏览器的其它标签页,它会默认停止它的输出,等我回来它才继续。我们来探讨一下这个现象的实现方式,以及它的作用。
什么是浏览器的可见性API
浏览器的可见性API是一种JavaScript的接口,它可以让你知道一个页面什么时候是隐藏的,什么时候是显示的。
公众号:Code程序人生,个人网站:https://creatorblog.cn
当用户最小化窗口或切换到另一个标签页时,API会发送visibilitychange事件,让监听者知道页面的状态已发生变化。你可以检测到该事件并执行某些操作或采取不同的行为。例如,如果你的web应用正在播放视频,当用户将标签页放到后台时,它可以暂停视频,当用户返回标签页时,它又可以恢复播放。
浏览器的可见性API可以让你在页面不可见时避免执行不必要的任务,这对于节省资源和提高性能特别有用。例如,你可以在页面隐藏时停止动画或轮询服务器,从而减少CPU和网络的消耗。
如何使用浏览器的可见性API
要使用浏览器的可见性API,你需要了解以下几个概念:
-
document.hidden属性:这是一个只读的布尔值,如果页面处于隐藏状态,则返回true,否则返回false。 -
document.visibilityState属性:这是一个只读的字符串,表示页面的当前可见性状态。可能的值有:visible:页面内容至少部分可见。在实践中,这意味着页面是非最小化窗口的前景选项卡。hidden:页面内容对用户不可见,原因可能是文档标签页在后台或属于最小化窗口的一部分,也可能是设备屏幕关闭。prerender:页面正在预渲染,尚未对用户可见。这个状态只在支持预渲染的浏览器中存在,比如Chrome。unloaded:页面正在从内存中卸载。这个状态只在支持页面卸载事件的浏览器中存在,比如Firefox。
-
visibilitychange事件:这是一个事件,当页面的可见性状态发生变化时触发。你可以给document对象添加一个事件监听器,来处理这个事件。
浏览器的可见性API的示例
下面是一个简单的示例,用浏览器的可见性API来实现一个简单的数据绑定,当页面可见时,显示当前的时间,当页面隐藏时,停止更新时间:
<html>
<head><style>#time {font-size: 36px;text-align: center;}</style>
</head>
<body><div id="time"></div><script>// 获取页面上的元素let timeElement = document.getElementById("time");// 定义一个变量,用来存储定时器的IDlet timerId = null;// 定义一个函数,用来更新时间function updateTime() {// 获取当前的时间let now = new Date();// 格式化时间为HH:MM:SSlet timeString = now.toTimeString().slice(0, 8);// 更新页面上的元素的内容timeElement.textContent = timeString;}// 定义一个函数,用来处理页面可见性变化的事件function handleVisibilityChange() {// 如果文档变为可见,更新时间并启动定时器if (document.visibilityState === "visible") {updateTime();timerId = setInterval(updateTime, 1000);}// 如果文档变为隐藏,清除定时器else if (document.visibilityState === "hidden") {clearInterval(timerId);}}// 监听文档的可见性变化事件document.addEventListener("visibilitychange", handleVisibilityChange);// 启动定时器timerId = setInterval(updateTime, 1000);</script>
</body>
</html>
你可以在浏览器中运行这个代码,然后切换标签页或最小化窗口,看看页面上的时间的变化。
浏览器的可见性API的应用场景
浏览器的可见性API有很多有用的应用场景,比如:
- 网站有图片轮播效果,只有在用户观看轮播的时候,才会自动展示下一张幻灯片。
- 显示信息仪表盘的应用程序不希望在页面不可见时轮询服务器进行更新。
- 页面想要检测何时正在预渲染,以便可以准确的计算页面浏览量。
- 当设备进入待机模式(用户按下电源键关闭屏幕)时,网站想要关闭设备声音。
浏览器的可见性API的兼容性和注意事项
浏览器的可见性API是一个比较新的特性,它在大多数现代浏览器中都有支持,但在一些老版本的浏览器中可能不兼容。如果你想让你的代码在不支持的浏览器中也能运行,你可以使用一些polyfill或shim的方法。
另外,你还需要注意以下几点:
- 浏览器的可见性
API只能检测页面是否处于前台或后台,不能检测页面是否被遮挡或半透明。 - 浏览器的可见性
API只能检测标签页的可见性,不能检测<iframe>的可见性。如果你想检测<iframe>的可见性,你需要在<iframe>内部的文档中使用浏览器的可见性API。 - 浏览器的可见性
API不能检测用户是否真的在关注页面,只能检测页面是否有可能被用户看到。如果你想检测用户是否真的在关注页面,你可能需要使用其他的方法,比如检测用户的鼠标或键盘活动,或者使用WebGazer.js等工具来实现眼球追踪。
总结
浏览器的可见性API是一种JavaScript的接口,它可以让你知道一个页面什么时候是隐藏的,什么时候是显示的。
你可以使用document.hidden和document.visibilityState属性来获取页面的可见性状态,也可以使用visibilitychange事件来监听页面的可见性变化。
浏览器的可见性API可以让你在页面不可见时避免执行不必要的任务,从而节省资源和提高性能。浏览器的可见性API有很多有用的应用场景,比如暂停视频,停止轮播,关闭声音等。浏览器的可见性API在大多数现代浏览器中都有支持,但在一些老版本的浏览器中可能不兼容,你可以使用一些polyfill或shim的方法来解决这个问题。
浏览器的可见性API还有一些注意事项,比如不能检测页面是否被遮挡或半透明,不能检测<iframe>的可见性,不能检测用户是否真的在关注页面等。
相关文章:
如何利用浏览器的可见性API优化网站性能
最近在使用微软AI聊天工具Bing时,发现一个有趣的东西。我向它提问后,它在持续输出的过程中,如果我离开了当前它的浏览器会话,比如切屏,看当前浏览器的其它标签页,它会默认停止它的输出,等我回来…...
还不知道IP地址不够用是怎么被大牛们解决的?(NAT/NAPT, IPv6, DHCP)
文章目录 前言1. DHCP网络管理协议什么是 DHCPDHCP 两种分配机制 2. NAT网络地址转换协议什么是 NATNAT 技术使用NAT网络设备间如何通信两个内网设备相互通信不同内网中的设备相互通信NAT IP转换过程 NAPT 技术NAT 技术的缺陷 3. IPv6 协议什么是 IPv6 总结 前言 在之前的文章…...
使用决策树预测隐形眼镜类型
任务描述 本关任务:编写一个例子讲解决策树如何预测患者需要佩戴的隐形眼镜类型。使用小数据集,我们就可以利用决策树学到很多知识:眼科医生是如何判断患者需要佩戴的镜片类型,一旦理解了决策树的工作原理,我们甚至也…...
[ACTF2020 新生赛]BackupFile 1
题目环境: 好好好,让找源文件是吧?咱们二话不说直接扫它后台 使用dirsearch工具扫描网站后台(博主有这个工具的压缩包,可以私聊我领取)python dirsearch.py -u http://0d418151-ebaf-4f26-86b2-5363ed16530…...
解决vuex刷新数据丢失
Vuex 是一个 Vue.js 的状态管理库,它使得你可以在 Vue 组件之间共享状态。当你在 Vuex 中更新状态时,如果你遇到数据丢失或数据不一致的问题,可能需要进行深度复制或者使用其他方式来确保数据的完整性。 假设你有一个 Vuex 存储,…...
linux系统下读取当前硬盘的温度
这个其实很简单,借助于smartctl工具(Ubuntu默认安装好了),标红的部分就是当前温度,单位是摄氏度。 sudo smartctl -l scttempsts /dev/sda...
python 深度学习 解决遇到的报错问题8
本篇继python 深度学习 解决遇到的报错问题7-CSDN博客 目录 一、OSError: [WinError 127] 找不到指定的程序。 Error loading "D:\my_ruanjian\conda-myenvs\deeplearning\lib\site-packages\torch\lib\caffe2_detectron_ops.dll" or one of its dependencies. 二、…...
Linux pipe()系统调用示例
Linux系统调用pipe函数,创建一个pipe,通过传入的fd数组返回pipe的读、写两端。 其中fd[ 0 ]用于读,fd[ 1 ]用于写。 一个pipe是单向数据传输的,不用用于父子进程双向读写。创建2个pipe实现父子进程间的双线读写。 #include <u…...
音频中的采样率和比特率
音频中的采样率和比特率 采样频率千比特率音频比特率 采样频率 参考:https://blog.csdn.net/qq_38907791/article/details/88925224 采样频率,也称为采样速度或者采样率,定义了每秒从连续信号中提取并组成离散信号的采样个数,它…...
Python常用脚本
1.解压指定文件夹内的zip包,解压到当前位置 import os import zipfile# 指定文件夹路径 folder_path "/path/to/your/folder"# 获取文件夹下所有的zip文件 zip_files [os.path.join(folder_path, file) for file in os.listdir(folder_path) if file.e…...
Redis5 分布式系统之主从模式
目录 分布式系统 引子 分布式系统类型 主从模式 一个主节点和多个从节点 创建多个节点方法 配置主从结构 主从模式知识 主从复制 拓扑结构 1.一主一从 2.一主多从 3.树形主从 主从实现原理 psync数据同步 全量复制和部分复制 psync流程 1.全量数据同步 2.部…...
【黑马程序员】Maven 进阶
文章目录 前言一、分模块开发与设计1. 分模块开发意义2. 分模块开发(模块拆分)2.1 创建 Maven 模块2.2 书写模块代码2.3 通过 Maven 指令安装模块到本地仓库(install 指令) 二、依赖管理1. 依赖传递1.1 依赖传递冲突问题 2. 可选依…...
231108 C语言memset当第三个参数为0,即设置个数为零也不报错
memset语法: void *memset(void *s, int c, size_t n); 犹豫第三个参数为0会不会报错,测试不会。 代码: #include"stdio.h" #include"stdlib.h" // memset memcpy int main() { int sig[100] { 0 }; int …...
HMM与LTP词性标注之马尔科夫模型(HMM原理剖析)
文章目录 问题描述viterbi算法联合概率与条件概率维特比算法实例 问题描述 viterbi算法 联合概率与条件概率 维特比算法实例...
Python自动化测试selenium指定截图文件名方法
这篇文章主要介绍了Python自动化测试selenium指定截图文件名方法,Selenium 支持 Web 浏览器的自动化,它提供一套测试函数,用于支持 Web 自动化测试,下文基于python实现指定截图文件名方法,需要的小伙伴可以参考一下 前…...
Linux 实现文件后半部分的复制
继上次实现文件从后往前数2k的数据进行复制,此次要求是文件的一半且是后半部分。 即复制源文件sour_file的后半部分到dest_file 除了数据上从后2K变化到后一半之外,其他的几乎没有什么变化。 这道题的关键点就在于后一半怎么求,在经历了用 …...
阿里开源中间件一览
1. 概述以及竞品对比 间件介绍官方链接竞品竞品介绍异同点对比Dubbo高性能的RPC框架,用于实现分布式服务的调用和管理。DubbogRPC gRPC是由Google开源的一款高性能、通用的RPC框架,支持多种编程语言 链接:gRPC Dubbo更注重于服务治理和可扩展…...
Ubuntu20.04下Salome_meca 2022软件安装(支持GPU加速)
一、什么是Salome_meca ? Salome_meca 是一个开源的有限元分析软件套件,主要用于模拟和分析复杂的力学问题。它是 Salome 平台的一部分,Salome 是一个通用的集成化软件环境,用于建模、预处理、模拟和后处理各种复杂的工程和科学问…...
uniapp:打包ios配置隐私协议框
使用uniapp打包ios 上架商店需要配置隐私协议政策弹窗。当用户点击确定后才能继续操作。 首先manifest.json中配置使用原生隐私政策提示框是不支持ios的。不用勾选。 解决思路: 1、新建页面:iosLogin.vue,pages.json中 这个页面需要放在第一…...
JS逆向爬虫---请求参数加密③【比特币交易爬虫】
查询参数确定 t无加密 请求头参数加密 X-Apikey参数加密确定 X-Apikey逆向 const API_KEY "a2c903cc-b31e-4547-9299-b6d07b7631ab" function encryptApiKey(){ var t API_KEY, e t.split(""), n e.splice(0, 8);return t e.concat(n).join("&…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
C++11 constexpr和字面类型:从入门到精通
文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...
