平时最常使用的就是这样的同步载入形式:
   <script src="http://yourdomain.com/script.js"></script>
   同步模式。又称堵塞模式,会阻止浏览器的兴许处理,停止了兴许的解析。因此停止了兴许的文件载入(如图像)、渲染、代码运行。

js 之所以要同步运行。是由于 js 中可能有输出 document 内容、改动dom、重定向等行为,所以默认同步运行才是安全的。
   曾经的一般建议是把<script>放在页面末尾</body>之前,这样尽可能降低这样的堵塞行为,而先让页面展示出来。

   简单说:载入的网络 timeline 是瀑布模型,而异步载入的 timeline 是并发模型。

常见异步载入(Script DOM Element)

  1. (function() {
  2. var s = document.createElement('script');
  3. s.type = 'text/javascript';
  4. s.async = true;
  5. s.src = 'http://yourdomain.com/script.js';
  6. var x = document.getElementsByTagName('script')[0];
  7. x.parentNode.insertBefore(s, x);
  8. })();

比如 Google Analytics 和 Google+ Badge 都使用了这样的异步载入代码:

  1. (function() {
  2. var ga = document.createElement('script');
  3. ga.type = 'text/javascript'; ga.async = true;
  4. ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  5. var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  6. })();
  7.  
  8. (function()
  9. {var po = document.createElement("script");
  10. po.type = "text/javascript"; po.async = true;po.src = "https://apis.google.com/js/plusone.js";
  11. var s = document.getElementsByTagName("script")[0];
  12. s.parentNode.insertBefore(po, s);
  13. })();

百度地图的异步载入:

  1. var map; //全局地图
  2. function initialize() {
  3. map = new BMap.Map('map');
  4. var point = new BMap.Point(121.491, 31.233);
  5. map.centerAndZoom(point, 11);
  6. //使用鼠标滚轮控制缩放
  7. map.enableScrollWheelZoom();
  8. //加入地图控件
  9. map.addControl(new BMap.NavigationControl());
  10. map.addControl(new BMap.ScaleControl());
  11. map.addControl(new BMap.OverviewMapControl());
  12. map.addControl(new BMap.MapTypeControl());
  13. //点击地图就加入标注点
  14. map.addEventListener("click", addMarkerService);
  15. PanOptions.noAnimation=false;
  16. }
  17. function loadScript() {
  18. var script = document.createElement("script");
  19. script.src = "http://api.map.baidu.com/api?
  20.  
  21. v=1.5&ak={No}&callback=initialize";
  22. //此为v1.5版本号的引用方式
  23. // http://api.map.baidu.com/api?
  24.  
  25. v=1.5&ak=您的密钥&callback=initialize"; //此为v1.4版本号及曾经版本号的引用方式
  26. document.body.appendChild(script);
  27. }
  28. window.onload = loadScript;

可是。这样的载入方式在载入运行完之前会阻止 onload 事件的触发,而如今非常多页面的代码都在 onload 时还要运行额外的渲染工作等,所以还是会堵塞部分页面的初始化处理。

  1. (function() {
  2. function async_load(){
  3. var s = document.createElement('script');
  4. s.type = 'text/javascript';
  5. s.async = true;
  6. s.src = 'http://yourdomain.com/script.js';
  7. var x = document.getElementsByTagName('script')[0];
  8. x.parentNode.insertBefore(s, x);
  9. }
  10. if (window.attachEvent)
  11. window.attachEvent('onload', async_load);
  12. else
  13. window.addEventListener('load', async_load, false);
  14. })();

这和前面的方式几乎相同,但关键是它不是马上開始异步载入 js ,而是在 onload 时才開始异步载入。这样就攻克了堵塞 onload 事件触发的问题。
补充:DOMContentLoaded 与 OnLoad 事件
DOMContentLoaded : 页面(document)已经解析完毕,页面中的dom元素已经可用。可是页面中引用的图片、subframe可能还没有载入完。

OnLoad:页面的全部资源都载入完毕(包含图片)。

浏览器的载入进度在这时才停止。
这两个时间点将页面载入的timeline分成了三个阶段。

 

异步载入的其他方法
由于Javascript的动态特性,还有非常多异步载入方法:
XHR Eval
XHR Injection
Script in Iframe
Script Defer
document.write Script Tag
另一种方法是用 setTimeout 延迟0秒 与 其他方法组合。

XHR Eval :通过 ajax 获取js的内容,然后 eval 运行。
var xhrObj = getXHRObject();

  1. xhrObj.onreadystatechange =
  2. function() {
  3. if ( xhrObj.readyState != 4 ) return;
  4. eval(xhrObj.responseText);
  5. };
  6. xhrObj.open('GET', 'A.js', true);
  7. xhrObj.send('');

异步载入JS的更多相关文章

  1. jQuery的AJax异步载入片段

    主要用到load()方法以及getScript()方法,详细以一个样例说明: 在现有html文件里载入一个拟好的片段,以及在片段载入完毕之前阻止用户进一步操作的弹出框. 首先是现有html代码.无不论 ...

  2. lazyload.js实现图片异步载入

    所谓图片异步加载,意思是不用一次把图片全部加载完,你可以叫它延迟加载,缓冲加载都行. 看看你有没有这种需求:某篇文章图片很多,如果在载入文章时就载入所有图片,无疑会延缓载入速度,让用户等更久,所以,我 ...

  3. javascript异步延时载入及推断是否已载入js/css文件

    <html> <head> <script type="text/javascript"> /**======================= ...

  4. 页面优化——js异步载入

    同步载入 在介绍js异步载入之前.我们先来看看什么是js同步载入.我们平时最常使用的就是这样的同步载入形式: <script src="http://XXX.com/script.js ...

  5. structs2注解+jsp+ajax实现post异步载入select

    流程: 1.点击载入btn发起异步请求post 2.后台处理请求返回数据 3.前端获取数据成功,对数据进行处理 前端: html:首先要导入jq包,不然怎么用ajax呢. <script typ ...

  6. 同步 异步 AJAX JS

    jQuery:$post.$get.$ajax与php,实现异步加载 什么是异步加载? 整个最通俗的说法就是将另外一个页面上的数据通过append() 或者 html()等函数插入到本页上.纯js写法 ...

  7. 为了提高性能,怎样动态载入JS文件

    超级表格是一款多人协作的在线表格.程序相当复杂,用到十几个JS文件. 可是有些文件是在打开某些类型的表格时才须要载入. 比如,仅仅有当打开甘特图表格时,才须要载入gantetu.js文件. 那么问题来 ...

  8. SpringMVC+Jquery -页面异步载入数据

    背景: 做项目时涉及到页面.当我打算在controller中传一个list到页面,然后通过<c:foreach>循环遍历出来时,同事说:你这样每次都要刷新.这都是几百年前使用的技术了.你用 ...

  9. 使用 jsPlumb 绘制拓扑图 —— 异步载入与绘制的实现

    本文实现的方法能够边异步载入数据边绘制拓扑图. 有若干点须要说明一下: 1.  一次性获取全部数据并绘制拓扑图. 请參见文章: <使用 JsPlumb 绘制拓扑图的通用方法> ; 本文实现 ...

随机推荐

  1. 【shell学习】经常使用条件推断-字符,数字,文件

    IF 推断 之前也写过简单的shell脚本,也不是转职运维.和系统相关的工作比較少.所以不怎么熟练. 近期因为系统总是出现各种乱七八糟的问题,也没有人来协助.仅仅好自己写shell脚本了,都是些基础的 ...

  2. 作为刚開始学习的人应该怎样来学习FPGA

    FPGA作为一种高新的技术.已经逐渐普及到了各行各业.不管是消费类.通信类.电子行业都无处不在它的身影,从1985年第一颗FPGA诞生至 今,FPGA已经历了将近20多个年头,从当初的几百个门电路到如 ...

  3. 【java】itoo项目实战之大数据查询之使用 new map 优化hibernate之级联查询

    在我的上一篇博客<[java]itoo项目实战之hibernate 懒载入优化性能>中,我曾提到过学生数据有2万条,查询数据十分的慢,这是让人非常受不了的事情.看着页面进度条一直转着圈圈, ...

  4. 前台ajax验证技术采用正则表达式

    var flag1,flag2,flag3,flag4,flag5,flag6=false; function val(obj) { var regBox = { /* regEmail : /^([ ...

  5. 关于HashMap

    总是觉得对HashMap很熟悉,但最近连续被问到几个关于它的问题,才发现它其实并不简单.这里对关于它的一些问题做个总结,也希望能够大家一个参考. 都知道它是基于hash值,可以进行常量时间消化的存储结 ...

  6. java(异常体系及权限修饰符)

    java异常体系 异常的体系: 异常体系: --------| Throwable 所有错误或者异常的父类 --------------| Error(错误) --------------| Exce ...

  7. python爬虫之『入门基础』

    HTTP请求 1.首先需要了解一下http请求,当用户在地址栏中输入网址,发送网络请求的过程是什么? 可以参考我之前学习的时候转载的一篇文章一次完整的HTTP事务过程–超详细 2.还需要了解一下htt ...

  8. Linux 创建新用户并添加到sudo用户组

    附上一份相当奢华的文档:  https://www.cnblogs.com/jxhd1/p/6528574.html 添加用户到组 usermod -a -G sudo newone

  9. 【重构】C# VS 配置引用程序集的路径(分离exe和dll从指定路径调用)

    原文:[重构]C# VS 配置引用程序集的路径(分离exe和dll从指定路径调用) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/CocoWu892 ...

  10. xampp 在 centos 中无法启动的解决办法

    修改这个文件 vim /opt/lampp/lampp 找到     if egrep "9 " /etc/redhat-release > /dev/null更改为  if ...