背景

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

// 做一些不影响业务的事情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;}// loadwindowLoaded()  .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

©著作权归作者所有:来自51CTO博客作者mazey的原创作品,如需转载,请注明出处,否则将追究法律责任

你的鼓励让我更有动力

赞赏

0人进行了赞赏支持

更多相关文章

  1. DolphinDB客户端软件教程
  2. Linux中shell脚本使用
  3. Spark 如何摆脱java双亲委托机制优先从用户jar加载类?
  4. 前端用Ajax实现数据异步加载,无刷新分页(核心思路为 事件派发+事件
  5. 请确定所有请求的文件系统驱动程序已加载,且此卷未损坏 chkdsk无
  6. 话说 类加载过程 第二篇
  7. Centos7 下安装NFS+Heartbeat+DRBD
  8. 30个Linux Shell脚本经典案例(下)
  9. Composer常用指令、安装组件、自动加载器使用方式与更新方法

随机推荐

  1. 深入Android 【一】 —— 序及开篇
  2. TextView 在xml文件中的解释 android
  3. android service 生命周期
  4. Android M 新的运行时权限开发者需要知道
  5. Android Studio系列教程六--Gradle多渠道
  6. Android(安卓)获取网络时间
  7. Android中的线程与进程之间的关系简单解
  8. 谁说Android的动画不廉价(四)之元素动画
  9. Android 使用OpenCV的三种方式(Android S
  10. 关于Android初级逻辑思考(续)——android文