2015-08-17 2 views
1

В this documentation приведен пример того, как передавать данные/события на вкладку. Вот мой отредактированный вариант:firefox jpm - emit to tab извне tab-call

успеха-window.js

// "self" is a global object in content scripts 
// Listen for a "drawBorder" 
self.port.on("drawBorder", function(color) { 
    document.body.style.border = "5px solid " + color; 
}); 

В index.js

var self = require("sdk/self"); 
var tabs = require("sdk/tabs"); 

var success_tab; 
var myTab = tabs.open({ 
    url: data.url("success-window.html"), 
    onReady: function onReady(tab) { 
     success_tab = tab.attach({ 
      contentScriptFile: [data.url('angular/angular.min.js'), 
       data.url('angular-bootstrap/ui-bootstrap-tpls.min.js'), 
       data.url('success-window.js')] 
     }); 
    } 
}); 

Как я могу использовать success_tab.port.emit вне кнопки четкости? Как и в другой функции в пределах index.js, например. console.log

console.log('mytab:', myTab); // mytab: undefined 
console.log('success_tab:', success_tab); // success_tab: undefined 
success_tab.port.emit("drawBorder", "red"); // JPM [error] Message: TypeError: success_tab is undefined 

ответ

2

Попробуйте это. Не забудьте настроить include, чтобы соответствовать любому вашему успеху HTML страницы называется как:

var self = require("sdk/self"); 
var tabs = require("sdk/tabs"); 
var mods = require("sdk/page-mod"); 

var successWorker; 

mods.PageMod({ 
    include: "*", //adjust this to match ONLY your success page 
    contentScriptWhen:'start', 
    contentScriptFile: [data.url('angular/angular.min.js'), 
         data.url('angular-bootstrap/ui-bootstrap-tpls.min.js'), 
         data.url('success-window.js')], 
    onAttach: function(worker){ 

     successWorker= worker; 

     worker.on("message", function(aData){ 
      //messages from success-window.js 
     }); 

     worker.on("detach", function(){ 
      //prevent worker from being used after it's been disposed 
      successWorker= undefined; 
     }); 
    } 
}); 

function postToSuccessWindow(message){ 
    if(successWorker){ 
     successWorker.postMessage(message); 
    } 
} 

Кроме того, вызов tabs.open не возвращает вкладку. Для ссылки на эту вкладку, вы должны сделать это следующим образом:

var successTab; 

tabs.open({ 
    url: "success-window.html" 
    onOpen: function(tab){ 
    successTab = tab; 
    } 
}); 
+0

Очень круто спасибо за долю! – Noitidart

+1

Спасибо! Вы также можете использовать 'successWorker.port.emit' вместо' successWorker.postMessage'. – Rentrop

0

ли вы попробовать установить его в глобальный, как это:

var self = require("sdk/self"); 
var tabs = require("sdk/tabs"); 

var worker; 
var button = require("sdk/ui/button/action").ActionButton({ 
    id: "style-tab", 
    label: "Style Tab", 
    icon: "./icon-16.png", 
    onClick: function() { 
    worker = tabs.activeTab.attach({ 
     contentScriptFile: self.data.url("my-script.js") 
    }); 
    worker.port.emit("drawBorder", "red"); 
    } 
}); 
+1

Да я пытался, но несчастливо то я получаю сообщение об ошибке: 'JPM [Ошибка] Сообщение: TypeError: работник undefined' ... швы, как установить его в глобальный не работает – Rentrop

+0

Очень интересное спасибо за обмен. Вероятно, это было плохое решение. Там должен быть другой путь. Можете ли вы сделать 'console.log ('button:', button)' Может быть, рабочий там? – Noitidart

+0

только что отредактировал мой вопрос соответственно – Rentrop

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