现象:在一个 Hybrid 应用中,用户反馈弱网条件下页面的进度条总是不消失,最后发现是页面接口先于其他资源返回,而接口中包含大量图片导致了 onload 会推迟,从而客户端控制的进度条不会消失,页面调用客户端的方法不会执行。

先放结论
onload的触发时机: JS 加载并执行完毕且页面中所有外链资源加载完成之后大约 3 - 4ms(这个值跟机型和浏览器有关)

最佳实践: JS代码的执行要放到onload里。如果是服务端渲染带图片的列表,图片最好由JS异步加载,避免阻塞onload。

1、onload不是立即触发的

请问下面哪个alert先触发?

window.onload = function() {alert('onload');
}
setTimeout(function(){alert('timeout');
}, 2)

答案是 timeout 先触发。而在我的电脑上,把 timeout 的值调成 5 或 5 以上,就是 onload 先触发了。

2、JS的执行对onload有影响

你会发现 onload 会等很久才触发,因此JS的执行最好放在onload之后。

3、动态加载的资源可能对onload产生影响

<body></body>
<script>window.onload = function() {alert('onload');}document.body.innerHTML = '<img src="a.png"> .... <img src="z.png">';
</script>

我们把网速调的慢一点,我们会很清晰的发现这种 JS 动态加进去的图片也会阻塞 onload,只有 a-z 图片都加载完成,onload 才会触发。而我们改成下面:

window.onload = function() {setTimeout(function() {document.body.innerHTML = '<img src="a.png"> .... <img src="z.png">';}, 10)alert('onload');
}

这时就会发现,onload 马上就触发了,不必等待图片加载完成。

再讲一个更实际的例子:

<img src="aaa.png">
<script>
window.onload = function() {alert('onload');
}
$.ajax({url: imgList,success: function(arr) {arr.forEach(function() {$('body').append('<img src="' + arr.imgUrl + '">')})}
})
</script>

假设 aaa.png 加载时间为 100ms,ajax 接口返回时间为 50ms,那么假设 imgList 中有 100 张图片,那么 onload 的时间就会被推迟到这 100 张图片都加载完成之后。

而如果 aaa.png 加载时间为 50ms,接口请求为 100ms 的时候,就不会有这个问题。但是我们没法保证接口请求一定慢于图片请求。

因此带图片的列表请求需要放在 window.onload 之后执行。

4、onload和客户端方法的对应

iOS 中判断 webview 加载完成的 webViewDidFinishLoad 方法,Android 中判断 webview 加载完成的 onPageFinished 方法本质触发时机上都对应页面上的 window.onload,一般来说会稍晚于 window.onload(某些特殊情况会早于 window.onload,比如页面里有 iframe 等情况)。
也就是说 对 onload 有影响的因素也同样会影响这些 Native 方法。而在 Hybrid 开发中,一些 Native 和 Web 之间的交互和调用往往要在webViewDidFinishLoad / onPageFinished 之后。因此如果 onload 的触发被推迟了,那么这些 Native 相关的调用也都会被推迟。
因此如果是Hybrid应用,尤其要注意让onload尽快触发。

5、百度统计对onload的影响

var _hmt = _hmt || [];(function() {var hm = document.createElement("script");hm.src = "https://hm.baidu.com/hm.js?2fdsasa8f9f2f0e59e7db6c398edfbfcb1f";var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(hm, s);
})();

上面是百度统计的代码,我们可以看到它动态加载了一个 script,而这个 script 会马上以一个小 gif 的形式发送一个上报请求,经过测试,如果页面上没有其它元素,这个 小 gif 加载完成后才会触发 onload,那么总加载时间就是 script 加载时间 + gif 加载时间。
因此应该尽量把百度统计代码提前,避免百度统计拖慢 onload 时间。百度统计官方也是建议将统计代码放在 head 中。

现实示例:
我们把网速调整到slow 3G模拟弱网环境,测试一个线上的带图片列表的项目: 下面是把JS代码放在onload里执行的效果,7秒 左右onload触发。


下面是把JS代码放在onload外,直接顺序执行的效果,因为要等待所有图片加载完成,等了 44秒 左右onload才触发。

深入理解 window.onload相关推荐

  1. JavaScript的window.onload事件的理解

    window.onload()的作用 window.onload() 方法用于在网页加载完毕后立刻执行的操作,即当 HTML 文档加载完毕后,立刻执行某个方法. window.onload() 通常用 ...

  2. window.onload 和 body.onload 相互覆盖的本质

    从根源上讲,window.onload和<body οnlοad="alert('test');"> 所绑定的对象都是window ,body是没有onload事件的, ...

  3. JQuery的$(document).ready(function(){})与JS的window.onload 的各自优势!

    由于项目需要,使用JQuery也有相当一段时间了.由于经常要处理DOM节点加载.图片显示以及动态资源请求,所以对$(document).ready(function(){})理解也越来越深了,所有在此 ...

  4. js window.onload 加载多个函数和追加函数

    平时做项目 经常需要使用window.onload, 用法如下: function func(){alert("this is window onload event!");ret ...

  5. JavaScript 中的 window onload 应该什么时候写

    JavaScript 中的 window onload 应该什么时候写 1. 页内式 JS 代码 1.1 页内式 JS 代码写在 head 内部 如果 script 标签写在 head 标签内部,则位 ...

  6. 【JAVAScript】【3】校验码实例(包含函数嵌套、闭包和window.onload)

    JAVAScript 校验码实例(包含函数嵌套.闭包.方法和window.onload) 这里写目录标题 JAVAScript 校验码实例(包含函数嵌套.闭包.方法和window.onload) 一. ...

  7. Javascrapy的window onload()函数用法

    window.onload()通常用于<body>元素,在页面完全加载后(包括图片,css文件等等)执行脚本代码. 详情:https://www.runoob.com/w3cnote/ja ...

  8. window.onload和jquery中$(function(){ })的区别

    为什么80%的码农都做不了架构师?>>>    今天调试js发现一个问题,我想页面加载完之后才执行我写的js方法,首先我用jqery中$(function(){ })调试了N久都没有 ...

  9. $(document).ready()和window.onload的区别

    来源于: The window.onload event fires when a document is completely downloaded to the browser. This mea ...

最新文章

  1. vnc用户名 查看linux_linux 查看vnc服务器
  2. cacti监控一览无余
  3. 讯飞输入法皮肤制作_讯飞输入法拍了拍你 粤语专项计划进展神速应用广泛
  4. C#中要使一个类支持FOREACH遍历,实现过程怎样? [转]
  5. 使用Kubernetes里的job计算圆周率后2000位
  6. 不要62 HDU - 2089【数位dp】
  7. 浅谈,JavaScript 运行机制和Event Loop
  8. https证书设置以及设置301跳转
  9. MyBatisPlus学习
  10. 4: Consolidating Datasets ( Challenge: Data Munging Using The Command Line)
  11. 上传doc,pdf,ppt,png,jpg,html文件并解析内容
  12. 基于神经网络和相关性分析的数学建模思路分享
  13. hdu 6184 Counting Stars(三元环计数)
  14. 常见鸟的种类及特点_鸟的种类(常见鸟的名字大全)
  15. android游戏手柄怎么用,王者荣耀怎么用手柄玩?手柄游戏详细教程
  16. [RoCE]RDMA over Converged Ethernet模式以及配置
  17. 炫“库”行动-人大金仓有奖征文-数据库的备份及恢复
  18. English trip V1 - 10.Family Ties 家庭关系 Teacher:Emily Key: Possessive s (所有格 s)
  19. WORD精灵:将Word文档中的标点符号统一为全角或者半角
  20. ug8.0更改计算机名,Ug8.0电脑名改了怎么处理

热门文章

  1. 这社会并不是靠努力和辛苦赚钱的
  2. TeamSpeak 服务器LINUX下配置
  3. 计算机少年宫活动计划,少年宫活动计划3篇
  4. 流氓软件卷土重来 8749上演黑吃黑
  5. Linux怎么彻底删除用户
  6. APPLE  电脑型号大全
  7. codeforces1438C Engineer Artem
  8. java批量添加注解到所有业务接口
  9. 人生最好是随意,人生不可太随意!
  10. mysql(zip版)下载安装教程