繁体   English   中英

Greasemonkey,Chrome和unsafeWindow.foo()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM