Chrome扩展程序:sendMessage不起作用

时间:2014-04-16 23:47:50

标签: javascript google-chrome google-chrome-extension message-passing

我已经阅读了Google关于“消息传递”的文档几次,并且可能已经查看了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"]
        }
    ]    
}

我知道扩展并不是假设使用内联JS,但我将其保留在原来的问题可以保留原来的问题,因为我仍然无法从后台页面发送消息,当我从弹出窗口切换到背景时,我从manifest.json

中删除了相应的行

popup.html文件:

<html>
  <head>
    <script>
    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);
      });
    });
    </script>
  </head>
<body>
</body>
</html>

OR

background.js文件:

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);
  });
});

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(“click”....中)之外,可以在此处找到按钮和窗口的其他文件。 http://pastebin.com/KhqxLx5yhttp://pastebin.com/JaGcp6tj

3 个答案:

答案 0 :(得分:3)

您的代码中存在多个问题。

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

// popup.html
<html>
<body>
<script type="text/javascript" src="popup.js"></script>
</body>
</html>

// popup.js
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
    var tab = tabs[0];  // do not forget to declare "tab" variable
    chrome.tabs.sendMessage(tab.id, {
        greeting: "Can you hear me?"
    }, function(response){});
});

答案 1 :(得分:1)

仔细阅读this answer可能会对您有所帮助。每一点都适用于您的问题。

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

要让它在弹出窗口中运行,请按照KAdot's answer

答案 2 :(得分:-1)

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

的manifest.json

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

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

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

消息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({});
    }
});

popup.js

chrome.runtime.onConnect.addListener( function ( port ) {
port.postMessage({
        greeting: "Can you hear me?"
    });
});

一些解释:首先我们从内容脚本连接到我们的后台脚本,然后后台脚本将消息发送到内容脚本。

更新

我根据@Xan评论改进了答案。但是这个想法是一样的,首先你要知道你的后台脚本是否存在内容脚本。