Я работаю над расширением Chrome с помощью JavaScript и должен иметь возможность передавать сообщение из фонового сценария в сценарий контента, используя пользовательскую запись в контекстном меню в качестве триггера для этого.
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, это должно показать одно предупреждение как:
Фоновый скрипт отправляет сообщение в текст содержания: 'test purple monkey dishwasher'
И затем секундой, как:
Contentcript получил сообщение из фонового сценария: "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 + "'");
});
Это дает желаемый результат в консоли:
Contentcript получил сообщение из фонового скрипта: 'hello'
Основываясь на том, что я теперь понимаю, кажется, что я вызывал часть сообщения, в котором не было request.message
где я должен был вызвать request.greeting
поскольку это то, что я объявлял при отправке сообщения из фонового сценария.
onclick
в оболочкуfunction() { }
? Не похоже, что это должно иметь значение, но иногда JavaScript такой странный."onclick": function() { returnMessage("test"); }