Window: unload 事件
已弃用:此功能不再推荐使用。虽然一些浏览器可能仍然支持它,但它可能已从相关网络标准中删除,可能正在被删除过程中,或者可能只保留出于兼容性目的。避免使用它,如果可能,更新现有的代码;请查看此页面底部的兼容性表格,以指导你的决策。请注意,此功能可能随时停止工作。
警告:开发者应避免使用此事件。请参阅下面的“使用说明”。
当文档或子资源正在卸载时,unload
事件会被触发。
它在以下事件后被触发
beforeunload
(可取消事件)pagehide
文档处于以下状态
- 所有资源仍然存在(img、iframe 等)
- 最终用户再也看不到任何内容
- UI 交互无效(
window.open
,alert
,confirm
等) - 错误不会阻止卸载工作流程
请注意,unload 事件也遵循文档树:父框架卸载将在子框架 unload
**之前** 发生(参见下面的示例)。
语法
在像 addEventListener()
这样的方法中使用事件名称,或设置事件处理程序属性。
addEventListener("unload", (event) => {});
onunload = (event) => {};
事件类型
一个通用的 Event
。
事件处理程序别名
除了 Window
接口之外,事件处理程序属性 onunload
也在以下目标上可用
使用注意事项
开发者应避免使用此事件。
特别是在移动设备上,unload
事件不会可靠地触发。例如,在以下情况下,unload
事件根本不会触发
- 移动用户访问你的页面。
- 然后,用户切换到另一个应用程序。
- 稍后,用户从应用程序管理器中关闭浏览器。
此外,unload
事件与 后退/前进缓存 (bfcache) 不兼容,因为许多使用此事件的页面都假设在事件触发后页面将不再存在。为了解决这个问题,一些浏览器(例如 Firefox)在页面有 unload 监听器的情况下不会将页面放入 bfcache 中,这对性能不利。其他浏览器,例如 Chrome,在用户导航离开时不会触发 unload
。
用于表示用户会话结束的最佳事件是 visibilitychange
事件。在不支持 visibilitychange
的浏览器中,下一个最佳替代方案是 pagehide
事件,它也不会可靠地触发,但它与 bfcache 兼容。
如果你是专门想检测页面卸载事件,最好监听 pagehide
事件。
有关与 unload
事件相关问题的更多信息,请参阅 页面生命周期 API 指南。
示例
<!doctype html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<title>Parent Frame</title>
<script>
window.addEventListener("beforeunload", (event) => {
console.log("I am the 1st one.");
});
window.addEventListener("unload", (event) => {
console.log("I am the 3rd one.");
});
</script>
</head>
<body>
<iframe src="child-frame.html"></iframe>
</body>
</html>
下面是 child-frame.html
的内容
<!doctype html>
<html lang="en-US">
<head>
<meta charset="UTF-8" />
<title>Child Frame</title>
<script>
window.addEventListener("beforeunload", (event) => {
console.log("I am the 2nd one.");
});
window.addEventListener("unload", (event) => {
console.log("I am the 4th and last one…");
});
</script>
</head>
<body>
☻
</body>
</html>
当父框架卸载时,事件将按照 console.log()
消息中描述的顺序触发。
规范
规范 |
---|
HTML 标准 # event-unload |
HTML 标准 # handler-window-onunload |
浏览器兼容性
BCD 表格只在启用了 JavaScript 的浏览器中加载。
另请参阅
- 相关事件:
DOMContentLoaded
,readystatechange
,load
- 卸载文档 — 卸载文档
visibilitychange
事件。-
不要丢失用户和应用程序状态,请使用页面可见性详细解释了为什么你应该使用
visibilitychange
而不是beforeunload
/unload
。 - 页面生命周期 API提供了有关在你的 Web 应用程序中处理页面生命周期行为的最佳实践指南。
- PageLifecycle.js:一个处理页面生命周期行为的跨浏览器不一致的 JavaScript 库。
- 后退/前进缓存解释了后退/前进缓存是什么,以及它对各种页面生命周期事件的影响。