我有popup.html的扩展名,其中包含popup.js。 我使用popup.js使用chrome.tabs.sendMessage -method调用位于内容脚本中的函数。 这很好用,但是..
如何将函数的值返回给popup.js?我是否需要在popup.js上设置一个监听器或者什么?
在我的popup.js上我有:
chrome.tabs.sendMessage(tab.id, {
expiryRequest: 'expiry '
}, function (response) {
if (response.refreshResponse === true) {
console.log('Expiry taken');
} else {
console.log('Expiry NOT taken');
}
});
这部分效果很好..
在我的内容脚本中,我将某些div读成可变的“结果”。 在我使用的内容脚本函数的最后。
return result;
或
return true;
这些都没有返回tuo popup.js。 为了让我从内容脚本返回到popup.js,需要更改什么?
答案 0 :(得分:1)
你不应该return
你的结果,而是发回去。
chrome.runtime.onMessage
callbacks有3个参数:消息,发件人信息和sendResponse回调。
要传回回复,必须调用sendResponse
:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){
if(message.ping) sendResponse({pong: true});
});
然而,还有一个额外的技巧。事件监听器应立即回复(即同步,在它退出之前)或发出信号表明它将在稍后回复。这是通过返回值完成的:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){
if(message.ping) {
chrome.storage.local.get("shouldReply", function(result){
// This is asynchronous: by now the listener returned
if(result.shouldReply) sendResponse({pong: true});
});
}
return true; // Indicate that you will eventually call sendResponse
});
除非您这样做,否则当侦听器退出并发送未定义的响应时,sendResponse
引用将失效。
还有一点需要注意:你应该只召唤sendResponse
一次;否则会产生错误。