2013-12-22 72 views
2

一些Web應用程序(我正在考慮Disqus和LiveFyre)通過Javascript創建<script>標籤,並通過Javascript指定新腳本異步加載。爲什麼他們通過Javascript創建標籤?而不是簡單地做:爲什麼通過Javascript創建腳本標記,而不是使用延遲或異步腳本標記屬性?

<script src="..." async> 

一個例子:

這是Disqus如何指導網站所有者加載評論:

<script type="text/javascript"> 
    var disqus_shortname = ... 
    (function() { 
     var s = document.createElement('script'); 
     s.type = 'text/javascript'; 
     s.async = true; 
     s.src = '//' + disqus_shortname + '.disqus.com/embed.js'; 
     (document.getElementsByTagName('head')[0] || 
      document.getElementsByTagName('body')[0]).appendChild(dsq); 
    })(); 
</script> 

而且src = ...disqus.com/embed.js地址是一個簡單的重定向到一個靜態腳本在另一個Disqus服務器上,顯然獨立於disqus_shortname

爲什麼不能代替告訴人們使用這段代碼:

<script> 
    var disqus_shortname = ... 
</script> 
<script src="http://direct-address-to-the-embed.js-script" async> 

或者更簡單,只有一行:

<script src="http://the_disqus_shortname.disqus.com/embed.js" async> 

(PS我加了下面一個答案。請不要添加其他的答案太:-))

回答

0

我能想到的一個不確定的(第1號)和兩種可能的原因(第2號和3) :

[編輯]但原因2和3是沒有實際意義的點 - Disqus可以簡單地做到這一點,儘管我的原因,2和3:

<script src="http://the_disqus_shortname.disqus.com/embed.js" async> 

[/ Editi]

  1. (也許是舊的瀏覽器不明白async屬性完全忽略了整個<script ... async>標籤?而不是僅僅async忽視和同步加載腳本?)

  2. 也許Disqus希望能夠動態genereate嵌入腳本,或重定向到不同的腳本,根據網站設置(雖然它好像Disqus目前總是重定向至相同的embed.js腳本)。沒有用戶重新配置Disqus的代碼。

  3. 使用重定向允許Disqus告訴瀏覽器緩存被重定向的腳本很長一段時間,但同時可以快速重定向到另一個腳本。每次下載/從瀏覽器高速緩存提取1次重定向代價。這是在這裏建議:https://stackoverflow.com/a/10098250/694469

0

我的猜測是,Disqus(和其他服務)要確保當你把自己的腳本(可能還有很多CMSes把自己的腳本不會減慢用戶站點加載頭元素中的腳本)。

如果你總是把你的腳本在body元素的結尾,然後寫短版可能是最佳的:

... 
    <script>var disqus_shortname = ...</script> 
    <script src="//shortname.disqus.com/embed.js" async> 
</body> 

我不知道,但!

+0

嗨,謝謝你的回答!我得到的印象是你回答了另一個問題,即「爲什麼他們把''? – KajMagnus

相關問題