![](/img/trans.png)
[英]Chrome extension long-lived message connection - how to use callback functions?
[英]“Attempting to use a disconnected port object” with Long-lived connections in chrome extension
我收到此错误Uncaught Error: Attempting to use a disconnected port object
第一次打开弹出页面时,我之间存在着长期的联系
内容脚本<->背景页面<->弹出页面。
当我单击浏览器操作图标时,弹出页面将通过后台页面从服务器获取一些信息以进行初始化。
第一次单击时,一切正常,但如果我关闭弹出窗口并再次单击,则无法从后台页面获取信息。
这是我的代码
弹出页面
window.onload = function() {
var port = chrome.runtime.connect({name: "stadium"});
chrome.tabs.query({ currentWindow: true, active: true }, function callback(tabs){
console.log("send TabID to background page");
port.postMessage({"method":"sendTabId","content": tabs[0].id});
});
port.postMessage({"method" : "initialPopup"});//initilaize request
port.onMessage.addListener(function(msg) {
console.log("somthing");
if (msg.method == "updatePage"){
initialize....
}
else if(...){...}
});
和背景页面
var socket = io.connect('http://localhost:3700/');
chrome.tabs.onRemoved.addListener(function(tabId,removeInfo){
if(tabId==stadiumTabId){
//change to the original style popup page
chrome.browserAction.setPopup({"popup":"../pages/popup_out_guest.html"});
}
});
chrome.runtime.onConnect.addListener(function(port) {
console.assert(port.name == "stadium");
port.onMessage.addListener(function(msg) {
if (msg.method == "initialPopup"){ //get the initilaize request
socket.emit('updateMatchInfo',"haha");
socket.on('getUpdate',function(matchInfo){
console.log("background page get data from server");
port.postMessage({"method":"updatePage","content": matchInfo});
});
}
else if (msg.method == "something"){
//insert content scripts
chrome.tabs.executeScript({file: 'js/content_scripts.js', allFrames: true});
//change to another popup page style
chrome.browserAction.setPopup({"popup":"../pages/popup_in_guest.html"});
}
});//port.onMessage.addListener
});//onConnect.addListener
错误发生在后台页面的这一行
port.postMessage({"method":"updatePage","content": matchInfo});
我已经检查过服务器将数据正确发送到后台页面,但是无法找出错误。
感谢帮助 !!
您是否正在使用Awesome屏幕截图 ? 我经常收到该错误消息,但是一旦禁用该扩展名,该消息就会消失:)
每当关闭弹出窗口时,它显示的页面也会被关闭/破坏,这与始终运行的后台页面不同。
因此,长久的连接中断了,因为其中一方不再存在。
您应该从使用长期连接切换为简单消息。 打开时,弹出窗口请求当前状态,而后台页面广播状态更新。 如果弹出窗口没有监听更新(因为它没有打开),则不会造成任何危害。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.