我已经阅读了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/KhqxLx5y和 http://pastebin.com/JaGcp6tj
答案 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_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?"
});
});
一些解释:首先我们从内容脚本连接到我们的后台脚本,然后后台脚本将消息发送到内容脚本。
我根据@Xan评论改进了答案。但是这个想法是一样的,首先你要知道你的后台脚本是否存在内容脚本。