2016-08-29 2 views
0

Ich entwickle eine FireFox-Erweiterung mit JPM-Addon. Ich lade ein Panel von den wichtigsten index.js wie so Datei ...FF Addon (JPM) Pass Nachricht von Panel-Skript zu Hauptindex-Skript

var panel = require('sdk/panel'); 
var panel = panel.Panel({ 
    contentURL: url('pages/popup.html'), 
    onHide: doHide 
}); 

//and in another place... 
panel.show({ 
      position: button 
     }); 

Die Seiten/popup.html Datei verweist auf eine JavaScript-Datei, und ich verwende den relativen Pfad zu laden. Ich muss herausfinden, wie man eine Nachricht von dieser Javascript-Datei, geladen von der Panel-Webseite, an die Hauptindex.js-Skriptdatei des Addons weitergibt.

I postmessage sowie port.emit versucht ...

Also, entweder

//index.js 
panel = require("sdk/panel").Panel({ 
    onMessage: function(message) { 
    console.log(message); 
    } 
}); 

//popup.js - panel file 
panel.postMessage('something'); 

... oder ...

//index.js 
panel.on("message", function(text) { 
    console.log(text); 
}); 

//popup.js 
self.port.emit('message', 'hello world'); 

jedoch diese beiden don Es scheint nicht zu funktionieren. Hilfe!

Antwort

0

Sie sollten den Abschnitt "Scripting trusted panel content" in der MDN sdk/panel page lesen. Der relevanteste Text ist:

wie ein Content-Skript können diese Skripte mit dem Add-On Code kommunizieren die postMessage() API oder die port API. Der entscheidende Unterschied besteht darin, dass diese Skripts auf die Objekte postMessage und port über das Objekt addon zugreifen, während Inhaltsskripte über das Objekt self auf sie zugreifen.

Also, Ihr popup.js sollte Code sein:

addon.port.emit('message', 'hello world'); 

Und Ihre index.js:

panel.port.on("message", function(text) { 
    console.log(text); 
}); 

Es ist ein Beispiel-Add-on in der " Scripting trusted panel content "Abschnitt, der die Kommunikation in beide Richtungen zwischen dem vertrauenswürdigen Panel (Panel-Inhalt stammt aus dem Add-On) und dem Haupt-Hintergrund-Scrip zeigt t des Add-ons.

+0

Kann man auch eine Funktion aus dem Addon-Skript aufrufen? In Wirklichkeit portiere ich eine Chrome-Erweiterung und kann den Rückruf nicht für das verwenden, was ich brauche. –

+1

@ShahidThaika, Nachrichtenübergabe ist asynchron (möglicherweise von einem Prozess zum anderen). Dies gilt auch für Chrome. Wenn Sie eine synchrone Funktion zum Senden einer Nachricht aus dem Add-On-Skript meinen, dann ja. Für den obigen Code wäre das 'panel.port.emit (nameOfMessage, message);'. BTW: Wenn Sie eine Chrome-Erweiterung portieren und dies noch nicht getan haben, sollten Sie sich die [WebExtensions] (https://developer.mozilla.org/en-US/Add-ons/WebExtensions) ansehen. API, die Chrome-Erweiterungen sehr ähnlich ist. – Makyen

+0

Ich habe eine Funktion im Panel verwendet, um eine Zeichenfolge basierend auf der Lokalisierung des Browsers zurückzugeben. In FF scheint es jedoch notwendig zu sein, require ('sdk/l10n'). Get, auf das nur über die Datei index.js zugegriffen werden kann. Ich muss herausfinden, wie ich die Lokalisierungsfunktion aufrufen soll. –

Verwandte Themen