2012-08-02 34 views
2

我的Chrome擴展使用長壽命的'Port'對象來在'內容腳本'和'彈出'頁面之間傳遞消息。 'popup'能夠發送消息給'內容腳本'事件監聽器。但是,「內容腳本」中的「端口」對象無法將消息發送到「彈出」頁面。Chrome郵件傳遞錯誤:試圖使用斷開連接的端口對象

var port = chrome.extension.connect({"name":"swap"}); 

// listener for incoming connections 
chrome.extension.onConnect.addListener(function(incomingPort){ 

    // listener on incoming messages 
    incomingPort.onMessage.addListener(function(msg){ 

     if(msg.command === 'get_scripts'){ 
      //do work 

     } 

     var scrs = { 'scripts' : 'name' }; 
     var result = port.postMessage(scrs); 

    }); 
}); 

當執行 'port.postMessage(對象OBJ)',插件引發以下錯誤,

Error in event handler for 'undefined': Attempting to use a disconnected port object Error: Attempting to use a disconnected port object 
at PortImpl.postMessage (miscellaneous_bindings:54:5) 
at chrome-extension://loiamkgdhfjdlkcpehnebipeinpcicfj/swap.js:27:31 
at [object Object].dispatch (event_bindings:203:41) 
at Object.<anonymous> (miscellaneous_bindings:250:22) event_bindings:207 

我已使用 '端口' 對象和 'incomingPort' 對象嘗試,既丟同樣的'錯誤'。 感覺它與預先創建的「Port」對象的範圍有關。

插件代碼可在此git倉庫https://github.com/snambi/chrome_plugin/tree/master/src/chrome

有什麼不對這個插件?

回答

7

我已經通過你的代碼一看,這是沒有意義對我說:

  • 你知道,一個端口在其兩側的onMessagepostMessage方法?一個端口就足以在兩個方向上進行通信。
  • 以某種方式在彈出窗口和內容腳本之間進行通信將非常困難。很難同時啓動內容腳本和彈出窗口。

由於您的擴展沒有後臺頁面和相對無用的內容腳本,我假設您的擴展的核心是瀏覽器動作彈出窗口。相反,在默認情況下注入的內容腳本,你也可以使用以下流程:

  1. 用戶點擊瀏覽器操作
  2. popup.htmlpopup.js被執行。

我也看到您使用port == null檢查各個端口是否有效。如果你這樣做,確保比較有意義,通過排除端口斷開時的變量:

var port; 
chrome.runtime.onConnect.addListener(function(_port) { 
    // ...optional validation of port.name... 

    port = _port; 
    port.onMessage.addListener(function(message) { /* .. logic .. */}); 
    port.onDisconnect.addListener(function() { 
     port = null; 
    }); 
}); 
+0

感謝您通過代碼並顯示一種方式。我已經嘗試了'回調'的'端口'方法。請參閱https://github.com/snambi/chrome_plugin/blob/master/src/chrome/popup1.js和https://github.com/snambi/chrome_plugin/blob/master/src/chrome/swap1.js 。但是,在這種情況下,我也遇到了同樣的錯誤? – Nambi 2012-08-02 22:43:14

+0

@Nambi您仍然通過清單文件執行內容腳本。確保你遵循我答案中的所有步驟。 – 2012-08-02 22:45:28

+0

您的建議有效。現在該插件工作,我想使用插件彈出和內容腳本之間的正確信息。這是不好的設計?或不是鉻插件的首選設計模式? – Nambi 2012-08-02 23:48:40

相關問題