Pergunta

Eu tenho a seguinte tag de âncora, que contém argumentos gerados dinamicamente arg1,...,arg5 para a função JavaScript foo(), que é executado no lado do site. Existem várias dessas tags de ancoragem ao longo da página em questão, com exclusivo id valores e argN valores:

<a href="#" id="foo1234567890" onclick="javascript:foo(arg1,arg2,arg3,arg4,arg5);return false;" target="_self" title="foobarbaz"> blah </a>

Eu gostaria de disparar programaticamente o foo() Função percorrendo todos os hits para este elemento, pesquisando os argumentos e passando esses argumentos para o Greasemonkey's unsafeWindow.function(args) ligar.

Aqui está o roteiro Greasemonkey que escrevi até agora:

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();

Quando instalo este script e o executo, recebo o alerta com os argumentos arg1,...,arg5. Se eu clicar em OK, recebo o seguinte erro no Google Chrome 5.0.375.125 para o OS X:

Uncaught TypeError: Object [object DOMWindow] has no method 'foo'

A página da web em questão definitivamente tem foo() - Se eu clicar em blah então o onclick gatilhos de eventos foo(). Eu simplesmente não consigo fazer isso funcionando com este script Greasemonkey.

Estou usando unsafeWindow.function(args) Incorretamente, ou o Google Chrome não suporta esse método de acionar funções JavaScript remotas?

Existe uma maneira diferente de usar essa função ou devo usar outro método completamente?

Obrigado pelo teu conselho.

Foi útil?

Solução

No Chrome, você não tem permissão para acessar variáveis/funções definidas pela página de conteúdo do contexto dos usuários (veja aqui).

Em vez de ligar unsafeWindow.foo, você pode simplesmente ligar candidate.onclick() em seu loop.

Se não é isso que você quer, você precisa injetar a chamada de função no dom usando algo como

var s = document.createElement("script");
s.innerHTML = "foo("+ script_args + ")";
document.body.appendChild(s);

ou atribuir um JS-URI a location:

location.assign("javascript:foo(" + script_args +");void 0");
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top