让浏览器非阻塞加载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的动态创建DOM元素的代码
Dec 28 Javascript
js的hasownproperty使用示例
Mar 02 Javascript
JsRender for object语法简介
Oct 31 Javascript
js中数组排序sort方法的原理分析
Nov 20 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
Jun 07 Javascript
深入浅析JavaScript函数前面的加号和叹号
Jul 09 Javascript
jQuery实现用户输入自动完成功能
Feb 13 Javascript
vue组件表单数据回显验证及提交的实例代码
Aug 30 Javascript
JS基础之逻辑结构与循环操作示例
Jan 19 Javascript
javascript异常处理实现原理详解
Feb 17 Javascript
微信小程序实现点击页面出现文字
Sep 21 Javascript
夯基础之手撕javascript继承详解
Nov 09 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
JavaScript中的闭包原理分析
2010/03/08 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
jquery修改网页背景颜色通过css方法实现
2014/06/06 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
jQuery旋转插件jqueryrotate用法详解
2016/10/13 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
实例分析nodejs模块xml2js解析xml过程中遇到的坑
2017/03/18 NodeJs
layui获取选中行数据的实例讲解
2018/08/19 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
如何解决vue在ios微信"复制链接"功能问题
2020/03/26 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
Python基于select实现的socket服务器
2016/04/13 Python
python实现各进制转换的总结大全
2017/06/18 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
Python中格式化字符串的四种实现
2020/05/26 Python
贪睡宠物用品:Snoozer Pet Products
2020/02/04 全球购物
C语言如何决定使用那种整数类型
2016/11/26 面试题
EJB的基本架构
2016/09/22 面试题
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
《云雀的心愿》教学反思
2014/02/25 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
售后客服工作职责
2014/06/16 职场文书
物理课外活动总结
2014/08/27 职场文书
冰雪公主观后感
2015/06/16 职场文书
欧也妮葛朗台读书笔记
2015/06/30 职场文书
学生会任命书范本
2015/09/21 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python