2012-03-19 66 views
2

參考這個問題:Add-on Builder: ContentScript and back to Addon code?附加組件生成器:多個工人使用端口?

這裏是我的插件代碼:

var widget = widgets.Widget({ 
    id: "addon", 
    contentURL: data.url("icon.png"), 
    onClick: function() { 
    var workers = []; 
    for each (var tab in windows.activeWindow.tabs) { 
     var worker = tab.attach({contentScriptFile: [data.url("jquery.js"), data.url("myScript.js")]}); 
     workers.push(worker); 
    } 
    } 
}); 

這裏是myScript.js:

var first = $(".avatar:first"); 
if (first.length !== 0) { 
    var url = first.attr("href"); 
    self.port.emit('got-url', {url: url}); 
} 

現在我有多個工人在哪裏我把

worker.port.on('got-url', function(data) { 
      worker.tab.url = data.url; 
     }); 

由於在其他任務我只有一名工人,但現在我有一批工人。

回答

1

的代碼將是:

// main.js: 
var data = require("self").data; 
var windows = require("windows").browserWindows; 

var widget = require("widget").Widget({ 
    id: "addon", 
    label: "Some label", 
    contentURL: data.url("favicon.png"), 
    onClick: function() { 
     //var workers = []; 
     for each (var tab in windows.activeWindow.tabs) { 

      var worker = tab.attach({ 
       contentScriptFile: [data.url("jquery.js"), 
       data.url("inject.js")] 
      }); 

      worker.port.on('got-url', function(data) { 
       console.log(data.url); 
       // worker.tab.url = data.url; 
      }); 

      worker.port.emit('init', true); 
      console.log("got here"); 
      //workers.push(worker); 
     } 
    } 
}); 

// inject.js 
$(function() { 
    self.port.on('init', function() { 
     console.log('in init'); 
     var first = $(".avatar:first"); 
     if (first.length !== 0) { 
      var url = first.attr("href"); 
      console.log('injected!'); 
      self.port.emit('got-url', {url: url}); 
     }  
    }); 
}); 

編輯:對不起,應該有實際運行的代碼,我們必須有一個時機問題,即成立了工人聽衆面前內容腳本注入,所以當發出'got-url'事件時,偵聽器尚未創建。我通過推遲內容腳本中的任何操作來解決此問題,直到將'init'事件發送到內容腳本中。

這裏有一個建設者的工作示例:

https://builder.addons.mozilla.org/addon/1045470/latest/

這個例子剩下的問題是,有沒有辦法判斷一個標籤已經被我們附加註入,所以我們將「泄漏「或每次點擊小部件時使用更多的內存。更好的方法可能是在加載時使用page-mod注入內容腳本,並且只在小部件的onclick處理函數中發出'init'事件。

+0

我試過這個,但由於某種原因got-url函數只觸發一次。它應該爲每個工作人員做一次... – Funkafied 2012-03-20 06:15:32

+0

剛剛發生在我身上,這可能是一個同步問題? – Funkafied 2012-03-20 06:50:08

+0

內存泄漏究竟發生在哪裏? – Funkafied 2012-03-21 03:43:53

相關問題