2012-07-31 70 views
3

假設我的網站上有這個腳本標記(從SO借來)。我的網站應該如何妥善處理缺少JavaScript文件?

<script type="text/javascript" async="" 
     src="http://edge.quantserve.com/quant.js"></script> 

如果edge.quantserve.com下降或停止,不返回404響應,不會那麼必須等待頁面加載的其餘部分之前超時?我在想混沌猴會出現,並將我的站點所依賴的服務器發送出去,這是一個不屬於CDN並且故障轉移不良的服務器。

解決此問題的行業標準方法是什麼?我無法找到這樣的蠢事,也許我正在尋找錯誤的條款。

更新:我應該更緊密地在SO碼打量了一下,有這個底部:

<script type="text/javascript">var _gaq=_gaq||[];_gaq.push(['_setAccount','UA-5620270-1']); 
     _gaq.push(['_setCustomVar', 2, 'accountid', '14882',2]); 
_gaq.push(['_trackPageview']); 
    var _qevents = _qevents || []; 
    (function(){ 
     var s=document.getElementsByTagName('script')[0]; 
     var ga=document.createElement('script'); 
     ga.type='text/javascript'; 
     ga.async=true; 
     ga.src='http://www.google-analytics.com/ga.js'; 
     s.parentNode.insertBefore(ga,s); 
     var sc=document.createElement('script'); 
     sc.type='text/javascript'; 
     sc.async=true; 
     sc.src='http://edge.quantserve.com/quant.js'; 
     s.parentNode.insertBefore(sc,s); 
    })(); 
    </script> 

確定,因此,如果quant.js文件加載失敗,它創建一個腳本標籤與ga.async=true; 。也許這就是訣竅。

可能的答案:https://stackoverflow.com/a/1834129/30946

+0

對於像分析這樣的東西,確實沒有問題。對於其他應用程序級別的腳本,您可能需要提醒用戶該問題,或者自動刷新頁面。 (Gmail會這樣做。) – Brad 2012-07-31 21:24:24

+0

難道你不能回退到本地副本嗎? Ex(使用jQuery):'' – j08691 2012-07-31 21:26:39

+0

您是否主要關心外部請求超時之前的漫長等待時間?第一個答案和以上評論解決了另一個問題。 – 2012-07-31 21:29:27

回答

1

通常,它很難做到這一點,並跨瀏覽器。

一些建議:

  1. 移動腳本的HTML頁面(這樣你要求腳本之前,幾乎一切都顯示)
  2. 它移到底部的最底部,在<script>document.write("<scr"+"ipt src='http://example.org/script.js'></scr"+"ipt>")</script>把它包或者您在更新後添加的方式(document.createElement('script')
  3. 最後一個選項是通過XHR加載它(但只有在CORS在第三方服務器上啓用時,它才適用於同域或跨域);然後您可以使用XHR的timeout屬性(用於IE和Fx12 +),並在其他瀏覽器中使用setTimeout並檢查XHR的readyState。目前這是一種令人費解且非常不跨瀏覽器的方式,所以選項2看起來最好。
+0

我認爲你是對的。在查看SO加載的方式之後,第一個GET返回帶有惰性腳本加載器的HTML(您的答案#2,帶有document.createElement('script')。我懷疑這是其他'big聯賽'做到這一點。 – jcollum 2012-07-31 22:59:51

1

讓您的服務器上的文件的副本,並使用它。只有從服務器的一個加載失敗

<script src="http://edge.quantserve.com/quant.js"></script> 
    <script>window.quant || document.write('<script src="js/quant.js"><\/script>')</script> 
+0

這是否仍然存在「等待超時」問題? – jcollum 2012-07-31 21:30:13

+0

權衡總是存在的。您也可以在Google服務器上託管該文件-code.google.com- – 2012-07-31 21:31:49

0

要獲得關於不必等待腳本加載頁面的其餘部分之前加載,答案瀏覽器問題,它會加載您的副本通常不會。典型的瀏覽器將有多個線程處理頁面和鏈接內容(CSS,圖像,js)的下載。因此,應該加載頁面的其餘部分,儘管用戶的瀏覽器指示器仍然會顯示嘗試加載的頁面,直到最終請求達到或超時。

根據您嘗試加載的資源的性質,這顯然會以不同的方式影響您的頁面。通常情況下,如果你擔心這個問題,你可以將所有的文件放在一個普通的CDN上(或者如果你的網站沒有那麼高的流量),那麼至少如果一件事失敗了,很可能一切都會失敗,更大的問題來與之抗衡:)

+0

頁面加載不會被腳本阻止。如果頁面頂部有'放在頁面的最底部。 – 2012-07-31 21:36:10

+0

http://stackoverflow.com/a/1834129/30946 – jcollum 2012-07-31 21:42:49

+0

在IE中它支持10+,並且考慮到IE在性能方面是最大的違規者,所以儘可能將腳本移動到底部仍然不錯: )一本關於整體HTML頁面的好書perf:[NC Zakas:高性能JavaScript](http://shop.oreilly.com/product/9780596802806.do) – 2012-07-31 21:47:36