Frage

Ich habe folgenden Anker-Tag, die dynamisch generierten Argumente arg1,...,arg5 an die JavaScript-Funktion foo() enthält, die auf der Web-Site-Seite ausgeführt wird. Es gibt mehrere dieser Anker-Tags auf der ganzen Seite in Frage, mit einzigartigen id Werte und argN Werte:

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

Ich möchte programmatisch die foo() Funktion ausgelöst durch für dieses Element durch alle Hits Looping, für die Argumente der Suche und Weitergabe dieser Argumente zu Grease des unsafeWindow.function(args) Aufruf.

Hier ist das Greasemonkey-Skript ich geschrieben habe, so weit:

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

Als ich das Skript installieren und ausführen, bekomme ich die Warnung vor den Argumenten arg1,...,arg5. Wenn ich auf OK klicken, erhalte ich die folgende Fehlermeldung in Google Chrome 5.0.375.125 für OS X:

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

Die Web-Seite in Frage hat definitiv foo() - wenn ich auf blah klicken Sie auf die onclick Ereignis-Triggern foo(). Ich kann einfach nicht bekommen es durch diese Greasemonkey-Skript arbeiten.

Am I mit unsafeWindow.function(args) falsch, oder ist Google Chrome diese Methode nicht auszulösen Remote JavaScript-Funktionen unterstützen?

Gibt es eine andere Art, wie ich diese Funktion verwenden sollte, oder soll ich eine andere Methode vollständig?

Vielen Dank für Ihre Beratung.

War es hilfreich?

Lösung

In Chrome, sind Sie nicht erlaubt den Zugriff auf Variablen / Funktionen, die von der Inhaltsseite aus dem Kontext definiert userscript (siehe hier ).

Statt unsafeWindow.foo zu nennen, könnten Sie einfach candidate.onclick() in Ihrer Schleife aufrufen.

Wenn das nicht das, was Sie wollen, Sie müssen entweder den Funktionsaufruf in das DOM injizieren mit so etwas wie

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

oder weisen einen JS-uri zu location:

location.assign("javascript:foo(" + script_args +");void 0");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top