首页  >  文章  >  web前端  >  javascript中同步加载和异步加载两种方式实例详解

javascript中同步加载和异步加载两种方式实例详解

伊谢尔伦
伊谢尔伦原创
2017-07-21 14:23:122281浏览

同步加载 

我们平时最常使用的就是这种同步加载形式: 

<script src="http://yourdomain.com/script.js"></script>

同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像)、渲染、代码执行。 js 之所以要同步执行,是因为 js 中可能有输出 document 内容、修改dom、重定向等行为,所以默认同步执行才是安全的。 以前的一般建议是把3f1c4e4b6b16bbbd69b2ee476dc4f83a放在页面末尾36cc49f0c466276486e50c850b7e4956之前,这样尽可能减少这种阻塞行为,而先让页面展示出来。 简单说:加载的网络 timeline 是瀑布模型,而异步加载的 timeline 是并发模型。

常见异步加载

(function() { 
var s = document.createElement(&#39;script&#39;); 
s.type = &#39;text/javascript&#39;; 
s.async = true; 
s.src = &#39;http://yourdomain.com/script.js&#39;; 
var x = document.getElementsByTagName(&#39;script&#39;)[0]; 
x.parentNode.insertBefore(s, x); 
})();

异步加载又叫非阻塞,浏览器在下载执行 js 同时,还会继续进行后续页面的处理。 这种方法是在页面中3f1c4e4b6b16bbbd69b2ee476dc4f83a标签内,用 js 创建一个 script 元素并插入到 document 中。这样就做到了非阻塞的下载 js 代码。 async属性是HTML5中新增的异步支持,见后文解释,加上好(不加也不影响)。 此方法被称为 Script DOM Element 法,不要求 js 同源。 将js代码包裹在匿名函数中并立即执行的方式是为了保护变量名泄露到外部可见,这是很常见的方式,尤其是在 js 库中被普遍使用。 
例如 Google Analytics 和 Google+ Badge 都使用了这种异步加载代码:

(function() { 
var ga = document.createElement(&#39;script&#39;); 
ga.type = &#39;text/javascript&#39;; ga.async = true; 
ga.src = (&#39;https:&#39; == document.location.protocol ? &#39;https://ssl&#39; : &#39;http://www&#39;) + &#39;.google-analytics.com/ga.js&#39;; 
var s = document.getElementsByTagName(&#39;script&#39;)[0]; s.parentNode.insertBefore(ga, s); 
})(); 
(function() 
{var po = document.createElement("script"); 
po.type = "text/javascript"; po.async = true;po.src = "https://apis.google.com/js/plusone.js"; 
var s = document.getElementsByTagName("script")[0]; 
s.parentNode.insertBefore(po, s); 
})();

但是,这种加载方式在加载执行完之前会阻止 onload 事件的触发,而现在很多页面的代码都在 onload 时还要执行额外的渲染工作等,所以还是会阻塞部分页面的初始化处理。 

onload 时的异步加载

(function() { 
function async_load(){ 
var s = document.createElement(&#39;script&#39;); 
s.type = &#39;text/javascript&#39;; 
s.async = true; 
s.src = &#39;http://yourdomain.com/script.js&#39;; 
var x = document.getElementsByTagName(&#39;script&#39;)[0]; 
x.parentNode.insertBefore(s, x); 
} 
if (window.attachEvent) 
window.attachEvent(&#39;onload&#39;, async_load); 
else 
window.addEventListener(&#39;load&#39;, async_load, false); 
})();

这和前面的方式差不多,但关键是它不是立即开始异步加载 js ,而是在 onload 时才开始异步加载。这样就解决了阻塞 onload 事件触发的问题。 
补充:DOMContentLoaded 与 OnLoad 事件 
DOMContentLoaded : 页面(document)已经解析完成,页面中的dom元素已经可用。但是页面中引用的图片、subframe可能还没有加载完。 
OnLoad:页面的所有资源都加载完毕(包括图片)。浏览器的载入进度在这时才停止。 
这两个时间点将页面加载的timeline分成了三个阶段。 

以上是javascript中同步加载和异步加载两种方式实例详解的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn