2012-02-15 102 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