2011-01-07 3 views
4

Heute ist mein erster Tag mit Firefox Erweiterungen arbeiten.Wie man Code in einer Firefox Extension auf einem Timer ausführen lässt

Grundsätzlich mache ich eine Erweiterung, die in einem internen Netzwerk verwendet wird, um einen Webserver auf neue Benachrichtigungen zu überprüfen.

Ich habe den Assistenten auf der Mozilla-Seite verwendet, um eine Skelett-Erweiterung zu erstellen, und habe dann hauptsächlich overlay.js mit etwas Ajax-Code bearbeitet.

Ich benutze den Ereignis-Listener "load", um einen setTimeout zu meinem Ajax-Aufruf aufzurufen, der dann mit setTimeouts eine Schleife bildet.

Das Problem scheint zu sein, dass der Listener "load" in jedem neuen Browserfenster ausgeführt wird. Ich möchte nur einen globalen Timer, von dem das funktioniert.

Irgendwelche Ideen?

Update:

ich dies gefunden: https://developer.mozilla.org/en/JavaScript_code_modules/Using die wie scheint, was ich möchte. Das Problem ist, ich kann nicht herausfinden, wie Sie die JSM-Datei importieren. Was ist die Verzeichnisstruktur?

Update:

Beim Versuch, diese:

chrome.manifest

content spt     chrome/content/ 
skin  spt classic/1.0 chrome/skin/ 
locale spt en-US   chrome/locale/en-US/ 


overlay chrome://browser/content/browser.xul chrome://spt/content/ff-overlay.xul 
style chrome://global/content/customizeToolbar.xul chrome://spt/skin/overlay.css 


resource mycontent chrome/content/ 

ersten 5 Zeilen aus Chrom/content/overlay.js

try{ 
    Components.utils.import("resource://spt/mycontent/ajax.jsm"); 
}catch(err){ 
    alert(err); 
} 

ich dieser Fehler:

[Ausnahme ... "Komponente zurückgegeben Fehlercode: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [NsIXPCComponents_Utils.import]" Nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" Speicherort: "JS-Rahmen :: chrome: //spt/content/overlay.js :: :: line 2" Daten: no]

Oder wenn, wenn ich die Ressource alias aus chrome.manifest entfernen und diese

am Anfang overlay.js verwenden
try{ 
    Components.utils.import("chrome://spt/content/ajax.jsm"); 
}catch(err){ 
    alert(err); 
} 

ich diesen Fehler:

[Ausnahme ... "Komponente Fehlercode zurückgegeben: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIXPCCompo nents_Utils.import] "nsresult:" 0x80070057 (NS_ERROR_ILLEGAL_VALUE) "Speicherort:" JS-Rahmen :: chrome: //spt/content/overlay.js :: :: Zeile 3 "Daten: Nein]

+1

Ich habe die Seite aktualisiert, die Sie gefunden haben, um die Antwort auf Ihre Frage zur Registrierung des Codemoduls einfacher zu finden. Ist es jetzt klarer? – Nickolay

+0

Ja, das ist viel klarer, aber ich kann es immer noch nicht zur Arbeit bringen. Beim Versuch, den Import auszuführen, erhalte ich den Fehler: [Exception ... "Component gab den Fehlercode zurück: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIXPCComponents_Utils.import]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS-Frame :: chrome://spt/content/overlay.js :: :: Zeile 3 "Daten: Nein] – Mike

Antwort

5

Ja, wenn Sie Haben Sie Code, der zwischen Fenstern geteilt werden soll (und nicht ausgeführt werden sollte, wenn ein neues Fenster geladen wird) und keinen Zugriff auf den Chrom benötigen, verwenden Sie JavaScript code modules.

Components.utils.import("resource://youraddon/your_module.jsm"); 

vorausgesetzt, dass Sie Setup resource in Ihrem chrome.manifest:

Sie können Ihre Module mit importieren. Z.B.wenn Sie

resource youraddon modules/ 

fügen dann Sie die Datei muss in /path/to/your/addon/modules/your_module.jsm gespeichert werden.

Weitere Hinweise:

  • -Code-Module müssen .jsm die Dateierweiterungen nicht haben. Sie können es .js verlassen. Funktioniert manchmal besser mit bestimmten Editoren (und Syntax-Hervorhebung usw.).
  • Afaik können Sie setTimeout nicht in einem Modul verwenden, da es keinen Zugriff auf das Objekt window hat. Ich schlage vor, nsITimer zu verwenden.
+0

Ich bekomme einen Fehler mit dieser Methode auch. [Ausnahme ... "Komponente hat Fehlercode zurückgegeben: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [NsIXPCComponents_Utils.import]" Nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" Speicherort: "JS-Rahmen :: chrome: //spt/content/overlay.js :: :: Zeile 2 "Daten: Nein] – Mike

+0

@Mike: Bitte geben Sie den entsprechenden Code ein. Sonst können wir nicht helfen. –

+0

Ich habe den ursprünglichen Beitrag mit weiteren Details aktualisiert. – Mike