javascript
  • asynchronous
  • pageload
  • page-load-time
  • 2010-08-04 15 views 26 likes 
    26

    這個問題是Which browsers support <script async="async" />?的切線。如果將腳本動態添加到DOM,「異步」屬性/屬性是否有用?

    我已經看到最近幾個腳本,做這樣的事情:

    var s = document.createElement('script'); 
    s.type = 'text/javascript'; 
    s.async = true; 
    s.src = 'http://www.example.com/script.js'; 
    document.getElementsByTagName('head')[0].appendChild(s); 
    

    這是添加腳本到DOM動態,常見的方式,也,IIRC由史蒂夫Souders的的書「Even Faster Web Sites」提示所有現代瀏覽器異步加載腳本(即不阻止頁面渲染或下載後續資產)。

    如果我沒有錯,s.async = true聲明有什麼用處?即使對於支持該屬性的瀏覽器,這是否也不是多餘的,因爲動態附加腳本應該已經觸發了異步下載?

    回答

    18

    的問題是不s.async = true有動態插入腳本使用,或者這些異步已經加載。答案是他們異步在所有瀏覽器加載,因爲(該鏈接感謝馬庫斯·奧爾森)

    腳本插入腳本在IE和WebKit異步執行解釋 here,但在同步Opera和預4.0 Firefox瀏覽器。在Firefox 4.0中,腳本創建的腳本的異步DOM屬性默認爲true,因此默認行爲與IE和WebKit的行爲相匹配。

    在支持async但尚未默認爲異步加載(例如Firefox 3.6),async = true的瀏覽器中有所不同。

    (以上鍊路確認異步在壁虎1.9.2,由火狐3.6使用的佈局引擎支持)

    +0

    有關最近瀏覽器版本的答案更新會很有趣。我目前使用's.setAttribute(「async」,「」);'。你知道這是否有效? – Gruber 2015-09-18 10:53:30

    +0

    是否有一個徽章:「6年後回來接受一個始終正確的答案,同時導致新接受的答案自相矛盾,因爲它將接受的答案稱爲錯誤,當它成爲正確答案時回答自己?「 – Bungle 2017-04-08 06:50:59

    1

    我相信你是對的。

    Steve's own examples在將腳本標籤附加到head元素之前,他沒有設置async屬性。

    我對async atttribute的理解是,這是一種向瀏覽器發送信號的方式,即您不打算通過使用document.write來操作頁面,以便它可以繼續渲染而不是暫停加載腳本。請參閱script element at mdc的文檔,其中包含有關document.write/async問題的更多信息。

    請注意,使用你的技術,你不應該使用document.write,因爲你無法知道你的腳本在頁面生命週期中的什麼地方加載。

    +0

    馬庫斯 - 偉大的答案,我很欣賞你的貢獻!我進一步研究了這些,並做出了一些發現 - 請閱讀我剛剛添加的答案。 – Bungle 2010-08-10 03:49:21

    2

    有趣的 - 我認爲事實證明,我錯誤的假設。

    在此基礎上螺紋在jQuery的開發者論壇:

    http://forum.jquery.com/topic/jquery-ajax-async-vs-html5-script-async

    它看起來像async財產已被發現對動態附加腳本,至少在Firefox的影響(可能Opera,儘管它還不支持該屬性)。

    該論壇主題還引用了Google的異步跟蹤代碼實現,儘管它似乎在相應的上下文中使用了async屬性,但實際上卻顯示出語法錯誤。谷歌使用:

    ga.async = true; 
    

    當明顯不起作用;正確的方法是使用兩種:

    ga.async = 'async'; 
    

    ga.setAttribute('async', 'async'); 
    

    所以,根據我目前的理解,並不是所有的瀏覽器將實際上在他們的插入立即執行動態補寫腳本到DOM中所有案件; Firefox(並最終Opera)將需要設置async屬性以確保始終發生這種情況。

    對Firefox的實施async這裏更多信息:

    https://bugzilla.mozilla.org/show_bug.cgi?id=503481

    +0

    在jQuery論壇非常有趣的線程。猜猜我的谷歌功夫不夠強大,找不到它);謝謝! – 2010-08-11 11:01:56

    +2

    我不認爲這是正確的。 'typeof ga.async'是'「boolean」',甚至在你將其設置爲''async''後,你會發現ga.async的值爲'true'(由於類型強制)。我在FF 3.6 – 2011-03-01 21:20:48

    +0

    中進行了檢查。我相信那些聲稱它不在jQuery中工作的人誤解了異步屬性應該做的事情,正如其他一些海報所指出的那樣。順便說一下,請注意,'ga.async = true'的結果是HTML,比如'