首页 > 其他分享 >JS 监听浏览器各个标签间的切换-visibilitychange事件介绍

JS 监听浏览器各个标签间的切换-visibilitychange事件介绍

时间:2024-03-13 11:04:36浏览次数:31  
标签:videoElement 浏览器 标签 JS visibilitychange typeof visibilityChange hidden document

文章目录

一、JS 监听浏览器各个标签间的切换

以前看到过一些网页,在标签切换到其它地址时,网页上的标题上会发生变化,一直不知道这个是怎么做的,最近查了一些资料才发现有一个 visibilitychange 事件就可以搞定,这里将介绍一下页面可见性(Page Visibility)API的简单应用。

简单的说,当用户最小化网页或移动到另一个标签时,API会发送 visibilitychange 有关该网页的可见性的事件。你可以检测到该事件并执行一些操作或行为。例如:标签页隐藏的时候停止播放音乐视频、停止一些不必要的轮询,还有停止一些诸如轮播等循环动画效果等等。这些可以节省服务器和本地的开销。

二、document的可见性属性

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

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

visible : 页面内容至少部分可见。这意味着在实际情况中,该网页是一个非最小化窗口的可见标签页。

hidden : 页面内容是对用户不可见。实际上,这意味着该文档是后台标签页或最小化窗口的一部分,或者系统锁屏是时的状态。

prerender : 网页内容被预渲染并且用户不可见。

unloaded : 如果文档被卸载,那么这个值将被返回。

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

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

三、示例:监听标签,控制视频播放与暂停
<video id="videoElement" controls loop>
    <source src="https://www.runoob.com/try/demo_source/mov_bbb.mp4" type="video/mp4">
    <source src="https://www.runoob.com/try/demo_source/mov_bbb.ogg" type="video/ogg">
</video>
    
// 设置隐藏属性和改变可见属性的事件的名称
var hidden, visibilityChange;
if (typeof document.hidden !== "undefined") {
    hidden = "hidden";
    visibilityChange = "visibilitychange";
} else if (typeof document.mozHidden !== "undefined") {
    hidden = "mozHidden";
    visibilityChange = "mozvisibilitychange";
} else if (typeof document.msHidden !== "undefined") {
    hidden = "msHidden";
    visibilityChange = "msvisibilitychange";
} else if (typeof document.webkitHidden !== "undefined") {
    hidden = "webkitHidden";
    visibilityChange = "webkitvisibilitychange";
}
// 添加监听器
document.addEventListener(visibilityChange, function () {
    console.log("当前页面是否被隐藏:" + document[hidden]);
}, false);

console.log(hidden, visibilityChange)

var videoElement = document.getElementById("videoElement");

// 如果页面是隐藏状态,则暂停视频
// 如果页面是展示状态,则播放视频
function handleVisibilityChange() {
    if (document[hidden]) {
        videoElement.pause();
    } else {
        videoElement.play();
    }
}

// 如果浏览器不支持addEventListener 或 Page Visibility API 给出警告
if (typeof document.addEventListener === "undefined" || typeof document[hidden] === "undefined") {
    console.log(
        "This demo requires a browser, such as Google Chrome or Firefox, that supports the Page Visibility API."
    );
} else {
    // 处理页面可见属性的改变
    document.addEventListener(visibilityChange, handleVisibilityChange, false);

    // 当视频暂停,设置title
    // This shows the paused
    videoElement.addEventListener("pause", function () {
        document.title = 'Paused';
    }, false);

    // 当视频播放,设置title
    videoElement.addEventListener("play", function () {
        document.title = 'Playing';
    }, false);
}

标签:videoElement,浏览器,标签,JS,visibilitychange,typeof,visibilityChange,hidden,document
From: https://blog.csdn.net/shanghai597/article/details/130923746

相关文章

  • js实现大文件分片上传
    一个上传组件,需要具备的功能:需要校验文件格式可以上传任何文件,包括超大的视频文件(切片)上传期间断网后,再次联网可以继续上传(断点续传)要有进度条提示已经上传过同一个文件后,直接上传完成(秒传)前后端分工:前端:文件格式校验文件切片、md5计算发起检查请求,把当前文件的hash发送给服务......
  • JS ATM练习案例(复习循环知识)
    需求:用户可以选择存钱、取钱、查看余额和退出功能。分析:1循环时反复出现提示框,所以提示框写到循环里面。2.退出的条件是4,所以是4就会结束循环3.提前准备一个金额预存储4取钱为减法操作,存钱为加法操作,查看为直接显示数额。5输入不同的值,可以用switch来执行不同操作。<!D......
  • GDPU JavaWeb JSP基础
    正式走进Javaweb大门,了解jsp及Java在前端的体现。JSP JSP,JavaServerPages是一种基于Java技术的服务器端动态网页技术,允许开发人员在HTML页面中嵌入Java代码。通过JSP,开发人员可以创建包含静态模板和动态内容的网页。当客户端请求一个包含JSP的网页时,服务器会执行其中的J......
  • 夸克浏览器PC端功能体验
    一、下载安装可以看到目前PC端仅仅支持windows,不支持Mac和Linux。二、功能介绍夸克浏览器果然很简洁、清新,左侧栏提供首页、网盘、工具、快传四个选项,中间是搜索栏,底部是可定制的天气等小组件。搜索与手机端一致,没有多余的广告,精确直达。网盘可登录账户同步网盘数据......
  • [js error] SyntaxError: Unexpected token ‘{‘ (at uniFile.js?t=1710138723630:1:
    问题详情问题描述封装一个函数的时候报错问题原因SyntaxError:Unexpectedtoken‘{’(atuniFile.js?t=1710138723630:1:34)SyntaxError:意外的令牌“{”(在uniFile.js?t=1710138723630:1:34)意思是有不符合语法规范的地方在第一行34个字符的地方去到报错文件的地方查......
  • nodejs集成C++代码:手写简单的addon
    文章目录nodejs与node-gyp手写一个简单的addon编写一个简单的binding.gyp文件编写C++源文件V8版本:addon.ccnapi_api版本:addon_api.cc编译命令JS调用在这个专栏里,已经提到过web系统中c++的两大应用场景了:assembly和cef框架的应用,这两个可以说都是客户......
  • 如何解决浏览器兼容问题2.0
    1.HTML兼容性问题在HTML标签、属性等方面也存在兼容性问题,尤其是在HTML5中新增了很多新的标签和属性,不同浏览器对其支持程度也不同。解决方法:使用DOCTYPE声明:通过DOCTYPE声明文档类型,以确保浏览器能够正确解析HTML文档。相关标签的替代方案:对于不支持的HTML标签,可以选......
  • ansible-playbook剧本 yaml json jq 学习
    ansible临时命令ad-hocansible中有两种模式,分别是ad-hoc模式和playbook模式ad-hoc简而言之,就是"临时命令"https://docs.ansible.com/ansible/latest/user_guide/intro_adhoc.html临时命令非常适合您很少重复的任务。例如,如果您想在圣诞节假期关闭实验室中的所有机器。Ansib......
  • nodejs base64 转存图片文件
     nodejsbase64转存图片文件在Node.js中,您可以使用内置的fs模块来将Base64编码的字符串转换为图片文件。以下是一个简单的例子,展示如何将Base64字符串转换为PNG图片文件:  constfs=require('fs'); //假设您有一个Base64编码的字符串constbase64Stri......
  • pdf.js源码解析-PDF文件的结构
    为了了解pdf.js源码的详细结构和功能,先来看看PDF的文件结构,然后才能知道pdf.js中的代码是如何解析并且为何这样操作PDF文件的。PDF文件基本是由header、body、trailer组成。header包含了这个PDF的信息,比如PDF的版本,创建时间,以及作者等。body包含了PDF文件的实际内容,比如文本,图片,......