如何在更改资源的URL时检查403和404错误?
我正在制作TamperMonkey Chrome扩展的用户脚本(它与制作GreaseMonkey的userscript相同)。如何在更改资源的URL时检查403和404错误?
在我的脚本中,我通过document.getElementsByTagName()
迭代了一些文档外部资源(img,css,链接,脚本),并将其src
或href
属性更改为另一个url。
对于大多数情况下,新的url正常加载,但在某些情况下,它终止于我的代理404或403错误。
你能给我一些关于如何处理(如果可能的话)正确的“资源无法加载新的url”的指针?另外,如果问题资源导致重定向的url,我可以告诉资源被重定向(如何检查302)?
我现在使用裸JavaScript,没有jQuery。但是如果jQuery能够帮助我,我愿意接受它。
我考虑过从每个资源url的XMLHttpRequest结果测试头文件,但是在我看来,就像使用大炮来杀死苍蝇一样。我宁愿使用一个恰当的处理程序,可以在不可用资源的情况下触发。
编辑:另外,我将是确定如果Chrome将有一个排序的每个载入对象,我可以检查状态财产......
这只是一个想法,我不知道的可行性,但它可能值得尝试。在解释代码:
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 */;
}
我不知道如果onload
,onerror
处理程序时,您更改现有script
标签的src
工作。
请报告您的发现。 ;)
我会在javascript中检查document.styleSheets。
这里是样式表工作的jsfiddle:
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:
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)
}
我认为有关测试来自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
让我知道的jsfiddle非常感谢,这似乎为原型非常有趣。我将尝试一下样式表方法。关于脚本部分,我不能测试一个已知的对象,因为我事先不知道脚本中的内容。 – Seki 2012-02-15 20:21:32