我有以下锚标记,其中包含动态生成的参数 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");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top