Greasemonkey、Chrome 和 unsafeWindow.foo()
-
25-09-2019 - |
题
我有以下锚标记,其中包含动态生成的参数 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>
我想以编程方式触发 foo()
函数通过循环遍历该元素的所有命中,搜索参数,并将这些参数传递给 Greasemonkey 的 unsafeWindow.function(args)
称呼。
这是我迄今为止编写的 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
. 。如果单击“确定”,我会在 OS X 版 Google Chrome 5.0.375.125 中收到以下错误:
Uncaught TypeError: Object [object DOMWindow] has no method 'foo'
有问题的网页肯定有 foo()
— 如果我点击 blah
那么 onclick
事件触发器 foo()
. 。我只是无法通过这个 Greasemonkey 脚本让它工作。
我正在使用吗 unsafeWindow.function(args)
错误,或者 Google Chrome 不支持这种触发远程 JavaScript 函数的方法?
我应该有不同的方式使用这个函数,还是应该完全使用另一种方法?
谢谢你的建议。
解决方案
在 Chrome 中,您不允许从用户脚本上下文访问内容页定义的变量/函数(请参阅 这里).
而不是打电话 unsafeWindow.foo
, ,你可以直接打电话 candidate.onclick()
在你的循环中。
如果这不是你想要的,你要么必须使用类似的东西将函数调用注入到 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");
不隶属于 StackOverflow