![](/img/trans.png)
[英]How can I mimic Greasemonkey/Firefox's unsafeWindow functionality in Chrome?
[英]Greasemonkey, Chrome and unsafeWindow.foo()
我有以下锚标记,其中包含动态生成的参数arg1,...,arg5
到JavaScript函数foo()
,它在网站端运行。 在整个页面中有几个锚标记,具有唯一的id
值和argN
值:
<a href="#" id="foo1234567890" onclick="javascript:foo(arg1,arg2,arg3,arg4,arg5);return false;" target="_self" title="foobarbaz"> blah </a>
我想通过循环遍历此元素的所有匹配,搜索参数,并将这些参数传递给Greasemonkey的unsafeWindow.function(args)
调用,以编程方式触发foo()
函数。
这是我到目前为止写的Greasemonkey脚本:
function removeAllProperties() {
var xpath = "//A[@title='foobarbaz']";
var actionNodes = document.evaluate(
xpath,
document,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
);
var total = actionNodes.snapshotLength;
for (var i=0; i < total; i++) {
var candidate = actionNodes.snapshotItem(i);
//alert(candidate.nodeName);
if (candidate.nodeName === "A") {
var onclick_value = candidate.getAttribute('onclick');
var needle = /javascript:foo\((.*)\);return false\;/;
onclick_value.match(needle);
//alert(onclick_value);
//alert(RegExp.$1);
var script_args = RegExp.$1;
if (confirm(script_args)) {
unsafeWindow.foo(script_args);
}
}
}
}
removeAllProperties();
当我安装这个脚本并运行它时,我得到了带有参数arg1,...,arg5
。 如果我单击“确定”,我在Google Chrome 5.0.375.125 for OS X中收到以下错误:
Uncaught TypeError: Object [object DOMWindow] has no method 'foo'
有问题的网页肯定有foo()
- 如果我点击blah
然后onclick
事件触发foo()
。 我只是无法让它通过这个Greasemonkey脚本。
我是否错误地使用了unsafeWindow.function(args)
,或者Google Chrome不支持这种触发远程JavaScript功能的方法?
有没有不同的方法我应该使用这个功能,还是我应该完全使用另一种方法?
谢谢你的建议。
在Chrome中,您不允许从userscript上下文访问内容页面定义的变量/函数(请参阅此处 )。
您可以在循环中调用candidate.onclick()
,而不是调用unsafeWindow.foo
。
如果这不是您想要的,您必须使用类似的东西将函数调用注入到DOM中
var s = document.createElement("script");
s.innerHTML = "foo("+ script_args + ")";
document.body.appendChild(s);
或者将JS-uri分配给location
:
location.assign("javascript:foo(" + script_args +");void 0");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.