You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

浏览器在资源加载间隙出现无操作耗时?是否因onload触发延迟?

为什么通过window.onload延迟加载jQuery时,浏览器会出现大量"无操作"耗时?

首先你的观察完全准确——这种看似"无操作"的耗时,确实和window.onload事件的触发机制直接相关。

先搞懂window.onload的触发时机

window.onload是页面加载生命周期里最靠后的事件之一:它必须等待页面中所有资源(包括图片、样式表、字体、子框架等所有外部依赖)完全加载完成,并且DOM和CSSOM都完成构建、渲染树生成并完成首次绘制后,才会被触发。

哪怕你的页面只有几行HTML骨架、没有任何额外资源,浏览器依然要走完整个页面加载的标准流程:

  • 解析HTML,构建DOM树(这一步在你的场景里极快)
  • 触发DOMContentLoaded事件(DOM构建完成就触发,无需等待资源加载)
  • 进入"等待所有资源加载完成"的阶段——哪怕没有资源,浏览器也要完成一系列收尾检查(比如确认没有遗漏的资源请求、验证页面加载状态),才会触发window.onload

这段从DOM构建完成到onload触发的间隔,就是你看到的"大量无操作耗时"。

怎么优化这个等待时间?

如果你的目标只是尽早加载jQuery,完全没必要等到window.onload。改用DOMContentLoaded事件会更合适——它的触发时机远早于onload,只要DOM树构建完成就会触发,不用等待任何外部资源加载。

修改后的代码示例:

function downloadJSAtOnload(){
  var b = document.getElementsByTagName('body')[0];
  var s = document.createElement("script");
  s.async = true;
  s.src = "jquery.min.js"
  b.appendChild(s);
}
if (window.addEventListener){
  // 用DOMContentLoaded替代load事件
  window.addEventListener('DOMContentLoaded', downloadJSAtOnload, false);
}else if (window.attachEvent){
  // 兼容IE8及更早版本
  window.attachEvent('onreadystatechange', function(){
    if(document.readyState === 'complete') downloadJSAtOnload();
  });
}else{
  document.onreadystatechange = function(){
    if(document.readyState === 'complete') downloadJSAtOnload();
  };
}

另外,你已经给脚本加上了s.async = true,这意味着脚本下载过程不会阻塞页面渲染,结合更早的触发时机,就能大幅减少你观察到的"无操作"等待时间。

内容的提问来源于stack exchange,提问作者Alvaro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:36:55