2016-10-21 19 views
8

Bir Firefox yazmaya çalışıyorum kişisel kullanım için eklenti ve JavaScript ve Firefox hakkında biraz daha fazla bilgi edinmek için Eklenti SDK. Eklenti bir vivo.sx URL açmak ve daha sonra otomatik olarak oyuncu başlar ama 2 sorunları olmalıdır. Umarım bana yardımcı olabilirsiniz. İçerik komut dosyasında Flowplayer işlevleri nasıl kullanılır?

ilgili eklenti-kodu:

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

içerik komut

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

ilk sorun fonksiyonu play yangınlar 2 kez, ama yalnızca bir kez çalıştırmak gerektiğidir. Muhtemelen düzgün çalışmıyor onAttach var. Bunun hakkında ne düşünüyorsun?

daha önemli sorun ReferenceError olduğunu. flowplayer().load(); işlevini kullandığım bir Greasemonkey komut dosyası var. İçerik komut dosyasının Greasemonkey komut dosyası gibi çalıştığını düşündüm. Yani, bu işlevi kullanabilmem gerekir. Bu doğru mu? Bunu nasıl düzeltebilirim?

benim greasemonkey komut

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

Öyle

:) benimle sabır lütfen daha fazla bilgiye ihtiyacınız varsa, lütfen yorum bırakın bu oldukça yeni.

+1

'flowplayer()' öğesini nerede tanımlıyorsunuz? – Makyen

+0

hiçbir yerde neden tanımlayamıyorum –

+0

O halde Greasemonkey'de kullandığınız ortama nasıl dahil oluyor? Etkileşim kurmaya çalıştığınız sayfanın bir parçası olarak dahil mi? – Makyen

cevap

1

karşılaştığınız sorun içerik komut web sayfasında (sayfa komut dosyaları) içinde komut farklı bir bağlamda yürütülürken dikkate alarak olmamasıdır. İçerik komut dosyalarını sayfa komut dosyalarından ayrı tutmak, güvenlik nedenleriyle yapılan tarayıcı uzantıları için normal bir mimaridir. İçerik komut dosyanızın sayfa komut dosyalarına verilenden daha yüksek ayrıcalıkları vardır. Teknik olarak, içerik betiği içeriğinizin içinden sayfa tarafından sağlanan bir işlevi yürütebilmenize rağmen, güvenlik nedenleriyle, bunu asla yapmamalısınız. Bunu yapmayı seçerseniz, Uzantınız AMO listelenmeye için Mozilla tarafından gözden geçmek olmaz.

Eğer expose functions which exist in your content script to page scripts gidebiliyorken ve create objects in the page script scope, aslında sayfa senaryo kapsamında kod yürütmesine yolu yürütmek arzu kodu içeren document bir <script> eleman eklemektir. Tam kod ve tarayıcıya nasıl göründüğünün bir ekran olmadan
:

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 defadan fazla çalışan: olarak, söz konusu kodu için

, bu uygulanabilecek Bunun neden gerçekleşeceğinden emin olmak imkansız.

Bunun en olası nedeni, "https://vivo.sx/*" ile eşleşen bir adrese birden fazla sekme açık olmasıdır. İçerik komut dosyası bir sayfaya eklendiğinde, onAttach kodunuz çağrılır. Eşleşen bir URL'ye açık olan her sekme için bir kez eklenecektir. eklenti yüklendi zaman eşleşen URL'lerin açık iki sekme olsaydı, o zaman onAttach kodu iki kez çalıştırılacaktır.

Başka bir olasılık, bir defadan daha fazla vivoplay çalıştırdığınız ve her bir sekmeye içerik komut dosyanızın ayrı bir kopyasını ekleyeceği birden çok PageMod s ayarlamanızdır. Bu işlev için kullandığınız adı verilen vivoplay, bir defadan fazla çalıştırdığınız bir oynatma işlevi olarak davranıyor olabilirsiniz. Bu işlevin içinde organize ettiğin şeylerle, bunu yapmamalısın.

gösterilmiştir ne için Fazlasıyla karışık:
Kodunuz gösterilmiştir ne için aşırı karmaşık. İçerik komut dosyasına start göndermek için onAttach olayını kullanıyorsunuz. İçerik betiği sadece eklendiğinde yüklenir/yürütülür. Böylece, start gönderilerek ekli içerik komut dosyasının bildirilmesi gereksizdir. Bu kodu, başka bir olaya (örneğin, bir düğmeyi tıklayan kullanıcı) yanıt olarak yalnızca start göndermek için değiştirmek isterseniz, makul olabilir. Ancak, Flowplayer'ı her zaman otomatik olarak başlatmak istediğinizde, içerik komut dosyasına start mesajını göndermenize gerek yoktur. İçerik betiği, setTimeout'a sahip olabilir ve sadece devam edip, çalıştırıldığında bu kodu çalıştırabilir.

+0

Yanıtlarınız için teşekkür ederiz. Sonunda çalışmam için eklentimi aldım. Ama çözümün hakkında birkaç sorum vardı. Eklediğim komut dosyası öğesi ne zaman çalıştırılacak? Eklediğim içerik komut dosyamı nasıl geri alabilirim diye bir ipucu verebilir misin? –

+0

Eklendiğimi gösterdiğim '

İlgili konular