Question

J'ai la balise d'ancrage suivant, qui contient des arguments générés dynamiquement arg1,...,arg5 à la fonction JavaScript foo(), qui fonctionne sur le web site de côté. Il y a plusieurs de ces balises d'ancrage dans toute la page en question, avec des valeurs de id uniques et les valeurs argN:

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

Je voudrais tirer la fonction de programmation foo() par une boucle à travers tous les résultats pour cet élément, la recherche des arguments, et en faisant passer ces arguments à l'appel de unsafeWindow.function(args) de Greasemonkey.

Voici le script Greasemonkey je l'ai écrit à ce jour:

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

Lors de l'installation de ce script et l'exécuter, je reçois l'alerte avec les arguments arg1,...,arg5. Si je clique sur OK, je reçois l'erreur suivante dans Google Chrome 5.0.375.125 pour OS X:

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

La page Web en question a foo() définitivement - si je clique sur blah alors l'événement onclick déclenche foo(). Je ne peux pas le faire fonctionner dans ce script Greasemonkey.

Suis-je utiliser unsafeWindow.function(args) mal, ou ne pas Google Chrome en faveur de cette méthode de déclenchement à distance des fonctions JavaScript?

Y at-il une autre façon que je devrais utiliser cette fonction, ou devrais-je utiliser une autre méthode tout à fait?

Merci pour vos conseils.

Était-ce utile?

La solution

Dans Chrome, vous n'êtes pas autorisé à accéder à des variables / fonctions définies par la page de contenu du contexte userscript (voir ).

Au lieu d'appeler unsafeWindow.foo, vous pouvez simplement appeler candidate.onclick() dans votre boucle.

Si ce n'est pas ce que vous voulez, vous devez soit injecter l'appel de fonction dans le DOM en utilisant quelque chose comme

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

ou affecter un JS-uri à location:

location.assign("javascript:foo(" + script_args +");void 0");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top