Greasemonkey、Chrome 和 unsafeWindow.foo()

2023-11-30

我有以下锚标记,其中包含动态生成的参数arg1,...,arg5到 JavaScript 函数foo(),它在网站端运行。整个页面中有几个这样的锚标记,它们具有独特的id价值观和argN values:

<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) call.

这是我迄今为止编写的 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 中,您不允许从用户脚本上下文访问内容页定义的变量/函数(请参阅here).

而不是打电话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");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Greasemonkey、Chrome 和 unsafeWindow.foo() 的相关文章

随机推荐