背景

为了使页面加载更快,常常将一些不重要的第三方脚本在页面完成加载后进行懒加载。

// 做一些不影响业务的事情
window.addEventListener('load', () => {
// 懒加载埋点分析
loadScript({
url: 'https://www.domain.com/test.js',
timeout: 10000
}).then(() => {
console.log('ok');
}).catch(console.error);
// 其他
// ...
});

因为 load 事件只会触发一次,如果在懒加载(load)的脚本中又有懒加载的脚本,就会导致内嵌的脚本无法触发。

// 做一些不影响业务的事情
window.addEventListener('load', () => {
window.addEventListener('load', () => {
// 不能执行了
console.log('我无了');
});
});

解决方案

在 HTML 中 document.readyState 属性可以反应当前页面的加载状态。

  • uninitialized - Has not started loading yet
  • loading - Is loading
  • loaded - Has been loaded
  • interactive - Has loaded enough and the user can interact with it
  • complete - Fully loaded

如果属性为 complete 则可认为当前页面已经加载完成。

/**
* 加载完成
* @param timeout {Number} 超时时间 / 单位:秒
* @return {Promise<Boolean>} document is loaded?
*/
function windowLoaded(timeout = 90) {
let loaded, loadFail;
const status = new Promise((resolve, reject) => {
loaded = resolve;
loadFail = reject;
});
if (document.readyState === 'complete') {
loaded('complete');
} else {
window.addEventListener('load', () => loaded('load'));
}
// 超过 timeout 秒后加载失败
setTimeout(() => loadFail('timeout'), timeout * 1000);
return status;
} // load
windowLoaded()
.then(res => {
console.log(res);
})
.catch(console.error);

参考

HTML DOM readyState Property

What is the non-jQuery equivalent of '$(document).ready()'?

PerformanceTiming.loadEventEnd

Window: load event

版权声明

本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者后除和本文原始地址:https://blog.mazey.net/1994.html

如何知道 window 的 load 事件已经触发的更多相关文章

  1. JQuery 在$(window).load() 事件中 不运行 $(window).resize()

    本文转载至: http://stackoverflow.com/questions/2597152/jquery-window-resize-doesnt-work-on-load 原文标题   :J ...

  2. vb.net WPF webbrowser window.close 关闭后不触发 WindowClosing 事件 WNDPROC解决方式

     vb.net WPF webbrowser window.close 关闭后不触发 WindowClosing 事件 WNDPROC解决方式 #Region "WPF 当浏览器窗体关闭 ...

  3. vue -vantUI tab切换时 list组件不触发load事件解决办法

    最近由于公司项目需要,用vue写了几个简单的页面.用到了vantUI List 列表 瀑布流滚动加载,用于控制长列表的展示 当列表即将滚动到底部时,会触发事件并加载更多列表项. (页面加载完成后默认会 ...

  4. jQuery中ready与load事件

    jQuery中ready与load事件(来自慕课网) jQuery有3种针对文档加载的方法 $(document).ready(function() { // ...代码... }) //docume ...

  5. jQuery 的ready事件和 JavaScript 的load事件对比

    为了理解2个事件的异同,先了解一下HTML文档加载顺序 HTML DOM文档加载步骤 HTML DOM文档加载是按顺序执行的,这与浏览器的渲染方式有关,一般浏览器渲染操作的顺序大致按如下几个步骤 1, ...

  6. jquery load ($.load) 事件用法与分析(转)

    首先我们需要清楚的是jquery load方法是对jQuery.ajax()进行封装以方便我们使用的一个方法,当我们需要处理较为复杂的逻辑时候,还是需要用到jQuery.ajax()这个比较全面的方法 ...

  7. jQuery 中ready与load事件

    jquey有3种针对文档加载的方法: //document ready $(document).ready(function(){ //...代码... }) //document ready 简写 ...

  8. doment ready事件和load事件的区别及实现

    从2017年9月至今工作中大部分使用react,前端渲染的一些基础性知识记忆不是很深刻了.面试**公司的时候,碰到"document ready和load的区别,以及document rea ...

  9. 彻底解决低端安卓手机touchend事件不触发(考虑scroll)

    本次移动端开发时遇见了安卓4.2系统不能触发touchend的问题,有以下需求. 1. 横滑轮播图 2.下拉刷新页面内容 3.body滚动条不能失效 开始在轮播图touchmove事件中阻止了浏览器默 ...

  10. jQuery学习一:jQuery中的ready和load事件

    //ready事件 $(document).ready(function(){ 代码........ }); //ready事件简写: $(function(){ 代码........ }); //l ...

随机推荐

  1. 商店销售预测(回归&随机森林)

    ​ 目录 一.题目概要 二.导入包和数据集 三.数据处理 四.描述性分析 五.探索性数据分析 六.模型一:线性回归 七.模型2:随机森林 一.题目概要 在Kaggle竞赛中,要求我们应用时间序列预测, ...

  2. centos7.x及centos8.x安装新版docker

    前置步骤 # 如之前安装过docker,请先删除 yum remove docker docker-common docker-selinux docker-engine centos7 # cent ...

  3. go语言中的数据类型

    数据类型可分为四类 基础类型 数字.字符串和布尔型 复合类型 数组.结构体 引用类型 指针.切片.map.函数.通道channel 接口类型 interface

  4. c# rdkafka 设置偏移量(offset)

    参考资料: librdkafka: 如何设置Kafka消费者订阅消息的起始偏移位置 领导要求kafka消费者端消费最新的数据. 不知道怎么设置偏移量,查了资料. 用惯了封装好的东西,都不知道怎么设置了 ...

  5. 3、dubbo核心用法

    https://dubbo.apache.org/zh/docs/v2.7/user/examples/preflight-check/ 1.启动时检查 在启动时检查依赖的服务是否可用 Dubbo 缺 ...

  6. centos 定时任务

    想法 看见一个别的项目,每天扒bing的背景,然后 生成个列表,然后数据就一天天的增加,创意非常好 有时间研究下 关键字 centos 定时任务 基于centos7系统定时任务创建 https://b ...

  7. 28_FFmpeg音视频解封装格式

    目录 一.什么是封装格式 二.使用 FFmpeg 实现解封装 1.创建解封装上下文打开流媒体文件 2.检索流信息 2.1.检索流信息 2.2.导出流信息到控制台 3.初始化音频解码器查找合适的音视流和 ...

  8. python高级技术(网络编程一)

    一  socket是什么 链接socket前要熟悉计算机网络基础请看链接:https://www.cnblogs.com/coderxueshan/p/17344739.html Socket是应用层 ...

  9. 记录--axios和loading不得不说的故事

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 loading的展示和取消可以说是每个前端对接口的时候都要关心的一个问题.这篇文章将要帮你解决的就是如何结合axios更加简洁的处理loa ...

  10. 记录--两行CSS让页面提升了近7倍渲染性能

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 对于前端人员来讲,最令人头疼的应该就是页面性能了,当用户在访问一个页面时,总是希望它能够快速呈现在眼前并且是可交互状态.如果页面加载 ...