2016-10-21 2 views
8

Я пытаюсь написать надстройку Firefox для личного использования и узнать немного больше об JavaScript и Firefox Add-on SDK. Надстройка должна открыть URL-адрес vivo.sx, а затем автоматически запустить плеер, но у меня есть 2 вопроса. Надеюсь, вы, ребята, можете мне помочь.Как использовать функции Flowplayer в сценарии содержимого?

Соответствующее дополнение-код:

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

контент-скрипт

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

Первая проблема заключается в том, что функция play пожаров в 2 раза, но должен работать только один раз. Вероятно, onAttach работает неправильно. Что ты об этом думаешь?

Важнейшей проблемой является ReferenceError. У меня есть сценарий Greasemonkey, где я использую функцию flowplayer().load();. Я думал, что скрипт содержимого работает как сценарий Greasemonkey. Поэтому я должен использовать эту функцию. Это верно? Как я могу это исправить?

мой 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"); 
} 

Я совсем новичок в этом так, пожалуйста, терпения со мной :)

Если вам нужна дополнительная информация, пожалуйста, оставьте комментарий.

+1

Где вы определяете 'flowplayer()'? – Makyen

+0

nowhere cause Я не знаю, чтобы определить его –

+0

Тогда как он включается в среду, которую вы используете в Greasemonkey? Включен ли он как часть страницы, с которой вы пытаетесь взаимодействовать? – Makyen

ответ

1

Проблема, с которой вы столкнулись, заключается в том, что вы не принимаете во внимание, что ваш скрипт контента выполняется в другом контексте, чем сценарии на веб-странице (скрипты страниц). Сохранение сценариев контента отдельно от сценариев страниц - обычная архитектура для расширений браузера, которая выполняется по соображениям безопасности. Сценарий вашего контента имеет более высокие привилегии, чем для сценариев страниц. Хотя вы технически можете выполнять функцию, предоставляемую страницей, из контекста сценария содержимого, из соображений безопасности вы никогда не должны этого делать. Если вы решите это сделать, ваше расширение не будет проверено Mozilla за то, что оно указано в AMO.

В то время как вы можете expose functions which exist in your content script to page scripts и create objects in the page script scope, как на самом деле выполнить код из контекста страницы сценария, чтобы добавить <script> элемент в document, содержащий код, который вы желаете выполнить.

Для кода в вашем вопросе, это может быть реализовано как:

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 работает более чем один раз:
Без вашего полного кода и скриншот того, что браузер выглядел он невозможно быть уверенным, почему это произойдет.

Наиболее вероятная причина заключается в том, что у вас было открыто более одной вкладки к адресу, который соответствует "https://vivo.sx/*". Ваш код onAttach будет вызываться каждый раз, когда скрипт содержимого привязан к странице. Он будет прикреплен один раз для каждой вкладки, которая открыта для соответствующего URL-адреса. Если вы добавили две вкладки для сопоставления URL-адресов при добавлении надстройки, то код onAttach будет выполнен дважды.

Другая возможность состоит в том, что вы выполнили vivoplay несколько раз, в результате чего было установлено несколько PageMod, каждый из которых привязал отдельную копию вашего скрипта контента к каждой вкладке. Учитывая имя, которое вы использовали для этой функции, vivoplay, вы можете рассматривать его как функцию воспроизведения, которую вы выполняете более одного раза. Поскольку у вас есть вещи, организованные внутри этой функции, вы не должны этого делать.

Чрезмерно комплекс для того, что показано на рисунке:
Ваш код слишком сложным для того, что показано на рисунке. Вы используете событие onAttach для отправки start в сценарий содержимого. Скрипт содержимого загружается/выполняется только при его подключении. Таким образом, информирование скрипта содержимого, которое оно прикреплено путем отправки start, является избыточным. Это может быть разумным, если вы намереваетесь изменить код только для отправки start в ответ на какое-либо другое событие (например, пользователь, нажавший кнопку). Однако, если вы намерены всегда автоматически запускать Flowplayer, тогда нет необходимости отправлять сообщение start в сценарий содержимого. Скрипт содержимого может иметь setTimeout и просто продолжать и выполнять этот код при его запуске.

+0

Спасибо за ваши ответы. Наконец, я получил надстройку для работы. Но у меня было несколько вопросов о вашем решении. когда будет добавлен элемент сценария? И можете ли вы дать мне подсказку, как я могу отменить мои прикрепленные сценарии содержания, чтобы бровер работал нормально после того, как мое дополнение выполнило его работу? –

+0

'

Смежные вопросы