<script>
? 这不就是直接执行script脚本吗?javascript
之前的我这有认为,可是今天却知道了他的奥秘。他并无表面的那么简单。html
<script>
拥有7个属性,没想到吧!java
</html>
,并会按照它们出现的前后顺序执行。但会在触发 DOMContentLoaded
事件前执行。在XHTML文档中,要把async属性设置为 async = "async", defer = "defer"segmentfault
知道了那几个属性接下来,来看看下面这个图:跨域
<script>
说明了,在html
解析中,若是有<script>
的话,html
会在Script
下载而且执行的时候,暂停解析。async
属性的<script>
,如图所示,也就是他下载Script
的时候是异步的,可是只要Script
文件下好了,那么就立刻执行。defer
属性的<script>
,其实和上面带async
属性同样都是异步执行去下载Script
文件的。可是在这个带有defer
的则是在html
所有解析完毕以后才去执行Script
文件。并且它是按照加载顺序执行脚本的,这一点要善加利用。显然 defer
是最接近咱们对于应用脚本加载和执行的要求的<script>
标签元素来下载并执行代码var script = document.createElement('script');
script.type = "text/javascript";
script.src = "file1.js";
document.getElementByTagName("head")[0].appendChild(script);
复制代码
这个技术的重点在于:浏览器
不管什么时候启动下载,文件的下载和执行过程不会阻塞页面其余进程。app
参考:异步
《高性能JavaScript》async
function loadScript(url, callback){
var script = document.createElement(
"e");
script.type = "text/javascript";
if(script.readyState){ //ie
script.onreadystatechange = function(){
if(script.readyState == "loaded" || script.readyState == "complete"){
script.onreadystatechage = null;
callback();
}
};
} else {
script.onload = function(){
callback();
}
}
}
loadScript("the-rest.js", function(){
Application.init()
});
复制代码
这样作实现了动态建立标签元素并下载,其次当第二个脚本文件下载时,应用所需的全部DOM结构已经建立完毕,并作好了交互的准备,从而避免了须要另外一个事件来检测页面是否准备好。性能