废弃卸载事件

unload 事件将被逐步弃用,并会逐步更改默认设置,使 unload 处理程序停止在网页上触发,除非有网页明确选择启用这些处理程序。

弃用时间表

我们注意到,最早在 2019 年 1 月,当我们宣布实施往返缓存的意图时,卸载行为可能会发生变化。在实施工作的同时,我们进行了大规模主动联系,导致卸载量大幅下降。为了进一步完善这项服务,我们还开始提供一些方法来测试从 Chrome 115 中弃用卸载功能的效果:

完成这些主动联系和试用阶段后,我们预计软弃用的实施情况如下:

  • 在限定范围内,卸载将逐步停止对排名前 50 的热门网站起作用(截至撰写本文时的参考)。
    • 从 1% 的用户开始使用 Chrome 120(2023 年 11 月底)。
    • 到 2024 年第 3 季度末,最终面向所有用户推出
  • 此外,从 2024 年第 3 季度起,我们打算启动一般阶段,届时卸载操作将逐步停止在任何网站上正常运行。从 1% 的用户开始,到 2025 年第 1 季度末到 100% 结束。

请注意,我们还提供了停用选项菜单,以便在此软性弃用期限内无法提供充足的时间来避免卸载。我们的目标是通过软弃用来告知最后一个阶段(硬性弃用卸载)的时间表,在这个阶段,这些停用选项将被移除或减少。

卸载弃用时间表。

背景

unload 设计为在文档卸载时触发。从理论上讲,它可以用于在用户离开页面时运行代码,或用作会话结束回调。

此事件最常使用的场景包括:

  • 保存用户数据:在您离开页面之前保存数据。
  • 执行清理任务:先关闭打开的资源,然后再放弃网页。
  • 发送分析数据:发送与会话结束时的用户互动相关的数据。

但是,unload 事件非常不可靠

在桌面版 Chrome 和 Firefox 中,unload 相当可靠,但它会阻止使用 bfcache(往返缓存),从而对网站性能产生负面影响。

在移动浏览器中,unload 通常不会运行,因为标签页经常在后台运行,然后被终止。因此,浏览器会优先在移动设备上优先使用 bfcache,而不是 unload,这使得它们更加不可靠。Safari 也在桌面设备上使用了此行为。

Chrome 团队认为,在桌面设备上使用 bfcache 优先(而非 unload)的移动模式也会造成破坏性,因为其在 Chrome(和 Firefox)中更加不可靠,而以前这在 Chrome(和 Firefox)中相当可靠。Chrome 的目标是彻底移除 unload 事件。在此之前,已明确选择不进行弃用的用户可继续在桌面设备上使用这些数据。

为什么要弃用 unload 事件?

弃用 unload 是我们在更广泛的网络层面识别我们现在所面对的一个关键步骤。unload 事件会造成一种对应用生命周期的虚假控制,这种感觉与我们在现代计算世界中浏览网页的方式越来越不一样。

移动操作系统经常冻结或卸载网页以节省内存,桌面浏览器现在也越来越多地采用相同的原因。即使没有操作系统干预,用户自己也经常在没有正式“离开页面”的情况下频繁切换标签页并关闭旧标签页。

移除过时的 unload 事件是一种认知,即我们作为 Web 开发者需要确保我们的范式与现实世界保持一致,而不是依赖于不再适用的过时概念(即使曾经如此)。

unload 事件的替代方案

我们建议使用以下代码,而不是 unload

  • visibilitychange:用于确定页面的公开范围何时会发生变化。当用户切换标签页、将浏览器窗口最小化或打开新页面时,就会发生此事件。将 hidden 状态视为保存应用和用户数据的最后可靠时间。
  • pagehide:用于确定用户何时离开页面。当用户离开页面、重新加载页面或关闭浏览器窗口时,会发生此事件。直接将网页最小化或切换到另一标签页时,系统不会触发 pagehide 事件。请注意,由于 pagehide 不会使网页不符合往返缓存的要求,因此系统有可能在此事件触发后恢复网页。如果您正在清理此事件中的任何资源,则可能需要在页面恢复时恢复这些资源。

beforeunload 事件的用例与 unload 略有不同,因为它是一个可取消的事件。它通常用于在用户离开网站时警告用户有未保存的更改。此事件也不可靠,因为如果后台标签页被终止,该事件就不会触发。建议限制 beforeunload 的使用,并且仅根据条件添加它。请改用上述事件来处理大多数 unload 替换。

如需了解详情,请参阅有关一律不使用 unload 处理程序的建议

检测 unload 的使用情况

我们提供了各种不同的工具来帮助您查找 unload 事件在网页上的显示情况。这样一来,网站就可以了解自己是在使用自己的代码还是通过库使用此事件,因此可能会受到即将进行的弃用的影响。

Chrome DevTools

Chrome 开发者工具包含一项 back-forward-cache 审核功能,可帮助您发现可能导致网页无法储存至往返缓存的问题,包括对 unload 处理程序的使用。

如需测试往返缓存,请按以下步骤操作:

  1. 在您的页面上,打开开发者工具,然后前往 Application >后台服务 >往返缓存

  2. 点击测试往返缓存。Chrome 会自动将您转到 chrome://terms/ 并返回您的网页。或者,您也可以点击浏览器的后退和前进按钮。

如果您的网页不符合往返缓存的条件,往返缓存标签页就会显示问题列表。在可操作下,您可以查看自己是否使用了 unload

Chrome 开发者工具往返缓存测试工具,其中显示了使用卸载处理程序的情况

Reporting API

Reporting API 可与只读权限政策结合使用,以检测网站用户对 unload 的使用情况。

如需了解详情,请参阅使用 Reporting API 查找卸载项

Bfcache notRestoredReasons API

添加到 PerformanceNavigationTiming 类的 notRestoredReasons 属性会报告有关文档是否被禁止在导航中使用 bfcache 以及原因的信息。如需查看使用说明,请点击此处。现有 unload 监听器的响应对象警告如下所示:

{
   children: [],
   id: null,
   name: null,
   reasons: [
     {"reason", "unload-handler"}
   ],
   src: null,
   url: "https://www.example.com/page/"
}

控制对“unload”的访问权限

Chrome 会逐步弃用 unload 事件。在此期间,您可以使用其他工具来控制此行为,并为即将进行的弃用做好准备。请注意,您不应长期依赖这些方法,而应计划尽快迁移到替代方法。

您可以通过启用或停用 unload 处理程序来测试网站在没有这些处理程序的情况下如何运行,以便为即将被弃用的处理程序做好准备。政策有以下不同类型:

  • 权限政策:这是一个平台 API,可供网站所有者通过使用 HTTP 标头在网站或单个网页级别控制对各项功能的访问权限。
  • 企业政策:供 IT 管理员用于为单位或企业配置 Chrome 的工具。您可以通过管理控制台(例如 Google 管理控制台)进行配置。
  • Chrome flag:这可让个人开发者更改 unload 弃用设置,以测试对各个网站的影响。

权限政策

Chrome 115 中新增了权限政策,以允许网站选择停用 unload 处理程序,并立即从 bfcache 中受益以提高网站性能。请参阅这些示例,了解如何为您的网站进行设置。这样,网站就可以在 unload 被弃用之前做好准备。

将在 Chrome 117 中得到扩展,以允许网站执行反向操作,并选择继续尝试触发 unload 处理程序,因为 Chrome 更改了相关默认设置,以使这些处理程序日后不会触发。请参阅这些示例,了解如何继续允许为您的网站触发卸载处理程序。这项选择启用操作不会永久保留,而是应该用于为网站停用 unload 处理程序留出一段时间。

企业政策

如果企业的软件需要依赖 unload 事件才能正常运行,则可以使用 ForcePermissionPolicyUnloadDefaultEnabled 政策来避免由其控制的设备逐步弃用。启用此政策后,unload 将继续默认为所有源站启用。网页仍可根据需要设置更严格的政策。与停用权限政策一样,此工具也是一种可减少潜在的破坏性更改的工具,但不应该无限期使用。

Chrome 标志和命令行开关

与企业政策一样,您可以通过 Chrome 标志和命令行开关为个别用户停用弃用功能:

chrome://flags/#deprecate-unload 设为 enabled 会呈现弃用默认设置,并阻止触发 unload 处理程序。您仍然可以通过“权限政策”逐个网站进行覆盖,但默认情况下仍会继续触发。

这些设置也可以通过命令行开关来控制。

选项比较

下表总结了前面讨论过的选项的不同用途:

提早弃用 提早弃用(有例外情况) 防止弃用,确保迁移时间安全
权限政策
(适用于网页/网站)
企业政策
(适用于设备)
Chrome 标志
(适用于各个用户)
Chrome 命令行开关
(适用于个别用户)

总结

unload 处理程序即将被弃用。它们长期以来一直不可靠,并且无法保证在文档销毁的所有情况下都会触发。此外,unload 处理程序与 bfcache 不兼容。

当前使用 unload 处理程序的网站应通过以下方式为即将进行的弃用做好准备:测试所有现有的 unload 处理程序,移除或迁移这些处理程序;在万不得已的情况下,如果需要更多时间,请推迟弃用。

致谢

感谢 Kenji Baheux、Fergal Daly、Adriana Jara 和 Jeremy Wagner 帮助审阅本文。

主打图片,由 Anja Bauermann 提供,在 Un 创立网站