在线标签页焦点检测器:离开页面时网页会记录什么
检测中…
正在读取本文档对自身可见性与焦点的报告。
这个页面会在你自己的浏览器里,运行与在线测评、监考页面完全相同的焦点与可见性检测。切换标签页、点击另一个窗口,或者最小化这个窗口,就能看到被记录下来的确切内容。所有数据都不会上传,下面的每一项读数都只留在这个标签页里。
事件日志
切换标签页、点击另一个窗口,或最小化这个窗口,然后回来。
信号
| # | 时间 | 事件 | 记录状态 | 离开时长 |
|---|---|---|---|---|
| 暂时没有记录。切到别的标签页或点击另一个窗口,然后再回来。 | ||||
这个测试读取了什么
每个浏览器都会公开两项相互独立的读数。document.visibilityState 表示这个标签页是不是正在显示的那一个,document.hasFocus() 表示这个文档是不是正在接收键盘输入的那一个。两者都不需要授权,也都无法关闭。
两者并不是一回事。切换到别的标签页会让页面变成隐藏;而点击第二个浏览器窗口、聊天软件或终端,这个标签页仍然是可见的,只是失去了焦点——页面是失焦,而不是隐藏。
测评平台通常两者都记,分别计数,并统计每次离开持续了多久。下面这张表展示的,正是它们会建立的那份记录。
什么会触发它
- 切换到别的标签页——触发
visibilitychange,状态变为 hidden。所有平台都会记录,手机上也一样。 - 最小化窗口、锁屏,或手机息屏——同样算作隐藏。
- 点击别的窗口或应用——第二个浏览器窗口、编辑器、聊天软件、聚焦搜索或启动器面板。标签页仍然可见,触发的是窗口的
blur事件。 - 在独立窗口中打开开发者工具——算作切换窗口,因此会触发 blur。
- 浏览器为省内存丢弃或冻结标签页——在 Chromium 上会触发
freeze与pagehide。 - 关闭或刷新页面——触发
pagehide,平台正是用这个事件来结束一次未完成的作答。
在线测评之前
如果一场考试提示你「离开页面会被记录」,那么在正式开始之前,值得先弄清楚这句话到底指什么。
- 用你实际要参加测评的那个浏览器打开本页,并保持打开。
- 切到别的标签页再马上切回来。注意日志记录了一次 hidden 事件,以及精确到秒的时长。
- 换一种做法:这次去点击另一个窗口。日志显示的是 blur 事件,而标签页从未隐藏过。
- 打开锁屏遮罩,看看你一离开,测评页面会显示什么。很多平台显示的就是这个。
- 留意那些无意触发的情况:通知横幅、独立窗口弹出的密码管理器,或者快捷键启动器,都会被记上一笔。
知道什么被记录,和绕过它不是一回事。本页告诉你读数是什么;平台如何解读,由平台决定。
结论是怎么得出的
已聚焦——visibilityState 为 visible 且 hasFocus() 为 true。这个标签页正显示在屏幕上,并接收你的键盘输入。
已失焦——仍然可见,但焦点已经转到别的窗口或应用。你一边看着这个标签页,一边在别处打字,或者有别的窗口压在上面。
已隐藏——标签页根本没有被渲染:别的标签页在前面、窗口被最小化,或者设备屏幕已经关闭。
离开计时从第一个夺走焦点的事件开始,到两项读数同时恢复为真时停止。因此,一次先失焦、随后变成切换标签页的过程,会被算作一次连续的离开。
它看不到什么
这些读数都不会说明你去了哪里。页面只知道这个标签页不再是活动的那一个,以及持续了多久——不知道是哪个标签页、哪个应用,也不知道屏幕上有什么。
任何发生在浏览器之外、又没有夺走键盘焦点的事情,对这套 API 都是不可见的,因为根本没有事件可触发。这包括第二台实体设备、一张打印出来的纸,或者房间里的另一个人。
单看次数并不能证明什么。抢走焦点的通知、屏幕阅读器面板、系统更新提示,和一次真正的切换标签页,产生的是同一个事件。
严肃的监考不会只靠这一项。摄像头、麦克风、屏幕共享和需要安装的锁屏浏览器,能看到的远比一个网页多——另一项网页无需授权就能读到的信息,见外接显示器检测测试。
隐私
本页是静态页面。没有统计分析、没有 Cookie、没有本地存储,加载完成之后不发出任何网络请求。
页面上的每个计数和时间戳都在你的标签页内计算,关闭标签页即消失。刷新会把一切重置。
你可以把它整个读一遍:只有一个 JavaScript 文件,链接在页脚。
浏览器支持
visibilitychange 与 document.hasFocus() 在所有当代浏览器上都可用,桌面端和移动端皆然,既不需要授权,也不要求安全来源。
freeze 与 resume 是 Chromium 独有的,当浏览器为省内存挂起后台标签页时触发。其他浏览器则完全不会上报。
在 iOS 上,切换应用会报告为隐藏而不是失焦,因为整个浏览器都被切到了后台。两者的区分只在有窗口概念的系统上才存在。
常见问题
网站能检测到我切换标签页吗?
能,而且不需要任何授权。你的标签页一旦不再是显示中的那个,visibilitychange 事件立刻触发,document.visibilityState 会一直返回 hidden 直到你回来。所有当代浏览器都实现了这一点,手机浏览器也包括在内。没有任何设置能把它对页面隐藏起来。
在线测评能区分切换标签页和打开别的应用吗?
能。切换标签页会让页面变成隐藏;点击另一个窗口或应用则让页面保持可见,但夺走键盘焦点,从而触发 blur 事件。同时记录两者的平台就能把它们区分开,本页也把两者分开显示,让你自己看清差别。
在线考试知道我切到了哪个标签页或哪个应用吗?
不知道。浏览器只告诉页面:它不再是活动文档,以及这种状态持续了多久。去向——另一个标签页、另一个程序、锁住的屏幕——从不会被公开。任何更详细的信息都需要屏幕共享或安装锁屏浏览器,而这两者都有明显提示,也都必须由你同意。
截图算离开页面吗?
这完全取决于截图的方式。由操作系统处理、自身没有界面的快捷键不会触发任何事件,因为浏览器从未失去焦点。任何会打开选择框、面板或预览窗口的方式都会夺走焦点,那就会被记录为一次 blur。你可以在本页两种都试一遍,然后看日志。
我没切标签页,为什么计数还是涨了?
夺走焦点的东西比大多数人想的多:通知横幅、密码管理器弹窗、系统更新提示、快捷键启动器,或者在独立窗口中打开的开发者工具。它们触发的 blur 事件,与一次有意的切换毫无区别。
能在浏览器设置里关掉这种检测吗?
不能。Page Visibility API 是文档本身的一部分,不是一项权限,因此没有什么可以撤销。屏蔽它会破坏许多正当用途,比如后台标签页里暂停视频、停止动画和停掉计时器。
接一台外接显示器就能避免切屏被记录吗?
不能。把视线移到第二块屏幕并不改变什么,但只要点击那块屏幕上的窗口,这个标签页就会失去键盘焦点,触发的 blur 事件与单屏时一模一样。至于第二块屏幕本身网页能否看到,那是另一个问题,由外接显示器检测测试来回答。
这些数据会发到服务器吗?
不会。本页是静态页面,没有统计分析也没有 Cookie,加载完成后不发出任何网络请求。显示的每个事件和计时都在你的标签页内计算,关闭时即被丢弃。