在实际项目中,如果我想在打开浏览器页面加载时执行某些任务,比如获取当前页面的全部或部分数据,优先想到的事件是onload
,当关闭页面时,我们也常常会使用onunload
事件。但是这两个事件却有一定的局限性,如果第一次加载页面时,onload
事件一定会执行,而如果页面从缓存中获取,onload
事件则无法执行;比如使用onunload
事件,关闭页面时,页面是不会保存在缓存中的;又比如,我想在页面加载解析完,但是外部资源(图片,文件,视频,iframe,脚本,样式表等)还在加载中就去执行某些任务又应该怎么办?下面本文将为大家一一阐述资源状态型事件们,希望走过,路过的同行大神们多多指点👏👏。
今天,我要阐述的资源状态型事件有6个,按照执行先后排序分别是
DOMContentLoaded
load
pageshow
beforeunload
pagehide
unload
DOMContentLoaded
事件。document.addEventListener('DOMContentLoaded', function (event) {
console.log('执行任务');
});
window.addEventListener('load', function(event) {
console.log('所有资源都加载完成');
});
window.addEventListener('error', function(event) {
console.log('资源加载失败');
});
pageshow
事件在页面第一次加载和从缓存中加载时都可以触发。而load
事件,DOMContentLoaded事件
只有在页面第一次加载时才会执行。因为缓存中的样子通常是load事件的监听函数运行后的样子,所以浏览器的渲染机制认为没必要重复执行,当然初始化的javascript脚本也不会执行。persisted
事件对象的属性,返回的数据类型是布尔值,返回false是第一次加载,返回true,是从缓存中加载。getList(){
alert("初始化加载数据")
}
window.addEventListener('pageshow',function(e)
if(e.persisted){
getList()
}
})
beforeunload
事件在窗口,文档,各种资源将要卸载时触发,可以用来防止客户端不小心卸载资源。
returnValue
对象属性,浏览器就会弹出一个二次确认框,询问客户端是否需要卸载该资源,returnValue如果是非空字符串,那么则为客户端指定的内容,点击取消,资源就不会卸载。
但是需要注意的是,大多数浏览器在对话框中只显示默认文本,无论是否设置returnValue,有的浏览器调用event.preventDefault(),也会弹出对话框。
案例
window.addEventListener('beforeunload', function (e) {
var message = '确认关闭窗口?';
e.returnValue = message;
return message;
})
一旦使用了beforeunload事件
修改初始状态,浏览器就不会缓存当前网页
它与unload
事件的区别在于,如果在window对象上定义unload事件的监听函数之后,页面不会保存在缓存中,而使用pagehide
,可以控制页面保是否存在缓存中
persisted事件属性
案例
window.addEventListener('pagehide', function(event){
});
unload
事件在窗口关闭或者document对象将要卸载时触发unload
事件触发,文档处于特殊的状态,所有资源依然存在,但是对用户来说,是看不见的,用户交互会全部无效,这个事件也无法取消,即使在监听函数里面抛出错误,也不能停止文档的卸载。unload
事件,浏览器就不会缓存当前网页window.addEventListener('unload',function(event){
alert('文档将要卸载')
})