2016-04-07 23 views
0

私の拡張機能では、さまざまなコンテンツスクリプトがbackground.jsに接続してお互いに通信します。私が抱えている問題は、あるポートでメッセージを受信すると、この情報を他のポートに転送できないということです。私は取得していますエラーは次のとおりです。Chrome拡張機能 - 複数のポートでのメッセージ送信

Error: Attempting to use a disconnected port object 

background.jsで私のコード

chrome.runtime.onConnect.addListener(function(port) { 
    if(port.name === "menuport") { 
    port.onMessage.addListener(function(msg) { 
     console.log('BGJS from menuport') 
     console.log(msg) 
     var page_port = chrome.runtime.connect({name: "pageport"}); 
     page_port.postMessage(msg); 
    }); 
    } else if (port.name === "pageport") { 
    port.onMessage.addListener(function(msg) { 
     console.log('BGJS from pageport') 
     console.log(msg) 
    }); 
    } 
}); 

pageportがcontent.jsで活性化される:

var page_port = chrome.runtime.connect({name: "pageport"}); 
page_port.postMessage({source: "page", status: "ready"}); 
page_port.onMessage.addListener(function(msg) { 
    console.log(msg) 
}); 

menuportは類似して動作しますスクリプト。両方のポートのアクティブ化が機能し、コンソールに表示されます。しかし、私はbackground.jsからポートにメッセージを投稿することはできません。

答えて

1

onConnectコールバックを受信したときに、そのポートを変数として保存する必要があります。そのため、後で再利用できます。 port.name == "pageport"の下でポート変数を破棄すると、ガベージコレクション(および切断)されます。それをwindow.page_portとして保存します。

私はあなたが両側から「接続」しようとしていると思いますが、これは意味をなさないものです。

片側が接続され、もう片方がonConnectイベントを待機します。

+0

完璧、解決しました。ありがとうございました! – Vincent

+0

@Vincentは、すでに関数コンテキストに保存されているポート変数ではありませんか?奇妙なことにはうまくいった。 – user5858

+0

一方の端には保存されますが、他方の端には保存されません。私はページあたり複数のポートで作業しているので、それらを識別するために名前を使用しています。 – Vincent

関連する問題