2016-10-21 6 views
8

Ich versuche, ein Firefox Add-on für den persönlichen Gebrauch zu schreiben und ein wenig 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.Wie benutzt man Flowplayer-Funktionen in einem Inhaltsskript?

Der entsprechende Add-on-Code:

function vivoplay() 
{ 
    pageMod.PageMod({ 
     include: "https://vivo.sx/*", 
     contentScriptFile: "./vivoplay.js", 
     onAttach: play 
    }); 

    function play(worker)      //Fires 2 Times 
    { 
     console.log("Timeout"); 
     tmr.setTimeout(sendplay, 14000); 
     function sendplay() 
     { 
      var a = 0; 
      worker.port.emit("start", a); 
     } 
    } 
} 

content-Skript

self.port.on("start", function(a) { 
    console.log("Load"); 
    flowplayer().load();   //ReferenceError: flowplayer is not defined 
    console.log("Loaded"); 
}); 

Das erste Problem ist, dass die Funktion play Brände 2 mal, aber nur einmal ausgeführt werden soll. Es ist wahrscheinlich die onAttach, die nicht richtig funktioniert. Was denkst du darüber? Das wichtigere Problem ist das 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 Greasemonkey-Skript

// ==UserScript== 
// @name  3. Vivo 
// @namespace Autoplay 
// @include  https://vivo.sx/* 
// @version  1 
// @grant  none 
// ==/UserScript== 

window.setTimeout(Play, 2000); 
function Play() 
{ 
    flowplayer().load(); 
    console.log("Loaded"); 
    flowplayer().fullscreen(); 
    console.log("Fullscreen started"); 
} 

Ich bin ganz neu in diesem so sein bitte Geduld mit mir :)

Wenn Sie mehr Informationen benötigen, lassen Sie einen Kommentar.

+1

Wo definierst du 'flowplayer()'? – Makyen

+0

Nirgendwo Ursache Ich weiß es nicht zu definieren –

+0

Wie wird es dann in die Umgebung aufgenommen, die Sie in Greasemonkey verwenden? Ist es als Teil der Seite enthalten, mit der Sie interagieren möchten? – Makyen

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 unter AMO aufgeführt wird.

Sie können zwar expose functions which exist in your content script to page scripts und create objects in the page script scope, die Art und Weise, um tatsächlich Code innerhalb der Seite Skript Kontext auszuführen ist ein <script> Element zum document fügen Sie den Code enthält, die Sie ausführen wollen.

Für den Code in Ihrer Frage, könnte dies implementiert werden, wie:
Ohne Ihre vollständigen Code und einen Screenshot von dem, was der Browser sah aus wie:

self.port.on("start", function(a) { 
    let newScript = document.createElement('script'); 
    //The calls to console.log don't need to be in the page script. 
    // However, the code in the newScript is executed asynchronously. Thus, if the 
    // console.log("Loaded"); 
    // is in the content script it will be executed prior to flowplayer().load() actually 
    // being called. 
    newScript.innerHTML = 'console.log("Load");' 
         + 'flowplayer().load();' 
         + 'console.log("Loaded");' ; 
    document.head.appendChild(newScript); 
}); 

onAttach/play mehr als einmal ausgeführt wird Es ist unmöglich, sicher zu sein, warum dies passieren würde.

Der wahrscheinlichste Grund ist, dass mehr als eine Registerkarte für eine Adresse geöffnet wurde, die "https://vivo.sx/*" entspricht. Ihr Code onAttach wird jedes Mal aufgerufen, wenn das Inhaltsskript an eine Seite angehängt ist. 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 Code onAttach zweimal ausgeführt.

Eine andere Möglichkeit ist, dass Sie vivoplay mehr als einmal ausgeführt haben, was zur Einrichtung mehrerer PageMod s führte, von denen jede eine separate Kopie Ihres Inhaltsskripts an jede Registerkarte anhängen würde. Mit dem Namen, den Sie für diese Funktion verwendet haben, vivoplay, behandeln Sie sie möglicherweise als eine Wiedergabefunktion, die Sie mehr als einmal ausführen. Mit wie Sie Dinge innerhalb dieser Funktion organisiert haben, sollten Sie dies nicht tun.

übermäßig komplex für das, was gezeigt wird:
Ihr Code ist zu komplex für das, was gezeigt wird. Sie verwenden das Ereignis onAttach, 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, das durch Senden von start angehängt wird, redundant. Dies kann sinnvoll sein, wenn Sie beabsichtigen, den Code so zu ändern, dass er nur als Antwort auf ein anderes Ereignis (z. B. wenn der Benutzer auf eine Schaltfläche klickt) start sendet. Wenn Sie jedoch den Flowplayer immer automatisch starten möchten, müssen Sie keine start Nachricht an das Inhaltsskript senden. Das Inhaltsskript kann die setTimeout haben und einfach weitermachen und diesen Code ausführen, wenn es ausgeführt wird.

+0

Vielen Dank für Ihre Antworten. Ich habe mein Add-On endlich zur Arbeit gebracht. Aber ich hatte ein paar Fragen zu Ihrer Lösung. Wann wird das von mir hinzugefügte Skriptelement ausgeführt? Und kannst du mir einen Tipp geben, wie ich meine angehängten Inhaltsskripte rückgängig machen kann, damit der Browser normal funktioniert, nachdem mein Add-on seine Arbeit erledigt hat? –

+0

Die '