让浏览器非阻塞加载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 相关文章推荐
jquery BS,dialog控件自适应大小
Jul 06 Javascript
关于JQuery($.load)事件的用法和分析
Apr 09 Javascript
实现只能输入数字的input不用replace方法
Sep 12 Javascript
js实现用户注册协议倒计时的方法
Jan 21 Javascript
jquery实现先淡出再折叠收起的动画效果
Aug 07 Javascript
JS实现网页上随机产生超链接地址的方法
Nov 09 Javascript
js实现简单的省市县三级联动效果实例
Feb 18 Javascript
jQuery实现的右下角广告窗体跟随效果示例
Sep 16 Javascript
vue mint-ui学习笔记之picker的使用
Oct 11 Javascript
浅谈vue中慎用style的scoped属性
Nov 28 Javascript
vue.js使用v-if实现显示与隐藏功能示例
Jul 06 Javascript
highcharts.js数据绑定方式代码实例
Nov 13 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代码片段
2015/09/24 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
onclick与listeners的执行先后问题详细解剖
2013/01/07 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
javascript窗口宽高,鼠标位置,滚动高度(详细解析)
2013/11/18 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
javascript-解决mongoose数据查询的异步操作
2016/12/22 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
详解Vue2.0 事件派发与接收
2017/09/05 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
谈谈node.js中的模块系统
2020/09/01 Javascript
javascript实现搜索筛选功能实例代码
2020/11/12 Javascript
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
python传递参数方式小结
2015/04/17 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
新英格兰最大的特色礼品连锁店:The Paper Store
2018/07/23 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
给同事的道歉信
2014/01/11 职场文书
小学英语教学反思案例
2014/02/04 职场文书
幼儿园中班评语大全
2014/04/17 职场文书
镇班子对照检查材料思想汇报
2014/09/24 职场文书
老人与海读书笔记
2015/06/26 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL
Python re.sub 反向引用的实现
2021/07/07 Python
python多次执行绘制条形图
2022/04/20 Python