2012-02-02 34 views
4

這可能是一個愚蠢的問題,但我會抓住我的機會。如何在包含它之前測試一個腳本是否有效

我的網站上,我有以下腳本文件:

<script src="http://connect.facebook.net/en_US/all.js"></script> 

通常情況下,這會工作得很好。然而,在我工作的地方,我們有一個防火牆,阻止任何流量到facebook.com或facebook.net域名,因爲顯然沒有員工有足夠的自我控制來阻止他們整天玩Farmville而不是工作。

因此,當腳本加載時,它實際上會得到一堆HTML,表示網站被阻止。由於這是HTML和無效的Javascript,瀏覽器彈出腳本錯誤。請注意,我仍然收到HTTP 200,因此我無法通過這種方式捕獲錯誤。

我願意接受這是一個邊緣情況,因爲只有一小部分用戶試圖從防火牆後面訪問我的網站,這種情況恰好阻止了Facebook流量,但我仍然發現自己想知道是否有東西相對容易,我可以做到測試以確保鏈接返回有效的Javascript,或者可能圍繞在一個巨大的try/catch塊中加載腳本並優雅地處理錯誤。任何想法將不勝感激!

UPDATE:

下面是從防火牆的錯誤頁面的HTTP標頭。也許我可以看看「內容類型」標題,如果內容有效,我認爲它會是文本/ JavaScript。

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: text/html; charset=utf-8 
Proxy-Connection: Keep-Alive 
Connection: Keep-Alive 
Content-Length: 4774 
+0

您可以使用AJAX「GET」請求獲取腳本並確保它不以HTML標記開頭? – Pointy 2012-02-02 16:38:52

+0

或者您可以檢查某些響應標頭是否被某些防火牆設置覆蓋 – fcalderan 2012-02-02 16:41:29

+0

當此資源被阻止時,響應長度是否始終爲4774字節?迴應的內容是什麼? – fcalderan 2012-02-02 16:51:34

回答

1

不幸的是,你沒有辦法測試connect.facebook.net沒有被阻止,因爲它來自不同的Origin比你的文件。

這意味着你不能使用XHR發出HEAD請求,並確保內容類型是真的text/javascript – XHR不會讓在默認情況下,和connect.facebook一個跨域請求。網絡不支持CORS

OPTIONS http://connect.facebook.net/en_US/all.js HTTP/1.1 
Host: connect.facebook.net 
Access-Control-Request-Method: GET 
Access-Control-Request-Headers: Origin, X-Requested-With, Accept 

HTTP/1.1 501 Not Implemented 
Server: AkamaiGHost 
Mime-Version: 1.0 
Content-Type: text/html 
Content-Length: 272 
Connection: close 

從技術上講,有問題的過濾/防火牆軟件是不正確的,當它阻止一個網站,它提供了一個成功的狀態代碼(200)時,應提供錯誤代碼(4xx5xx)。如果它確實以錯誤狀態正確響應,則browswer不會將響應主體解析爲腳本(從而導致錯誤)。

1

這是一個備用是如何完成的:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js"></script> 
<script>window.jQuery || document.write("<script src='js/libs/jquery-1.6.4.min.js'>\x3C/script>")</script> 

在這種情況下,試圖從googleapis.com加載jQuery的。如果這被阻止或不可用,它會加載一個本地jQuery。

您可以使用相同的技術。製作第二個腳本來檢測facebook腳本文件是否已加載。如果它尚未加載,則不要運行任何關聯的腳本。

+0

我認爲,無論如何,第一個腳本包含會產生錯誤(如果我很好理解) – fcalderan 2012-02-02 16:42:57

+0

同意 - 這是從其他地方回退並加載腳本的好方法,但它仍然會彈出語法錯誤。 – 2012-02-02 16:47:52

+0

我想如果沒有在腳本標記的src中指定協議,會導致導航器中默認協議不是http的問題。 – Jack 2012-02-02 16:56:17

1

看你的編輯,你可以通過AJAX檢查響應的內容類型時,它的text/html沒有附加腳本:使用<xhr>.getResponseHeader("Content-Type");

編輯:josh3736指出,跨站點請求不允許通過JavaScript,所以你還需要調用作爲代理的內部資源(用服務器端語言編寫),並嘗試獲取腳本,返回其內容類型(例如,看看這個討論:php, curl, headers and content-type

+0

我會運行這個,看看我能不能工作。我使用的是YUI2框架,它有各種各樣的工具。 – 2012-02-02 16:57:52

+0

getResponseHeader()是xmlHttpRequest對象的JavaScript方法。因此,擁有* xhr *對象,無論您的庫是什麼,都可以在任何地方使用它 – fcalderan 2012-02-02 17:00:45

+0

這不起作用。 XHR不允許跨源請求。 – josh3736 2012-02-02 17:10:09

相關問題