5

Tengo la siguiente etiqueta de anclaje, que contiene argumentos generados 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 la única id valores y argN valores:Greasemonkey, Chrome y unsafeWindow.foo()

<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 esos argumentos a la llamada de 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 los argumentos arg1,...,arg5. Si hago clic en OK, me sale el siguiente error en Google Chrome 5.0.375.125 para OS X: la página

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

La web en cuestión definitivamente tiene foo() - si hago clic en blah entonces el evento onclick desencadena foo(). Simplemente no puedo hacerlo funcionar a través de este script de Greasemonkey.

estoy usando unsafeWindow.function(args) incorrectamente o qué Google Chrome no admite este método de activación de funciones de JavaScript remotas?

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

Gracias por su consejo.

Respuesta

11

En Chrome, no tiene permitido acceder a las variables/funciones definidas por la página de contenido desde el contexto de la lista de usuarios (consulte here).

En lugar de llamar al unsafeWindow.foo, puede llamar al candidate.onclick() en su bucle.

Si eso no es lo que quiere, que o bien tienen que inyectar la llamada de 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"); 
+0

Saludos , ¡muy apreciado! –

Cuestiones relacionadas