2008-09-30 14 views
8

Ich erstelle eine Firefox-Erweiterung für Demozwecke. ich eine bestimmte JavaScript-Funktion im Dokument von der Erweiterung aufrufen. schrieb ich in meinem HTML-Dokument (nicht in Erweiterung, sondern eine Seite, die von Firefox geladen ist):Wie führe ich eine seitendefinierte JavaScript-Funktion von einer Firefox-Erweiterung aus?

document.funcToBeCalled = function() { 
    // function body 
}; 

Dann wird die Erweiterung dieses auf einem Ereignis laufen:

var document = Application.activeWindow.activeTab.document; 
document.funcToBeCalled(); 

aber es löst einen Fehler aus, der besagt, dass funcToBeCalled nicht definiert ist.

Hinweis: Ich könnte ein Element auf dem Dokument erhalten, indem document.getElementById(id);

Antwort

8

Aus Sicherheitsgründen haben Sie eingeschränkten Zugriff auf die Inhaltsseite von der Erweiterung. Siehe XPCNativeWrapper und Safely accessing content DOM from chrome,

Wenn Sie die Seite steuern, ist der beste Weg, dies zu tun, ist ein Ereignis-Listener in der Seite und versenden Sie ein Ereignis aus Ihrer Erweiterung (addEventListener auf der Seite, dispatch in der Verlängerung) eingerichtet.

Andernfalls siehe http://groups.google.com/group/mozilla.dev.extensions/msg/bdf1de5fb305d365

+0

Wir könnten es tatsächlich ohne Probleme (oder einige "Control-Seite" Sachen) http://stackoverflow.com/questions/42577963/calling-web-sites-js-function-from-firefox-addon-web-extensions es ist auch einfacher für Chrome, aber jetzt nur ein Problem mit Web Extensions für Firefox – user25

0

Aufruf Sie können es tun, aber Sie müssen die Kontrolle über die Seite haben und in der Lage die Berechtigungsstufe für das Skript zu erhöhen. Mozilla Documentation gives an example - Suche nach "Privileg" auf der Seite.

+0

Dies ist eine Antwort auf eine andere Frage, und empfehle EnablePrivilege ist keine gute Idee im Allgemeinen. – Nickolay

6
document.wrappedJSObject.funcToBeCalled(); 

Dies ist nicht sichern und ermöglicht eine bösartige Seite die Berechtigungen die Ihre Erweiterung zu erhöhen ... Aber es tut, was Sie gefragt. Lesen Sie auf dem frühen greasemonkey vulnerabilities nach, warum dies eine schlechte Idee ist.

1

Ich habe eine sehr einfachere Möglichkeit, es zu tun. Angenommen, Sie müssen die Funktion xyz() aufrufen, die auf der Seite geschrieben ist. und du musst es von deinem PlugIn aus anrufen.

erstellen Sie eine Schaltfläche ("machen Sie es unsichtbar. So wird es nicht stören Ihre Seite"). Wenn Sie auf diese Schaltfläche klicken, rufen Sie diese Funktion xyz() auf.

<input type="button" id="testbutton" onclick="xyz()" /> 

jetzt in pluggin haben Sie ein Dokumentobjekt für die Seite. nehme seine mainDoc

wo Sie anrufen möchten xyz(), führen gerade diese Linie

mainDoc.getElementById('testbutton').click(); 

es wird die xyz() Funktion aufrufen.

viel Glück :)