美文网首页前端开发笔记
如何知道 window 的 load 事件已经触发

如何知道 window 的 load 事件已经触发

作者: 后除 | 来源:发表于2021-03-15 17:26 被阅读0次

背景

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

// 做一些不影响业务的事情
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 事件已经触发

    背景 为了使页面加载更快,常常将一些不重要的第三方脚本在页面完成加载后进行懒加载。 因为 load 事件只会触发一...

  • GlobalEventHandlers.onload

    当 window load 事件触发时,funcRef 方法会被调用。 funcRef 是窗口加载事件触发时调...

  • DOM事件

    UI事件load 页面加载后触发 或者说是ing 嵌入的内容unload 当页面完全卸载在window上触发 同上...

  • 事件(下)

    事件类型 UI事件 load:当页面完全加载后在window上面触发,当所有框架加载完成后在框架集上触发,图像加载...

  • window.onload和$(document).ready有

    window.onload:在文档装载完成后会触发 load 事件。此时,在文档中的所有对象都在DOM中,所有图...

  • dom事件机制

    事件触发三阶段window 往事件触发处传播,遇到注册的捕获事件会触发传播到事件触发处时触发注册的事件从事件触发处...

  • 事件

    事件触发的三个阶段: window 往事件触发处传播,遇到注册的捕获事件会触发 传播到事件触发处时触发注册的事件 ...

  • 浏览器相关知识点小结

    事件机制 事件触发的三个阶段:window 往事件触发处传播,遇到注册的捕获事件会触发传播到事件触发处时触发注册的...

  • 2020-06-10 浏览器

    事件机制 1、事件触发三阶段 ● window 往事件触发处传播,遇到注册的捕获事件会触发 ● 传播到事件触发处触...

  • 事件模型

    DOM事件三阶段: window 往事件触发处传播,遇到注册的捕获事件会触发 传播到事件触发处时触发注册的事件 从...

网友评论

    本文标题:如何知道 window 的 load 事件已经触发

    本文链接:https://www.haomeiwen.com/subject/vkakcltx.html