无论我在网上复制/粘贴什么样的例子,我都无法触发chrome.runtime.onMessage.addListener,即使我尽可能地将它们分解。现在我正在使用:
背景JS
chrome.runtime.onInstalled.addListener(function() {
var context = "selection";
var title = "TM";
var id = chrome.contextMenus.create({
"title": title,
"contexts":[context],
"id": "context" + context
});
});
chrome.contextMenus.onClicked.addListener(onClickHandler);
function onClickHandler(info, tab) {
chrome.windows.create(
{url : 'URL Here'},
function(window) {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"});
});
}
);
};
内容脚本
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log('onMessage fired');
});
内容脚本中的侦听器不会触发。如果我尝试从sendMessage方法读取响应,那么我得到'undefined'。除此之外,内容脚本正在加载并正常运行。我已经仔细检查了我发送到正确的标签ID,也从窗口对象中抓取它。
我需要做的就是将所选文本发送到内容脚本。我是Chrome扩展程序的新用户,所以不知道我是否遗漏了一些非常明显的内容!
答案 0 :(得分:0)
我相信你在这里有一个竞争条件:chrome.windows.create
回调在页面仍在加载时返回,并且还没有监听器处于活动状态。
要解决此问题,您可以反转连接的方向:从页面向背景发送消息。在后台,如果需要识别选项卡,可以将发件人的窗口ID与新创建的窗口进行比较。