2016-10-21 25 views
8

Próbuję napisać dodatek do przeglądarki Firefox do użytku osobistego i dowiedzieć się nieco więcej o JavaScript i pakiecie SDK dla Firefox Add-on. Dodatek powinien otworzyć adres URL vivo.sx, a następnie automatycznie uruchomić odtwarzacz, ale mam 2 problemy. Mam nadzieję, że mi pomożesz.Jak korzystać z funkcji Flowplayer w skrypcie treści?

Odpowiedni kod add-on-:

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); 
     } 
    } 
} 

treści skryptu

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

Pierwszym problemem jest to, że funkcja play pożary 2 razy, ale należy uruchomić tylko raz. To prawdopodobnie onAttach, który nie działa poprawnie. Co sądzisz o tym?

Ważniejszym problemem jest ReferenceError. Mam skrypt Greasemonkey, w którym używam funkcji flowplayer().load();. Myślałem, że skrypt zawartości działa jak skrypt Greasemonkey. Powinienem móc korzystać z tej funkcji. Czy to jest poprawne? Jak mogę to naprawić?

mój skrypt Greasemonkey

// ==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"); 
} 

Jestem zupełnie nowy w tym więc proszę o cierpliwość ze mną :)

Jeżeli potrzebują Państwo więcej informacji, proszę zostawić komentarz.

+1

Gdzie definiujesz 'flowplayer()'? – Makyen

+0

nigdzie nie wiadomo, jak to zdefiniować. –

+0

W jaki sposób zostaje on włączony do środowiska, którego używasz w Greasemonkey? Czy jest on częścią strony, z którą próbujesz wejść w interakcję? – Makyen

Odpowiedz

1

Problem polega na tym, że nie bierzesz pod uwagę, że twój skrypt treści działa w innym kontekście niż skrypty na stronie (skrypty strony). Pozostawienie skryptów treści oddzielnie od skryptów strony jest normalną architekturą dla rozszerzeń przeglądarki, która jest wykonywana ze względów bezpieczeństwa. Twój skrypt treści ma wyższe uprawnienia niż te przyznawane skryptom strony. Chociaż technicznie można wykonać funkcję dostarczoną przez stronę z kontekstu skryptu treści, ze względów bezpieczeństwa nigdy nie należy tego robić. Jeśli to zrobisz, Twoje rozszerzenie nie przejdzie recenzji przez Mozillę, ponieważ znajduje się na liście AMO.

Chociaż można expose functions which exist in your content script to page scripts i create objects in the page script scope, tak aby właściwie wykonać kod w kontekście skryptów strona jest dodanie <script> element do document zawierającą kod chec wykonania.

Dla kodu w swoim pytaniu, to może być realizowane jako:

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 uruchomiony więcej niż raz:
Bez pełnego kodu i zrzut ekranu, co przeglądarka wyglądało to nie można mieć pewności, dlaczego tak się stanie.

Najbardziej prawdopodobną przyczyną jest otwarcie więcej niż jednej karty o adresie odpowiadającym "https://vivo.sx/*". Twój kod onAttach będzie wywoływany za każdym razem, gdy skrypt treści zostanie dołączony do strony. Zostanie on dołączony jeden raz dla każdej karty otwartej dla pasującego adresu URL. Jeśli masz dwie karty otwarte na pasujące adresy URL po załadowaniu dodatku, kod onAttach zostanie wykonany dwukrotnie.

Inną możliwością jest wykonanie więcej niż jeden raz vivoplay, w wyniku czego każda z nich będzie zawierała oddzielną kopię skryptu treści. Biorąc pod uwagę nazwę użytą dla tej funkcji, vivoplay, możesz traktować ją jako funkcję odtwarzania, którą wykonujesz więcej niż raz. Z tym, jak uporządkujesz rzeczy w ramach tej funkcji, nie powinieneś tego robić.

zbyt skomplikowane dla co pokazano:
Kod jest zbyt skomplikowane dla co jest pokazane. Używasz zdarzenia onAttach do wysłania start do skryptu treści. Skrypt zawartości jest ładowany/wykonywany tylko wtedy, gdy jest dołączony. W ten sposób informowanie skryptu treści, że jest on dołączony przez wysłanie start, jest zbędne. Może to być uzasadnione, jeśli zamierzasz zmodyfikować kod, aby wysyłać tylko start w odpowiedzi na inne zdarzenie (np. Kliknięcie przycisku przez użytkownika). Jeśli jednak Twoim zamiarem jest zawsze automatyczne uruchamianie odtwarzacza Flowplayer, nie ma potrzeby wysyłania do skryptu treści wiadomości o adresie start. Skrypt zawartości może mieć setTimeout i po prostu kontynuować i wykonać ten kod po uruchomieniu.

+0

Dziękuję za twoje odpowiedzi. W końcu dostałem swój dodatek do pracy. Ale miałem kilka pytań dotyczących twojego rozwiązania. kiedy zostanie wykonany element skryptu I dodany? Czy możesz dać mi napiwek, w jaki sposób mogę cofnąć moje załączone skrypty dotyczące treści, aby program działał normalnie po tym, jak mój dodatek wykonał swoją pracę? –

+0

Dodany przeze mnie "