博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
script的加载方式与执行
阅读量:6067 次
发布时间:2019-06-20

本文共 947 字,大约阅读时间需要 3 分钟。

hot3.png

script一般是阻塞式加载的,H5新增了asyncdefermodule特性,可用于异步加载/延迟执行:

schematic diagram

  • async 属性是指当这个 script 可用时,就异步执行它
  • defer 属性是指当页面被解析完毕后,才能执行
  • 如果以上两个属性都没有,则立刻下载并执行,同时阻止页面的解析,直到执行完毕
  • module 属性是指关联脚本全部下载后才会执行,且不受defer影响

标准定义详见:

关于async和defer

aysnc 的 script 不能保证在 jQuery(document).ready 的时候是可用的,而 defer 可以。

给出了如下测试结果:

jQuery(document).ready 的执行时序。Chrome 下是:defer -> jQuery(document).ready -> async -> window.onload。Firefox 下是:async -> defer -> jQuery(document).ready -> window.onload。我又把 JavaScript 的下载速度变慢,发现结果仍然没有变化。

所以使用async的时候需要谨慎,全局的属性和方法最好提前定义。

动态加载javascript基本

还有一个常用的技巧是,在需要的时候动态加载脚本——比如日期插件、地区选择插件,等等——以便加快页面载入速度。也提到了相关方法及一些坑。

不过这里我关心的是执行时机。onload事件被认为是,但实际使用中发现,此时它仍有可能未完成初始化,如果立即执行callback可能会出问题,对于体积较大的插件(如echarts),出错的概率明显变大。

所以,应当把onload当做loaded事件处理。然后使用setTimeout方法延迟执行callback,以保障它真的执行完毕了。不过时间阈值不好定,这也是个坑。

后来发现了beforescriptexecuteafterscriptexecute,<del>但貌似只有Firefox支持</del>当前无浏览器支持,而且,暂时是无望了。

暂时没找到更好的办法。欢迎大家出主意:-)

转载于:https://my.oschina.net/u/2324376/blog/692957

你可能感兴趣的文章
对象属性访问的总结
查看>>
深搜广搜
查看>>
VisualStudio自定义代码段_方法二
查看>>
WC2008游览计划(BZOJ2595)
查看>>
消息队列
查看>>
《Android深度探索》第六章心得体会
查看>>
嵌入式服务器jetty,让你更快开发web
查看>>
【原创】基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结(二)
查看>>
【HDOJ】1493 QQpet exploratory park
查看>>
【HDOJ】3553 Just a String
查看>>
一共81个,开源大数据处理工具汇总(上)(转)
查看>>
并查集模版
查看>>
vue 使用a+ router.push的形式跳转时,地址栏不显示参数
查看>>
findOneAndUpdate的用法详解
查看>>
初始化函数1
查看>>
Jenkins自动发布代码实战篇
查看>>
VMware网络配置
查看>>
微信小程序怎么做出前端table的效果
查看>>
使用guava实现找回密码的tokenCache以及LRU算法
查看>>
微软软件开发技术二十年回顾-.NET框架篇
查看>>