Javascript Chrome扩展名:sendMessage不';行不通

Javascript Chrome扩展名:sendMessage不';行不通,javascript,google-chrome,google-chrome-extension,message-passing,Javascript,Google Chrome,Google Chrome Extension,Message Passing,我已经阅读了谷歌关于“消息传递”的文档好几次了,可能已经看了10多个其他问题,也有同样的问题,并且已经尝试了他们的大多数“解决方案”和我下面的内容的一些变体。。。这是黑魔法,对吗?不管怎样,都是这样 清单文件: { "manifest_version" : 2, "name" : "Message Test", "version" : "1.0", "browser_action": { "default_popup": "popup.html

我已经阅读了谷歌关于“消息传递”的文档好几次了,可能已经看了10多个其他问题,也有同样的问题,并且已经尝试了他们的大多数“解决方案”和我下面的内容的一些变体。。。这是黑魔法,对吗?不管怎样,都是这样

清单文件:

{
    "manifest_version" : 2,
    "name" : "Message Test",
    "version" : "1.0",

    "browser_action": { 
        "default_popup": "popup.html"
    },

    "background": {
        "scripts": ["background.js"]
    },

    "content_scripts": [
        {
        "matches" : ["<all_urls>"],
        "js": ["message-test.js"]
        }
    ]    
}
message-test.js文件:

var Mymessage;
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    if (message.greeting == "hello"){
        Mymessage = message.theMessage;
        alert(Mymessage);
    }
    else{
        sendResponse({});
    }
});
我收到一个未定义的警报

在按下弹出窗口中的一个按钮并在指定的url处有一个窗口后,我也尝试执行此操作,但这是后面的问题。按钮和窗口的其他文件可以在这里找到,除了background.js内容包装在addEventListener中(“单击…”): 及
您的代码中有几个问题

Chrome不允许在扩展中使用内联脚本。您必须将popup.html划分为script+html:

//popup.html
//popup.js
chrome.tabs.query({active:true,currentWindow:true},函数(tabs){
var tab=tabs[0];//不要忘记声明“tab”变量
chrome.tabs.sendMessage(tab.id{
问候语:“你能听到我说话吗?”
},函数(响应){};
});

以下是使用后台脚本的解决方案:

manifest.json popup.js 一些解释:首先,我们从内容脚本连接到后台脚本,然后后台脚本将消息发送到内容脚本

更新 我根据@Xan评论改进了答案。但想法是一样的,首先你应该让你的背景脚本知道内容脚本的存在。

仔细阅读可能会对你有所帮助。这里的每一点都适用于你的问题

问题在于主脚本何时执行以及内容脚本何时执行。在向内容脚本发送消息之前,您需要确保有内容脚本正在侦听,最坏的情况是以编程方式注入内容脚本


要使其在弹出窗口中工作,请遵循。

所有URL均无效syntax@ZigMandel恰巧如此。@hucuhy谢谢你在这个问题上提供了这个悬赏。自从今天(2014年6月3日)发布这个帖子以来,我还没有收到任何有用的回复。在点击默认弹出窗口中的按钮后,能够从后台页面向内容脚本发送消息,对于了解这些内容如何工作的人来说似乎并不难……要添加到这个答案中,如果您右键单击按钮并选择“检查弹出窗口”。“activeTab”是不需要的,因为弹出窗口正在与现有内容脚本通信,它没有尝试插入新的内容脚本。因此我逐字尝试了它,它仍然不起作用…完全相同的“manifest.json”文件,相同的“message-test.js”"文件…我复制并粘贴了你的popup.html和popup.js。没有警报。你们中的任何人知道我还应该用这个做什么吗?@user3334776在做了更改之后,你是否正确地重新加载了你的扩展,并重新加载了你正在测试的页面,以便注入新的内容脚本?使用打开一个端口只是敲打一下感觉……错误。@Xan抱歉什么?)你知道其他与后台脚本通信的方法吗?)为什么要使用
chrome.runtime.connect
/
chrome.runtime.onConnect
如果你不使用生成的端口?我正在使用runtime connect连接到后台脚本,直到后台脚本对内容脚本一无所知。错误。您可以使用
connect
/
onConnect
并通过端口工作,也可以使用
sendMessage
/
onMessage
并使用它。无需打开并立即丢弃端口。
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
  chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello", theMessage: "Why isn\'t this working?"}, function(response) {
    console.log(response.farewell);
  });
});
var Mymessage;
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
    if (message.greeting == "hello"){
        Mymessage = message.theMessage;
        alert(Mymessage);
    }
    else{
        sendResponse({});
    }
});
{
    "manifest_version" : 2,
    "name" : "Message Test",
    "version" : "1.0",

    "background":{
        "scripts":["popup.js"]
    },

    "content_scripts": [
        {
        "matches" : ["<all_urls>"],
        "js": ["message-test.js"]
        }
    ]
}
var port = chrome.runtime.connect();
port.onMessage.addListener(function(message, sender, sendResponse) {
    if (message.greeting == "Can you hear me?"){
        alert("Test");
    }
    else{
        sendResponse({});
    }
});
chrome.runtime.onConnect.addListener( function ( port ) {
port.postMessage({
        greeting: "Can you hear me?"
    });
});