我希望通过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 中(再次触发用户脚本),但我更喜欢清洁解决方案......
答案 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;
}