Script的加载方法小结


Posted in Javascript onJanuary 12, 2011

1.静态加载
CSS,图片资源文件在页面渲染过程中可以并行下载,不会阻塞。在IE8,FF下,也可以支持JS的并行下载。尽管页面的JS下载加速了,但是JS对页面渲染的阻塞还是依然存在的,只有JS加载完毕了,页面的剩余部分才能继续渲染。放在Head部分的Script是最为恶劣的,因为对页面来说,Head部分是require的,是后部分所必须的,Head部分不加载完毕,Body部分不会开始解析,Body解析之前,页面是空白的。静态Script放到页面的哪部分来说都是阻塞,从浏览器实现的角度来说很好理解,因为JS代码中完全有可能修改页面元素影响Dom结构。因为浏览器对JS行为的不可预知,所以只好等前面的Script加载完毕后再继续渲染。所以最佳实践往往是说将Script放到页面底部</body>附近。
JS加载对前台性能的影响,雅虎优化原则之一是减少Http请求数,压缩JS,合并JS,减少JS数。
若是业务上有很多独立模块化的JS需要加载,可以考虑在线打包的方案。

2。延迟加载
W3C标准HTML4.01给Script标签定义了一个defer属性,指明该JS不会改变Dom的content,浏览器可继续解析和渲染,无需阻塞在该Script。
http://www.w3.org/TR/1999/REC-html401-19991224/interact/scripts.html

 Script的加载方法小结
但部分浏览器并不支持该属性。所以它不是个很好的跨浏览器解决方案。

3.动态加载


<script type="text/javascript"> 
var js = document.createElement("script"); 
js.src = '**.js'; 
document.getElementsByTagName("head")[0].appendChild(js); 
</script>

这段代码创建了script标签,并插入这条标签到文档中。关键在于,这个脚本的加载时异步的,不会影响页面渲染的进程,不会阻塞页面内容的展示。这样的方式尽管不会阻塞页面资源的加载,但却可能会阻塞其他的script脚本,不同浏览器在这点上的表现是有非常大的差异的,参看这篇文章动态引入的外部 JS 文件在各浏览器中的加载顺序不一致
有两点非常突出,

1.同样的动态加载代码,不同浏览器对动态加载进来的js,是否阻塞下条Script标签的表现是不一样的

Script的加载方法小结

2.实现动态加载的那段代码顺序不同,对同一个浏览器来说,结果可能是非常迥异的,
如:

Script的加载方法小结 Script的加载方法小结

代码顺序的调换,IE的表现就不一样

所以,对动态加载脚本,需要重点关注的一个问题是,所动态加载的JS脚本的接口依赖问题。这个问题的解决方案也不复杂,既根据实现业务的需要跟踪所加载脚本的加载状态。加载状态的判断在IE下用readyState属性,非IE浏览器支持,脚本加载完成后的onload方法的调用。

业界优秀的延迟加载库

Ryan Grove 的LazeLoad https://github.com/rgrove/lazyload
Kyle Simpson 的 LABjs http://labjs.com/

Javascript 相关文章推荐
javascript动态加载实现方法一
Aug 22 Javascript
可简单避免的三个JS发布错误的详细介绍
Aug 02 Javascript
三种检测iPhone/iPad设备方向的方法
Apr 23 Javascript
创建你的第一个AngularJS应用的方法
Jun 16 Javascript
初步认识JavaScript函数库jQuery
Jun 18 Javascript
JavaScript Length 属性的总结
Nov 02 Javascript
基于JavaScript如何制作遮罩层对话框
Jan 26 Javascript
Bootstrap按钮组实例详解
Jul 03 Javascript
彻底搞懂JavaScript中的apply和call方法(必看)
Sep 18 Javascript
如何使用less实现随机下雪动画详解
Jan 02 Javascript
jquery将json转为数据字典的实例代码
Oct 11 jQuery
Vue图片浏览组件v-viewer用法分析【支持旋转、缩放、翻转等操作】
Nov 04 Javascript
javascrip客户端验证文件大小及文件类型并重置上传
Jan 12 #Javascript
javascript smipleChart 简单图标类
Jan 12 #Javascript
javascript Window及document对象详细整理
Jan 12 #Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
Jan 12 #Javascript
奉献给JavaScript初学者的编写开发的七个细节
Jan 11 #Javascript
从盛大通行证上摘下来的身份证验证js代码
Jan 11 #Javascript
javascript 设为首页与加入收藏兼容多浏览器代码
Jan 11 #Javascript
You might like
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
2018/01/15 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
jsvascript图像处理—(计算机视觉应用)图像金字塔
2013/01/15 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
基于jQuery仿淘宝产品图片放大镜特效
2020/10/19 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
JS实现点击掉落特效
2021/01/29 Javascript
[58:25]VP vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python获取局域网占带宽最大3个ip的方法
2015/07/09 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Python 实现数据结构中的的栈队列
2019/05/16 Python
Python关于__name__属性的含义和作用详解
2020/02/19 Python
详解pandas绘制矩阵散点图(scatter_matrix)的方法
2020/04/23 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
Hotels.com印度:酒店预订
2019/05/11 全球购物
主题酒店策划书
2014/01/28 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
无犯罪记录证明
2014/09/19 职场文书
《游戏公平》教学反思
2016/02/20 职场文书
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python