如何通过上下文菜单将消息从 Chrome 扩展后台脚本传递到 JavaScript 中的内容脚本?
How to pass a message from a Chrome extension background script to a content script in JavaScript via the context menu?
我正在使用 JavaScript 开发 Chrome 扩展,需要能够使用上下文菜单中的自定义条目作为触发器将消息从后台脚本传递到内容脚本为此。
manuscript.json
{
"manifest_version": 2,
"name": "Admin Tools",
"version": "0.3",
"permissions": [
"contextMenus",
"tabs",
"activeTab"
],
"content_scripts": [
{
"matches": ["https://*/*", "http://*/*"],
"js": ["lead_partner_search_content.js"]
}
],
"background": {
"scripts": ["admin_search.js", "company_id_search.js","order_id_search.js","lead_partner_search.js"]
}
}
lead_partner_search.js(后台脚本)
//lead_partner_search.js
var backgroundScriptMessage = " purple monkey dishwasher";
function returnMessage(messageToReturn) {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
var joinedMessage = messageToReturn + backgroundScriptMessage;
alert("Background script is sending a message to contentscript:'" + joinedMessage +"'");
chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"});
});
}
chrome.contextMenus.create({
"title": "Search leads by company name",
"contexts": ["selection"],
"onclick": returnMessage("test")
})
lead_partner_search_content.js(内容脚本)
//lead_partner_search_content.js
chrome.runtime.onMessage.addListener( function(request, sender) {
alert("Contentscript has received a message from from background script: '" + request.message + "'");
return true;
});
根据 Stack Overflow 中的 another 示例,这应该显示一个警报:
Background script is sending a message to contentscript:'test purple monkey dishwasher'
然后是:
Contentscript has received a message from from background script: 'test purple monkey dishwasher'
然而,实际发生的是在加载扩展程序时,第一条消息警报会立即出现,即使触发上下文菜单条目也不会发生任何进一步的事情。
尽管在这个网站和其他网站上搜索信息,但我不确定为什么会这样,也不完全理解 Google Chrome 中传递的消息。
感谢任何帮助。
根据评论的建议,我能够将后台脚本更改为以下内容:
//lead_partner_search.js
function returnMessage() {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"});
});
}
chrome.contextMenus.create({
"title": "Search leads by company name",
"contexts": ["selection"],
"onclick": returnMessage
})
我的内容脚本如下:
//lead_partner_search_content.js
chrome.runtime.onMessage.addListener( function(request, sender) {
console.log("Contentscript has received a message from background script: '" + request.greeting + "'");
});
这会在控制台中产生所需的输出:
Contentscript has received a message from background script: 'hello'
根据我现在的理解,我似乎调用了不存在的消息的一部分 request.message
我应该调用 request.greeting
因为这是我声明的从后台脚本发送消息时。
我正在使用 JavaScript 开发 Chrome 扩展,需要能够使用上下文菜单中的自定义条目作为触发器将消息从后台脚本传递到内容脚本为此。
manuscript.json
{
"manifest_version": 2,
"name": "Admin Tools",
"version": "0.3",
"permissions": [
"contextMenus",
"tabs",
"activeTab"
],
"content_scripts": [
{
"matches": ["https://*/*", "http://*/*"],
"js": ["lead_partner_search_content.js"]
}
],
"background": {
"scripts": ["admin_search.js", "company_id_search.js","order_id_search.js","lead_partner_search.js"]
}
}
lead_partner_search.js(后台脚本)
//lead_partner_search.js
var backgroundScriptMessage = " purple monkey dishwasher";
function returnMessage(messageToReturn) {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
var joinedMessage = messageToReturn + backgroundScriptMessage;
alert("Background script is sending a message to contentscript:'" + joinedMessage +"'");
chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"});
});
}
chrome.contextMenus.create({
"title": "Search leads by company name",
"contexts": ["selection"],
"onclick": returnMessage("test")
})
lead_partner_search_content.js(内容脚本)
//lead_partner_search_content.js
chrome.runtime.onMessage.addListener( function(request, sender) {
alert("Contentscript has received a message from from background script: '" + request.message + "'");
return true;
});
根据 Stack Overflow 中的 another 示例,这应该显示一个警报:
Background script is sending a message to contentscript:'test purple monkey dishwasher'
然后是:
Contentscript has received a message from from background script: 'test purple monkey dishwasher'
然而,实际发生的是在加载扩展程序时,第一条消息警报会立即出现,即使触发上下文菜单条目也不会发生任何进一步的事情。
尽管在这个网站和其他网站上搜索信息,但我不确定为什么会这样,也不完全理解 Google Chrome 中传递的消息。
感谢任何帮助。
根据评论的建议,我能够将后台脚本更改为以下内容:
//lead_partner_search.js
function returnMessage() {
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"});
});
}
chrome.contextMenus.create({
"title": "Search leads by company name",
"contexts": ["selection"],
"onclick": returnMessage
})
我的内容脚本如下:
//lead_partner_search_content.js
chrome.runtime.onMessage.addListener( function(request, sender) {
console.log("Contentscript has received a message from background script: '" + request.greeting + "'");
});
这会在控制台中产生所需的输出:
Contentscript has received a message from background script: 'hello'
根据我现在的理解,我似乎调用了不存在的消息的一部分 request.message
我应该调用 request.greeting
因为这是我声明的从后台脚本发送消息时。