焦点监测 · 启动中

在线标签页焦点检测器:离开页面时网页会记录什么

检测中…

正在读取本文档对自身可见性与焦点的报告。

切换标签页、点击另一个窗口,或最小化这个窗口,然后回来。

这个页面会在你自己的浏览器里,运行与在线测评、监考页面完全相同的焦点与可见性检测。切换标签页、点击另一个窗口,或者最小化这个窗口,就能看到被记录下来的确切内容。所有数据都不会上传,下面的每一项读数都只留在这个标签页里。

事件日志

切换标签页、点击另一个窗口,或最小化这个窗口,然后回来。

信号

#时间事件记录状态离开时长
暂时没有记录。切到别的标签页或点击另一个窗口,然后再回来。

这个测试读取了什么

每个浏览器都会公开两项相互独立的读数。document.visibilityState 表示这个标签页是不是正在显示的那一个,document.hasFocus() 表示这个文档是不是正在接收键盘输入的那一个。两者都不需要授权,也都无法关闭。

两者并不是一回事。切换到别的标签页会让页面变成隐藏;而点击第二个浏览器窗口、聊天软件或终端,这个标签页仍然是可见的,只是失去了焦点——页面是失焦,而不是隐藏。

测评平台通常两者都记,分别计数,并统计每次离开持续了多久。下面这张表展示的,正是它们会建立的那份记录。

什么会触发它

  • 切换到别的标签页——触发 visibilitychange,状态变为 hidden。所有平台都会记录,手机上也一样。
  • 最小化窗口、锁屏,或手机息屏——同样算作隐藏。
  • 点击别的窗口或应用——第二个浏览器窗口、编辑器、聊天软件、聚焦搜索或启动器面板。标签页仍然可见,触发的是窗口的 blur 事件。
  • 在独立窗口中打开开发者工具——算作切换窗口,因此会触发 blur。
  • 浏览器为省内存丢弃或冻结标签页——在 Chromium 上会触发 freeze 与 pagehide。
  • 关闭或刷新页面——触发 pagehide,平台正是用这个事件来结束一次未完成的作答。

在线测评之前

如果一场考试提示你「离开页面会被记录」,那么在正式开始之前,值得先弄清楚这句话到底指什么。

  1. 用你实际要参加测评的那个浏览器打开本页,并保持打开。
  2. 切到别的标签页再马上切回来。注意日志记录了一次 hidden 事件,以及精确到秒的时长。
  3. 换一种做法:这次去点击另一个窗口。日志显示的是 blur 事件,而标签页从未隐藏过。
  4. 打开锁屏遮罩,看看你一离开,测评页面会显示什么。很多平台显示的就是这个。
  5. 留意那些无意触发的情况:通知横幅、独立窗口弹出的密码管理器,或者快捷键启动器,都会被记上一笔。

知道什么被记录,和绕过它不是一回事。本页告诉你读数是什么;平台如何解读,由平台决定。

结论是怎么得出的

已聚焦——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,加载完成后不发出任何网络请求。显示的每个事件和计时都在你的标签页内计算,关闭时即被丢弃。