浏览器加载静态资源和js的方式都是线性加载,因此通常状况能够将js放到</body>前,防止UI线程的阻塞。javascript
而某些时候咱们既但愿js在整个网页的头部就加载,又担忧js阻塞致使网站加载缓慢,就能够用到无阻塞加载js技术。html
Dynamic Script Elements 动态脚本元素java
DOM容许咱们使用Javascript动态建立HTML的几乎全部文档内容,一个新的<script>元素能够很是容易的经过标准DOM建立:浏览器
var script = document.createElement ("script"); script.type = "text/javascript"; script.src = "file1.js"; document.body.appendChild(script);
新的<script>元素加载file1.js源文件。此文件当元素添加到页面后马上开始下载。此技术的重点在于:不管在何处启动下载,文件的下载和运行都不会阻塞其余页面处理过程。app
当文件使用动态脚本节点下载时,返回的代码一般当即执行(除了Firefox和Opera,它们将等待此前的全部动态脚本节点执行完毕)。函数
大多数状况下,咱们但愿调用一个函数就能够实现Javascript文件的动态下载。下面的函数封装实现了标准实现和IE实现:性能
function loadScript(url, callback){ var script = document.createElement ("script") ; script.type = "text/javascript"; if (script.readyState){ //IE script.onreadystatechange = function(){ if (script.readyState == "loaded" || script.readyState == "complete"){ script.onreadystatechange = null; callback(); } }; } else { //Others script.onload = function(){ callback(); }; } script.src = url; document.getElementsByTagName("head")[0].appendChild(script); } loadScript("file1.js", function(){ //调用 alert("File is loaded!"); });
此函数接受两个参数:Javascript文件的Url和一个当Javascript接收完成时触发的回调函数。属性检查用于决定监视哪一种事件。最后一步src属性,并将javascript文件添加到head。网站
动态脚本加载是非阻塞Javascript下载中最经常使用的模式,由于它能够跨浏览器,并且简单易用。url
参考资料:spa
http://www.cnblogs.com/sharpxiajun/p/4072396.html 《探真无阻塞加载javascript脚本技术,咱们会发现不少意想不到的秘密》
http://developer.51cto.com/art/201410/453722.htm 《高性能Javascript:脚本的无阻塞加载策略》
http://www.cnblogs.com/xyang/archive/2013/03/01/2939178.html 《LAB.js使用》
http://www.cnblogs.com/xyang/archive/2013/03/01/2938941.html 《资源文件的动态加载》