2

我想通过 XMLHTTPRequest 将特定页面中的所有内容“重新链接”到本地网络域。这将导致我进入 GreaseMonkey/NinjaKit 中的 GM_xmlhttpRequest,除了我想在单击链接运行它,而不是在用户脚本实际运行时运行它......

所以我有类似的东西:

links = document.getElementsByTagName('a');
for (i = 0; i < links.length; i++) {
    oldhref = links[i].getAttribute('href');
    links[i].setAttribute('href', 'javascript:loadLink(' + oldhref + ')');
}

我知道我可以使用 unsafeWindow 或向文档添加脚本元素以注入loadLink函数。 但是如何在 loadLink 中使用GM_xmlhttpRequest呢?

我查看了0.7.20080121.0 兼容性页面,但我不确定这是否符合我的需要......

我还考虑向页面添加iframe,修改后的链接将加载到iframe中(再次触发用户脚本),但我更喜欢更清洁的解决方案......

4

2 回答 2

1

好的,所以我设法让 GreaseMonkey 官方解决方法工作(不知道我第一次做错了什么):

unsafeWindow.loadLink = function(href) {
    setTimeout(function(){
        GM_xmlhttpRequest({
            //wtv
        });
    },0);
}

但是如果有一个,我仍然更喜欢不使用unsafeWindow的解决方案......(特别是因为这个感觉很不对......)

于 2012-03-07T16:00:53.383 回答
1

您几乎不需要在页面上下文中使用 GM 函数,而且从目前发布的代码来看,unsafeWindow在这种情况下您也不需要。

此外,没有必要为href迄今为止发布的内容重写。

这样的事情将完成你想要的:

var links = document.getElementsByTagName ('a');

for (var J = 0, len = links.length;  J < len;  ++J) {
    links[J].addEventListener ("click", myLoadLink,   false);
}

function myLoadLink (zEvent) {
    zEvent.preventDefault();
    zEvent.stopPropagation();

    var targetHref = zEvent.currentTarget.getAttribute ('href');

    GM_xmlhttpRequest ( {
        //wtv
    } );

    return false;
}


或者使用 jQuery:

$("a").click (myLoadLink);

function myLoadLink () {

    var targetHref = $(this).attr ('href');

    GM_xmlhttpRequest ( {
        //wtv
    } );

    return false;
}
于 2012-03-08T10:10:26.293 回答