事件
生命周期的各个阶段都有自己的事件,以供开发者指定监听函数。这些事件里面,只有两个是新定义的(freeze
事件和resume
事件),其它都是现有的。
注意,网页的生命周期事件是在所有帧(frame)触发,不管是底层的帧,还是内嵌的帧。也就是说,内嵌的<iframe>
网页跟顶层网页一样,都会同时监听到下面的事件。
focus 事件
focus
事件在页面获得输入焦点时触发,比如网页从 Passive 阶段变为 Active 阶段。
blur 事件
blur
事件在页面失去输入焦点时触发,比如网页从 Active 阶段变为 Passive 阶段。
visibilitychange 事件
visibilitychange
事件在网页可见状态发生变化时触发,一般发生在以下几种场景。
- 用户隐藏页面(切换 Tab、最小化浏览器),页面由 Active 阶段变成 Hidden 阶段。
- 用户重新访问隐藏的页面,页面由 Hidden 阶段变成 Active 阶段。
- 用户关闭页面,页面会先进入 Hidden 阶段,然后进入 Terminated 阶段。
可以通过document.onvisibilitychange
属性指定这个事件的回调函数。
freeze 事件
freeze
事件在网页进入 Frozen 阶段时触发。
可以通过document.onfreeze
属性指定在进入 Frozen 阶段时调用的回调函数。
function handleFreeze(e) {
// Handle transition to FROZEN
}
document.addEventListener('freeze', handleFreeze);
# 或者
document.onfreeze = function() { … }
这个事件的监听函数,最长只能运行500毫秒。并且只能复用已经打开的网络连接,不能发起新的网络请求。
注意,从 Frozen 阶段进入 Discarded 阶段,不会触发任何事件,无法指定回调函数,只能在进入 Frozen 阶段时指定回调函数。
resume 事件
resume
事件在网页离开 Frozen 阶段,变为 Active / Passive / Hidden 阶段时触发。
document.onresume
属性指的是页面离开 Frozen 阶段、进入可用状态时调用的回调函数。
function handleResume(e) {
// handle state transition FROZEN -> ACTIVE
}
document.addEventListener("resume", handleResume);
# 或者
document.onresume = function() { … }
pageshow 事件
pageshow
事件在用户加载网页时触发。这时,有可能是全新的页面加载,也可能是从缓存中获取的页面。如果是从缓存中获取,则该事件对象的event.persisted
属性为true
,否则为false
。
这个事件的名字有点误导,它跟页面的可见性其实毫无关系,只跟浏览器的 History 记录的变化有关。
pagehide 事件
pagehide
事件在用户离开当前网页、进入另一个网页时触发。它的前提是浏览器的 History 记录必须发生变化,跟网页是否可见无关。
如果浏览器能够将当前页面添加到缓存以供稍后重用,则事件对象的event.persisted
属性为true
。 如果为true
。如果页面添加到了缓存,则页面进入 Frozen 状态,否则进入 Terminatied 状态。
beforeunload 事件
beforeunload
事件在窗口或文档即将卸载时触发。该事件发生时,文档仍然可见,此时卸载仍可取消。经过这个事件,网页进入 Terminated 状态。
unload 事件
unload
事件在页面正在卸载时触发。经过这个事件,网页进入 Terminated 状态。