script標籤的非同步與延遲執行

張貼日期:2013/11/18 上午 02:49:13

文章來源:http://www.victsao.com/blog/81-javascript/125-javascript-script-asyanddefer

在HTML5中,script標籤多了許多屬性,async 就是其中之一。

async屬性可以讓javascript進行非同步的載入跟執行,而不會停止網頁其他部分的載入與解析。

這種讓外部js擋在背景載入與執行的方法,大大的提升了網頁載入與執行的效能。

雖然只適用於外部js檔,但實用性相當高,以後網頁要添加一些小工具,像是月曆之類的。

也就不用過於害怕添加太多而導致網頁載入被拖垮了。

async 屬性 與 defer屬性合用會有下列幾種:

1.async與defer屬性皆不存在:

<script src="123.js"></script>

同步下載與執行,這種作法會讓瀏覽器停止對網頁的解析,直到js檔執行完畢為止,

對網頁效能有顯著的負面影響。

2.async屬性存在:

<script src="123.js" async="true"></script>

非同步下載與執行,程式碼在下載完後會立即執行。下載與執行都在背景執行,

不影響網頁本身的解析。有顯著的效能提升。

3.defer屬性存在:

<script src="123.js" defer="true"></script>

js檔會在背景下載,並在網頁解析完成後才開始執行。

4.async與defer皆存在:

<script src="123.js" defer="true" ansyc="true"></script>

優先使用ansyc,而忽略defer,如果瀏覽器對ansyc不支援,那會使用defer屬性。

上面我都用 "存在" 這字眼,原因之一是HTML5的原文是使用 " present" ,

另外一個原因是因為,IE並不理會HTML5中ansyc與defer皆是boolean值的規定。

只要有ansyc字眼出現,他就認為是要非同步下載執行。

所以說下面幾個寫法對IE而言都是一樣的。

<script src="123.js" async ></script>

<script src="123.js" async="true"></script>

<script src="123.js" async="false"></script>