<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結構已經建立完畢,並作好了交互的準備,從而避免了須要另外一個事件來檢測頁面是否準備好。性能