让浏览器非阻塞加载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 相关文章推荐
利用javascript实现一些常用软件的下载导航
Aug 03 Javascript
javascript中的prototype属性使用说明(函数功能扩展)
Aug 16 Javascript
js新闻滚动 js如何实现新闻滚动效果
Jan 07 Javascript
js实现checkbox全选和反选示例
May 01 Javascript
javascript中数组array及string的方法总结
Nov 28 Javascript
jQuery oLoader实现的加载图片和页面效果
Mar 14 Javascript
实践中学习AngularJS表单
Mar 21 Javascript
Node.js的Web模板引擎ejs的入门使用教程
Jun 06 Javascript
jQuery实现手机自定义弹出输入框
Jun 13 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
Nov 03 Javascript
原生JS仿QQ阅读点击展开、收起效果
Mar 08 Javascript
Vue+Vuex实现自动登录的知识点详解
Mar 04 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 CodeBase:将时间显示为"刚刚""n分钟/小时前"的方法详解
2013/06/06 PHP
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
Maps Javascript
2007/01/22 Javascript
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
用javascript关闭本窗口技巧小结
2014/09/05 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
js学习笔记之事件处理模型
2016/10/31 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
python3中int(整型)的使用教程
2017/03/23 Python
Python决策树分类算法学习
2017/12/22 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
python3获取当前目录的实现方法
2019/07/29 Python
容易被忽略的Python内置类型
2020/09/03 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
无需JS和jQuery代码实现CSS3鼠标浮动放大图片
2016/11/21 HTML / CSS
HTML5标签与HTML4标签的区别示例介绍
2013/07/18 HTML / CSS
介绍一下gcc特性
2015/10/31 面试题
会计大学生职业生涯规划书范文
2014/01/13 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
购房意向书
2014/08/30 职场文书
公司合作协议范文
2014/10/01 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
酒店人事主管岗位职责
2015/04/11 职场文书
电影雨中的树观后感
2015/06/15 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
2019年大学生职业生涯规划书最新范文
2019/03/25 职场文书
Mysql忘记密码解决方法
2022/02/12 MySQL