2012-02-15 128 views
4

我正在製作TamperMonkey Chrome擴展的用戶腳本(它與製作GreaseMonkey的userscript相同)。如何在更改資源的URL時檢查403和404錯誤?

在我的腳本中,我通過document.getElementsByTagName()迭代了一些文檔外部資源(img,css,鏈接,腳本),並將其srchref屬性更改爲另一個url。

對於大多數情況下,新的url正常加載,但在某些情況下,它終止於我的代理404或403錯誤。

你能給我一些關於如何處理(如果可能的話)正確的「資源無法加載新的url」的指針?另外,如果問題資源導致重定向的url,我可以告訴資源被重定向(如何檢查302)?

我現在使用裸JavaScript,沒有jQuery。但是如果jQuery能夠幫助我,我願意接受它。

我考慮過從每個資源url的XMLHttpRequest結果測試頭文件,但是在我看來,就像使用大炮來殺死蒼蠅一樣。我寧願使用一個恰當的處理程序,可以在不可用資源的情況下觸發。

編輯:另外,我將是確定如果Chrome將有一個排序的每個載入對象,我可以檢查狀態財產......

回答

1

這只是一個想法,我不知道的可行性,但它可能值得嘗試。在解釋代碼:

var errorHandler = function(event) { 
    // Do something if the script could not be loaded 
}; 

var scripts = document.getElementsByTagName("script"); 
for(var i = 0, len = scripts.length; i < len; i++) { 
    scripts[i].onerror = errorHandler; 
    scripts[i].src = /* Some way to get your new src */; 
} 

我不知道如果onloadonerror處理程序時,您更改現有script標籤的src工作。

請報告您的發現。 ;)

2

我會在javascript中檢查document.styleSheets。

這裏是樣式表工作的jsfiddle:

http://jsfiddle.net/BQxBz/4/

var styleSheetExists = function(name) { 
    for (var i in document.styleSheets) { 
     if (typeof document.styleSheets[i] == "object") { 
      link = document.styleSheets[i].href; 
      if (link === null) { 
       continue; 
      } 

      if (link.indexOf(name, link.length - name.length) !== -1) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

$(document).ready(function() { 
    console.log(styleSheetExists('jquery-ui.css')); 
    console.log(styleSheetExists('doesnotexist.css')); 
}); 

對於JavaScript我會用物體檢測:這樣看,應該由某個腳本加載某個對象。例如,要檢測的jQuery:

http://jsfiddle.net/TqQtE/

if (typeof jQuery == "undefined") 
{ 
    // load jquery 
    var fileref=document.createElement('script') 
    fileref.setAttribute("type","text/javascript") 
    fileref.setAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js") 
    document.getElementsByTagName("head")[0].appendChild(fileref) 
} 
+0

讓我知道的jsfiddle非常感謝,這似乎爲原型非常有趣。我將嘗試一下樣式表方法。關於腳本部分,我不能測試一個已知的對象,因爲我事先不知道腳本中的內容。 – Seki 2012-02-15 20:21:32

0

我認爲有關測試來自XMLHttpRequest的結果標頭 每個資源的URL,但它看起來對我來說,使用火炮到 殺蒼蠅。

呃...這就是我所做的,但我們的腳本有不同的目的。

function conectar(metodo, endereco, resposta, corpo) { 
     callback = function(xhr) { resposta(xhr) }; 
     GM_xmlhttpRequest({ 
      "method" : metodo, 
      "url"  : endereco, 
      "onerror" : callback, 
      "onload" : callback, 
      "headers" : {'Content-Type' : 'application/x-www-form-urlencoded'}, 
      "data"  : corpo 
     }); 
    } 

然後

conectar('HEAD', linkkhref, resp) 

檢查我的位置:RandomProxyHeader