在页面上下文中使用userscript GM_functions

时间:2012-03-07 15:51:52

标签: greasemonkey userscripts ninjakit

我希望通过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 Compatibility页面,但我不确定这是否符合我的要求......

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

2 个答案:

答案 0 :(得分:1)

好的,所以我设法让GreaseMonkey官方解决方案工作(dunno我第一次做错了):

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

但是我还是更喜欢没有使用 unsafeWindow 的解决方案,如果有的话...(特别是因为这个感觉非常错误 ...)

答案 1 :(得分: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;
}