在我的Chrome扩展程序中,我尝试在扩展程序chrome-extension://myExtensionId/path/to/web/page.html
的内部网页和内容脚本之间交换数据。
因此,为了使这些数据在不同的内容脚本中保持不变,我试图将其作为全局变量保存在扩展程序的后台!我这样做是使用消息传递。
当我尝试从后台发回回复时,我收到此错误:
(未知)事件处理程序出错:TypeError:sendResponse不是 功能
我跟着documentation's examples,这是我的尝试:
scriptOfTheInternalPage.js
:var message = {
'order': 'setData',
'varName': 'myArray',
'data': myArray
};
extPort.postMessage(message, function (response) {
console.log('response:\n', JSON.stringify(response));
});
background.js
:var globals = {
'myArray': [],
...
};
chrome.runtime.onConnect.addListener(function (port) {
port.onMessage.addListener(
function (message, sender, sendResponse) {
console.log(
'the port received this message:\n', JSON.stringify(message), '\n',
(sender.tab) ? ' from tab #' + sender.tab.id : ' from the extension!'
);
if (message.order === 'setData') {
globals[message.varName] = message.data;
sendResponse({'response': 'data saved!'}); //<=====
}
return true; //<=== tried to return true here as well;
});
});
这个错误是否意味着我应该在onMessage
事件监听器之外创建一个全新的功能?
我很困惑!我错过了什么?
答案 0 :(得分:0)
端口的onMessage
事件侦听器与runtime.onMessage
的签名不同。您不会获得sender
和sendResponse
个参数,只会获得消息。返回true
也没有效果。
要回复邮件,您需要使用端口本身。这是covered by examples:
port.onMessage.addListener(function(msg) {
if (msg.joke == "Knock knock")
port.postMessage({question: "Who's there?"});
}
所以你确实需要双方都有一个onMessage
监听器,并且有一些方法可以跟踪请求(唯一ID?),如果可以的话。