前端页面防切屏监听

1,025 阅读2分钟

前端页面防切屏主要用到Document.visibilityState属性以及visibilitychange方法,下面详细介绍下使用方法,以及能检测到的场景

Document.visibilityState

Document.visibilityState (只读属性), 返回document的可见性,即当前可见元素的上下文环境。由此可以知道当前文档 (即为页面) 是在背后,或是不可见的隐藏的标签页,或者 (正在) 预渲染。可用的值如下:

  • 'visible' : 此时页面内容至少是部分可见。即此页面在前景标签页中,并且窗口没有最小化。
  • 'hidden' : 此时页面对用户不可见。即文档处于背景标签页或者窗口处于最小化状态,或者操作系统正处于 '锁屏状态' .
  • 'prerender' : 页面此时正在渲染中,因此是不可见的 (considered hidden for purposes of document.hidden). 文档只能从此状态开始,永远不能从其他值变为此状态。注意:浏览器支持是可选的。

当此属性的值改变时,会递交 visibilitychange 事件给Document.

典型用法是防止当页面正在渲染时加载资源,或者当页面在背景中或窗口最小化时禁止某些活动。

语法

var string = document.visibilityState

visibilitychange

当其选项卡的内容变得可见或被隐藏时,会在文档上触发 visibilitychange (能见度更改) 事件。

示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>切屏测试</title>
    <script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>
</head>
<body>
    <h1>切屏测试</h1>
    <script>
        var vConsole = new window.VConsole();
        let count = 0
        document.addEventListener("visibilitychange", function() {
            if(document.visibilityState == 'visible') {
                count++
                console.log(count)
            }
        });
    </script>
</body>
</html>

测试场景

1. mac上google浏览器,以下场景count次数递增

  1. 切换tab栏
  2. 全屏窗口切换
  3. 息屏

注:窗口上面打开/关闭应用(比如微信),不会触发该事件

2. IOS 微信浏览器,以下场景count次数递增

  1. 应用切换
  2. 退出后台

3. IOS safari浏览器,以下场景count次数递增

  1. 应用切换
  2. 退出后台
  3. 切换tab栏