深入理解 window.onload 深入理解课文对朗读时更好的处理重音有何帮助
suiw9 2024-11-09 14:51 46 浏览 0 评论
现象:在一个 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有影响
window.onload = function() { alert('onload'); } var a for (var i = 0; i < 100000000; i++) { a = a + i; }
你会发现 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才触发。
希望本文能帮助到您!
点赞+转发,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓-_-)
关注 {我},享受文章首发体验!
每周重点攻克一个前端技术难点。更多精彩前端内容私信 我 回复“教程”
原文链接:http://eux.baidu.com/blog/fe/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3window.onload
作者:谢郁
相关推荐
- 5款Syslog集中系统日志常用工具对比推荐
-
一、为何要集中管理Syslog?Syslog由Linux/Unix系统及其他网络设备生成,广泛分布于整个网络。因其包含关键信息,可用于识别网络中的恶意活动,所以必须对其进行持续监控。将Sys...
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
-
简介今天给大家推荐一个开源的数据库管理工具——DBeaver。它支持多种数据库系统,包括Mysql、Oracle、PostgreSQL、SLQLite、SQLServer等。DBeaver的界面友好...
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
-
NavicatPremium,一款集数据迁移、数据库管理、SQL/查询编辑、智能设计、高效协作于一体的全能数据库开发工具。无论你是MySQL、MariaDB、MongoDB、SQLServer、O...
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
-
一、什么场景使用MongoDB?...
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
-
作为一名在NoSQL丛林中披荆斩棘的数据猎人,没有比GUI工具更称手的瑞士军刀了。本文将带你围观五款主流MongoDB管理神器的特性与暗坑,附赠精准到扎心的吐槽指南一、MongoDBCompass:...
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
-
前言最近在做neo4j相关的同步处理,因为产线的可视化工具短暂不可用,发现写起来各种脚本非常麻烦。...
- solidworks使用心得,纯干货!建议大家收藏
-
SolidWorks常见问题...
- 统一规约-关乎数字化的真正实现(规范统一性)
-
尽管数字化转型的浪潮如此深入人心,但是,对于OPCUA和TSN的了解却又甚少,这难免让人质疑其可实现性,因为,如果缺乏统一的语义互操作规范,以及更为具有广泛适用的网络与通信,则数字化实际上几乎难以具...
- Elasticsearch节点角色配置详解(Node)
-
本篇文章将介绍如下内容:节点角色简介...
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
-
作者:DaisyH8746在张大妈上已经混迹很久了,有事没事看看“什么值得买”已渐渐成了一种生活习惯,然而却从来没有想过自己要写篇文章发布上来,直到由于我产前功课做得“太过认真”(认真到都有点过了,...
- 比任何人都光彩照人的假期!水润、紧致的肌肤护理程序
-
图片来源:谜尚愉快的假期临近了。身心振奋的休假季节。但是不能因为这种心情而失去珍贵的东西,那就是皮肤健康。炙热的阳光和强烈的紫外线是使我们皮肤老化的主犯。因此,如果怀着快乐的心情对皮肤置之不理,就会使...
- Arm发布Armv9边缘AI计算平台,支持运行超10亿参数端侧AI模型
-
中关村在线2月27日消息,Arm正式发布Armv9边缘人工智能(AI)计算平台。据悉,该平台以全新的ArmCortex-A320CPU和领先的边缘AI加速器ArmEthos-U85NPU为核心...
- 柔性——面向大规模定制生产的数字化实现的基本特征
-
大规模定制生产模式的核心是柔性,尤其是体现在其对定制的要求方面。既然是定制,并且是大规模的定制,对于制造系统的柔性以及借助于数字化手段实现的柔性,就提出了更高的要求。面向大规模定制生产的数字化业务管控...
- 创建PLC内部标准——企业前进的道路
-
作者:FrankBurger...
- 标准化编程之 ----------- 西门子LPMLV30测试总结
-
PackML乃是由OMAC开发且被ISA所采用的自动化标准TR88.00.02,能够更为便捷地传输与检索一致的机器数据。PackML的主要宗旨在于于整个工厂车间倡导通用的“外观和感觉”,...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
-
- 5款Syslog集中系统日志常用工具对比推荐
- 跨平台、多数据库支持的开源数据库管理工具——DBeaver
- 强烈推荐!数据库管理工具:Navicat Premium 16.3.2 (64位)
- 3 年 Java 程序员还玩不转 MongoDB,网友:失望
- 拯救MongoDB管理员的GUI工具大赏:从菜鸟到极客的生存指南
- mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
- solidworks使用心得,纯干货!建议大家收藏
- 统一规约-关乎数字化的真正实现(规范统一性)
- Elasticsearch节点角色配置详解(Node)
- 产前母婴用品分享 篇一:我的母婴购物清单及单品推荐
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)