4

我正在为 TamperMonkey Chrome 扩展程序制作用户脚本(它与为 GreaseMonkey 制作用户脚本相同)。

在我的脚本中,我通过迭代一些文档外部资源(img、css、链接、脚本),document.getElementsByTagName()并将它们的srchref属性更改为另一个 url。

在大多数情况下,新 url 可以正确加载,但在某些情况下,它会以来自我的代理的 404 或 403 错误结束。

你能给我一些关于如何正确处理(如果可能的话)“资源不能用新的 url 加载”的指示吗?另外,如果请求的资源导致重定向的 url,我可以被告知资源被重定向(如何检查 302)?

我现在使用的是纯 JavaScript,没有 jquery。但如果 jQuery 可以帮助我,我愿意采用它。

我考虑过为每个资源 url 测试 XMLHttpRequest 结果中的标头,但在我看来,这就像使用大炮杀死苍蝇一样。我宁愿使用适当的处理程序,以防资源不可用时触发。

编辑:或者,如果 chrome 对我可以检查的每个加载的对象都有一种状态属性,我会没事的......

4

3 回答 3

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)
}
于 2012-02-15T19:15:28.190 回答
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 */;
}

我不确定当您更改现有标签的onload,onerror处理程序是否有效。srcscript

请报告您的发现。;)

于 2012-02-15T18:11:02.677 回答
0

我考虑过为每个资源 url 测试 XMLHttpRequest 结果中的标头,但在我看来,这就像使用大炮杀死苍蝇一样。

嗯...这就是我所做的,但我们的脚本有不同的目的。

    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

于 2012-04-05T17:09:46.117 回答