Pregunta

Tengo la siguiente etiqueta de anclaje, que contiene argumentos generado dinámicamente arg1,...,arg5 a la función de JavaScript foo(), que se ejecuta en el lado del sitio web. Hay varias de estas etiquetas de anclaje a través de la página en cuestión, con valores únicos y valores id argN:

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

Me gustaría disparar mediante programación la función foo() por bucle a través de todos los éxitos para este elemento, en busca de los argumentos, y pasando los argumentos al llamado unsafeWindow.function(args) de Greasemonkey.

Aquí está el script de Greasemonkey que he escrito hasta ahora:

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

Cuando instalo este script y ejecutarlo, me da la alerta con el arg1,...,arg5 argumentos. Si hago clic en OK, me sale el siguiente error en Google Chrome 5.0.375.125 para OS X:

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

La página web en cuestión definitivamente tiene foo() - si hago clic en blah entonces el onclick activadores de eventos foo(). No puedo conseguir que funcione a través de este script de Greasemonkey.

Am I utilizando unsafeWindow.function(args) de forma incorrecta, o hace Google Chrome no apoyar este método de activación remota las funciones de JavaScript?

¿Hay una manera diferente que debería utilizar esta función, o debería utilizar otro método completamente?

Gracias por su consejo.

¿Fue útil?

Solución

En Chrome, no estás permitido a las variables de acceso / funciones definidas por el contenido de la página a partir del contexto userscript (ver aquí ).

En lugar de llamar unsafeWindow.foo, sólo podría llamar candidate.onclick() en su bucle.

Si eso no es lo que quiere, que o bien tiene que inyectar la llamada a la función en el DOM usando algo como

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

o asignar un JS-uri a location:

location.assign("javascript:foo(" + script_args +");void 0");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top