让浏览器非阻塞加载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实现下载远程文件并保存在本地的脚本
May 06 Javascript
Javascript 陷阱 window全局对象
Nov 26 Javascript
javascript面向对象编程代码
Dec 19 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
Aug 01 Javascript
微信小程序 122100版本更新问题解决方案
Dec 22 Javascript
Bootstrap php制作动态分页标签
Dec 23 Javascript
JavaScript实现的XML与JSON互转功能详解
Feb 16 Javascript
jQuery+ThinkPHP+Ajax实现即时消息提醒功能实例代码
Mar 21 jQuery
node+express+ejs使用模版引擎做的一个示例demo
Sep 18 Javascript
echarts学习笔记之图表自适应问题详解
Nov 22 Javascript
解决layui的table插件无法多层级获取json数据的问题
Sep 19 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
Jan 12 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 按位与或 (^ 、&)
2013/06/21 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
Smarty变量调节器失效的解决办法
2014/08/20 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
Javascript 页面模板化很多人没有使用过的方法
2012/06/05 Javascript
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
js基础知识(公有方法、私有方法、特权方法)
2015/11/06 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
2017/01/13 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
jQuery EasyUI window窗口使用实例代码
2017/12/25 jQuery
js实现动态改变radio状态的方法
2018/02/28 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
JS实现深度优先搜索求解两点间最短路径
2019/01/17 Javascript
微信小程序如何使用canvas二维码保存至手机相册
2019/07/15 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
vue实现点击按钮“查看详情”弹窗展示详情列表操作
2020/09/09 Javascript
Python GUI布局尺寸适配方法
2018/10/11 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
视图的作用
2014/12/19 面试题
好听的队名和口号
2014/06/09 职场文书
英语自我介绍演讲稿
2014/09/01 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
工厂标语大全
2014/10/06 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
2015年少先队活动总结
2015/03/25 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
2016年度基层党建工作公开承诺书
2016/03/25 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python