Chrome扩展程序 - 将内容脚本的函数结果传递给popup.js

时间:2014-05-30 10:23:03

标签: google-chrome google-chrome-extension content-script

我有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,需要更改什么?

1 个答案:

答案 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一次;否则会产生错误。