让浏览器非阻塞加载javascript的几种方法小结


Posted in Javascript onApril 25, 2011

浏览器为了确保正确执行脚本和呈现布局在浏览器加载和执行完成它之前会完全阻塞页面后续内容的呈现和其他资源的加载。

    在页面的加载过程中如果可以做到内容的逐步呈现,对于良好的用户体验来说是非常重要的。通常我们也会在wondow对象的onload事件处理函数中做一些事情,但由于脚本阻塞加载和呈现的特性这一方面增加了页面载入时间推迟了onload事件的触发,另一方面也延迟了用户所期待的反馈。这就需要我们使用一些方法来让浏览器以非阻塞的方式加载外部脚本。

一  使用XMLHttpRequest对象异步方式加载外部脚本。

    这种方式好处是触发较少的浏览器忙指示器,能够被所有现代浏览器的所支持。不足的之处在于由于浏览器的跨域安全机制所以只能允许加载同域下外部脚本。另外如果多个脚本之间存在依赖关系的话,需要使用编写相关的队列管理脚本来控制多个脚本的执行顺序。

二  使用Javascript来动态创建外部脚本的SCRIPT元素

   这种方式是我认为跨域并行加载外部脚本情况下的最佳方案,实现方法是使用Javascript来动态的创建在HTML中引用外部脚本所需要srcript元素并给创建的srcript元素的src属性设置相应的外部脚本的URL来实现和其他资源并行加载。

四  使用iframe加载外部脚本

    这种方式我们需要使用一个新HTML页面把外部脚本转换成到该HTML页面的行内脚本,然后在主页面中使用iframe加载这个包含脚本的HTML页面,使用这种方式需要重构部分代码来访问主页面中DOM元素。而且IFRAM是开销相对较大DOM元素,同样也有跨域限制。

五 使用Script标签的 derfer 属性

    这种方式是实现非阻塞并行加载外部脚本的最简单的方式,只需要在引用外部脚本的是常规方式上给SCRIPT标签应用defer属性即可。但是使用这种方式加载外部脚本缺点是它只在部门浏览器中实现并行加载因此兼容性欠缺。

六 docuument.write script tag

    这种方式实现起来也比较简单,就是直接使用是javascript的document.write方法来输出在HTML中引用外部脚本的script标记的字符串。不足之处和方法五一样兼容性欠缺。

总结

   上述几种方式需要根据具体需求,如是否需要跨域?是否需要确保脚本按顺序执行?是否需要触发更多或更少的浏览器的忙指示器?以及兼容性,支持的代码量来确定来综合考虑那种方式才是追合适的。

Javascript 相关文章推荐
js传值 判断
Oct 26 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
Jan 21 Javascript
javascript 禁止复制网页
Jun 11 Javascript
jQuery 获取对象 定位子对象
May 31 Javascript
JavaScript中使用构造函数实现继承的代码
Aug 12 Javascript
类似天猫商品详情随浏览器移动的示例代码
Feb 27 Javascript
node.js中的buffer.toString方法使用说明
Dec 14 Javascript
JS实现具备延时功能的滑动门菜单效果
Sep 17 Javascript
Vue $emit $refs子父组件间方法的调用实例
Sep 12 Javascript
vue router 组件的高级应用实例代码
Apr 08 Javascript
微信小程序 如何保持登录状态
Aug 16 Javascript
JavaScript基于用户照片姓名生成海报
May 29 Javascript
jQuery 版元素拖拽原型代码
Apr 25 #Javascript
30个最好的jQuery 灯箱插件分享
Apr 25 #Javascript
分享27个jQuery 表单插件集合推荐
Apr 25 #Javascript
分享14个很酷的jQuery导航菜单插件
Apr 25 #Javascript
23个超流行的jQuery相册插件整理分享
Apr 25 #Javascript
基于jquery的二级联动菜单实现代码
Apr 25 #Javascript
jQuery判断元素是否是隐藏的代码
Apr 24 #Javascript
You might like
提升PHP执行速度全攻略
2006/10/09 PHP
php实现图片缩放功能类
2013/12/18 PHP
php中让人头疼的浮点数运算分析
2016/10/10 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
PHP7匿名类的用法示例
2019/04/05 PHP
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
关于jQuery object and DOM element
2013/04/15 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
详解微信小程序开发—你期待的分享功能来了,微信小程序序新增5大功能
2016/12/23 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
vue中在vuex的actions中请求数据实例
2019/11/08 Javascript
python通过yield实现数组全排列的方法
2015/03/18 Python
在Python的Django框架中加载模版的方法
2015/07/16 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
python创建学生成绩管理系统
2019/11/22 Python
python 在threading中如何处理主进程和子线程的关系
2020/04/25 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
python如何输出反斜杠
2020/06/18 Python
python爬虫用mongodb的理由
2020/07/28 Python
Python通过format函数格式化显示值
2020/10/17 Python
秋天的雨教学反思
2014/04/27 职场文书
体育教师求职信
2014/06/30 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
公司租房协议书
2014/10/14 职场文书
PHP判断是否是json字符串
2021/04/01 PHP