我正在编写扩展程序并遇到问题:我无法将扩展菜单中的数据发送到content.js
。在扩展菜单中,我有几个直觉,在填写并单击按钮后,我写下他们的值,我想将它们发送到content.js
,这些数据将用于{{1}中的实现但由于某种原因,数据不会被发送。
html

document.getElementById('btn').onclick = function() {
var first = document.getElementById('first').value;
var second = document.getElementById('second').value;
//send in content
chrome.extension.sendMessage('hello');
}

以下是<head>
<script type="text/javascript" src="content.js"></script>
<script type="text/javascript" src="background.js"></script>
</head>
<input type="text" id="first">
<input type="text" id="second">
<input type="button" id="btn" value="send">
(可能存在错误)
manifest.json
{
"manifest_version": 2,
"version": "1.3",
"description": "name",
"browser_action":{
"default_popup": "content/popup.html"
},
"background": {
"persistent": false,
"scripts": ["content/background.js"]
},
"content_scripts": [
{
"matches": [ "https://google.com/*" ],
"js": ["content/content.js"],
"css": ["content/qq.css"],
"run_at": "document_end"
}
]
}
:从后台获取数据
content.js
我可以看到所有内容,chrome.extension.onMessage.addListener(function(request){
if(request=='hello'){
console.log('1. Принято: ', request);
}
});
是扩展菜单中负责background.js
的文件。 js
是负责对网站上的DOM进行更改的文件。
答案 0 :(得分:1)
我认为您正在寻找chrome / browser对象的runtime
属性。
这将使您的发送消息命令chrome.runtime.sendMessage
不使用extension
属性。
同样,on message事件为chrome.runtime.onMessage
。
我从以下文档中提取此信息:https://developer.chrome.com/apps/messaging
答案 1 :(得分:1)
您的文件结构不清楚:popup.html
的内容是什么?为什么要在同一页面加载content.js
和background.js
?
以下是您尝试完成 我认为 的示例。
它的工作原理如下:
弹出屏幕将显示input
s供用户填写。
按下按钮时,输入的值将发送到后台脚本,后台脚本又将它们发送到内容脚本。然后,内容脚本以您希望的方式使用这些值:例如,填充主机网页中的输入。
<强>的manifest.json 强>
{
"manifest_version": 2,
"version": "1.3",
"description": "name",
"browser_action":{
"default_popup": "content/popup.html"
},
"background": {
"persistent": true,
"scripts": ["content/background.js"]
},
"content_scripts": [
{
"matches": [ "https://google.com/*" ],
"js": ["content/content.js"],
"css": ["content/qq.css"],
"run_at": "document_end"
}
]
}
<强> background.js 强>
var contentTabId;
chrome.runtime.onMessage.addListener(function(msg,sender) {
if (msg.from == "content") { //get content scripts tab id
contentTabId = sender.tab.id;
}
if (msg.from == "popup" && contentTabId) { //got message from popup
chrome.tabs.sendMessage(contentTabId, { //send it to content script
from: "background",
first: msg.first,
second: msg.second
});
}
});
<强> content.js 强>
chrome.runtime.sendMessage({from:"content"}); //first, tell the background page that this is the tab that wants to receive the messages.
chrome.runtime.onMessage.addListener(function(msg) {
if (msg.from == "background") {
var first = msg.first;
var second = msg.second;
//here you use the values as you wish, for example:
//document.getElementById("anInput").value = first;
}
});
<强> popup.html 强>
<html>
<body>
<input type="text" id="first">
<input type="text" id="second">
<button id="send">Send</button>
<script src="popup.js"></script>
</body>
</html>
popup.js (此文件必须与popup.html
位于同一目录中)
document.getElementById("send").onclick = function() {
chrome.runtime.sendMessage({ //send a message to the background script
from: "popup",
first: document.getElementById("first").value,
second: document.getElementById("second").value
});
}
我希望有所帮助。
答案 2 :(得分:0)
content.js
不应包含在popup.html
中。只要网站与content.js
中的模式匹配,就会运行manifest.json
。目前,只要有人在安装了您的扩展程序的情况下访问google.com,content.js
脚本就会在google.com的后台运行。
background.js
也不应加载到弹出窗口中。这是一个总是在浏览器的后台运行的脚本,它不应该被任何东西加载。这是你添加代码之类的东西来改变多功能行为的行为。
您应该创建一个由popup.js
包含的新popup.html
脚本,它应该只处理实际弹出窗口的onload和onclick事件。
您提及的各种文件content.js
,background.js
以及您应创建的文件popup.js
都有不同的作业,不应相互通信。既没有必要,也没有可能。如果你想要,例如获取其他网站中的内容的值,将其放在content.js
中,该网站在与您的模式匹配的每个网站上运行,并在那里进行所有处理。
background.js
=在浏览器中设置扩展程序的代码,例如更改多功能框行为。
content.js
=在每个匹配特定模式的网站上运行的代码。
popup.js
=当用户打开您的扩展程序的弹出窗口时运行的代码。
所以不要让他们沟通,他们不应该,他们填补完全不同的功能。
你也没有理由要求他们之间进行沟通,请解释你需要这个的场景,我会解释你为什么不需要它。 :)
答案 3 :(得分:0)
要与content.js
通信,您需要使用chrome.tabs.sendMessage
而不是chrome.extension.sendMessage
,因为要与content.js
通信,您需要提供 tabId ,在先前列出的API中作为参数传递。