Wie benutzt man Flowplayer-Funktionen in einem Inhaltsskript?

8

Ich versuche ein Firefox Add-on für den persönlichen Gebrauch zu schreiben und ein bisschen mehr über JavaScript und das Firefox Add-on SDK zu lernen. Das Add-on sollte eine vivo.sx URL öffnen und dann den Player automatisch starten, aber ich habe 2 Probleme. Ich hoffe ihr könnt mir helfen.

Der relevante Add-on-Code:

%Vor%

Inhaltsskript

%Vor%

Das erste Problem ist, dass die Funktion play 2 Mal ausgelöst wird, aber nur einmal ausgeführt werden sollte. Es ist wahrscheinlich die onAttach , die nicht richtig funktioniert. Was denkst du darüber?

Das wichtigere Problem ist ReferenceError . Ich habe ein Greasemonkey-Skript, in dem ich die Funktion flowplayer().load(); verwende. Ich dachte, das Inhaltsskript läuft wie ein Greasemonkey-Skript. Also sollte ich diese Funktion nutzen können. Ist das korrekt? Wie kann ich das beheben?

mein Skript für die Graemonemonkey

%Vor%

Ich bin ziemlich neu, also bitte Geduld mit mir:)

Wenn Sie weitere Informationen benötigen, hinterlassen Sie bitte einen Kommentar.

    
Yasmine Eastoft 21.10.2016, 03:09
quelle

1 Antwort

1

Das Problem besteht darin, dass Sie nicht berücksichtigen, dass Ihr Inhaltsskript in einem anderen Kontext ausgeführt wird als die Skripts auf der Webseite (Seitenskripts). Content-Skripte von Seiten-Skripts getrennt zu halten ist eine normale Architektur für Browser-Erweiterungen, die aus Sicherheitsgründen durchgeführt wird. Ihr Inhaltsskript verfügt über höhere Berechtigungen als für Seitenskripts. Während Sie technisch eine Funktion ausführen können, die von der Seite aus Ihrem Inhaltsskriptkontext zur Verfügung gestellt wird, sollten Sie dies aus Sicherheitsgründen niemals tun. Wenn Sie dies tun, wird Ihre Erweiterung nicht von Mozilla geprüft, damit sie auf AMO .

Sie können Funktionen, die in Ihrem Inhaltsskript vorhanden sind, auf der Seite verfügbar machen Skripts und Objekte im Seitenskriptbereich erstellen besteht die Möglichkeit, Code innerhalb des Seitenskriptkontexts auszuführen, darin, ein <script> -Element zu document hinzuzufügen, das den Code enthält, den Sie ausführen möchten.

Für den Code in Ihrer Frage könnte dies wie folgt implementiert werden:

%Vor%

onAttach / play läuft mehr als einmal:
Ohne Ihren vollständigen Code und einen Screenshot dessen, wie der Browser aussah, ist es unmöglich, sicher zu sein, warum dies passieren würde.

Der wahrscheinlichste Grund ist, dass Sie mehr als einen Tab für eine Adresse geöffnet haben, die mit "https://vivo.sx/*" übereinstimmt. Ihr onAttach Code wird jedes Mal aufgerufen, wenn das Inhaltsskript an eine Seite angehängt wird. Es wird einmal für jeden Tab angehängt, der für eine passende URL geöffnet ist. Wenn beim Laden des Add-Ons zwei Registerkarten für übereinstimmende URLs geöffnet waren, wird der onAttach -Code zweimal ausgeführt.

Eine weitere Möglichkeit besteht darin, dass Sie vivoplay mehr als einmal ausgeführt haben und mehrere PageMod s eingerichtet haben, von denen jede eine separate Kopie Ihres Inhaltsskripts an jede Registerkarte anfügt. Mit dem Namen, den Sie für diese Funktion verwendet haben, vivoplay , behandeln Sie sie möglicherweise als eine Wiedergabefunktion, die Sie mehrmals ausführen. Mit wie Sie Dinge innerhalb dieser Funktion organisiert haben, sollten Sie nicht tun.

Übermäßig komplex für das, was angezeigt wird:
Ihr Code ist zu komplex für das, was angezeigt wird. Sie verwenden das onAttach -Ereignis, um start an das Inhaltsskript zu senden. Das Inhaltsskript wird nur geladen / ausgeführt, wenn es angehängt ist. Daher ist das Informieren des Inhaltsskripts, an das es angehängt ist, indem start gesendet wird, redundant. Dies kann sinnvoll sein, wenn Sie beabsichtigen, den Code so zu ändern, dass nur start als Antwort auf ein anderes Ereignis gesendet wird (z. B. wenn der Benutzer auf eine Schaltfläche klickt). Wenn Sie jedoch den Flowplayer immer automatisch starten möchten, müssen Sie keine start -Nachricht an das Inhaltsskript senden. Das Inhaltsskript kann das setTimeout haben und einfach weitermachen und diesen Code ausführen, wenn es ausgeführt wird.

    
Makyen 23.10.2016, 22:42
quelle