弹出脚本和内容脚本无法通信?

我的问题是我似乎无法得到消息chrome.extension.sendMessage("on"); 从我的popup.js转移到我的content.js。

popup.js中的代码:

 function click(e) { if ( e.target.id == "green"){ chrome.extension.sendMessage("start"); console.info("oN"); return; } if ( e.target.id == "red"){ chrome.extension.sendMessage("stop"); console.info("oFF"); return; } } 

当我向代码添加一个监听器时,popup.js非常好地接收消息。 但我的content.js似乎无法得到它。

来自content.js的代码:

 chrome.extension.onMessage.addListener( function(request, sender, sendResponse) { console.info("ok"); } ); 

表现:

 "content_scripts": [ { "matches": [""], "js": ["content.js"], "run_at": "document_end" } ], 

任何帮助是极大的赞赏。

chrome.extension.sendMessage是一个非规范名称。

旧的,已弃用的API是chrome.extension.sendRequest ,新API是chrome.runtime.sendMessage ,事件同样是chrome.runtime.onMessage


也就是说,您的问题是尝试向内容脚本发送消息。 chrome.runtime.sendMessage将消息发送到扩展程序自己的页面; 内容脚本不被认为是这样的。

要将消息发送到内容脚本,您必须使用tab的tabId 调用chrome.tabs.sendMessage API 。

假设您想要当前可见选项卡:

 function click(e) { if ( e.target.id == "green"){ chrome.tabs.query({active:true, currentWindow: true}, function(tabs){ chrome.tabs.sendMessage(tabs[0].id, "start"); }); console.info("oN"); return; } /* ... */ } 

如果您想要所有选项卡,只需通过{} query并迭代tabs

最后,注意内容脚本注入时间怪癖 。