Как передать сообщение из фонового скрипта расширения Chrome в скрипт контента в JavaScript через контекстное меню?

1

Я работаю над расширением 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, несмотря на поиск на этом и других сайтах информации.

Любая помощь приветствуется.

  • 1
    Вы пытались обернуть назначение onclick в оболочку function() { } ? Не похоже, что это должно иметь значение, но иногда JavaScript такой странный. "onclick": function() { returnMessage("test"); }
  • 1
    Это предотвратило проблему с мигающим предупреждением, как только расширение загружено, и теперь я могу вызвать первое предупреждение с помощью пункта контекстного меню, однако я все еще не получаю второе предупреждение, похоже, сообщение не выбрано вверх по содержанию сценария.
Показать ещё 8 комментариев
Теги:
google-chrome
google-chrome-extension
message-passing

1 ответ

0
Лучший ответ

Принимая советы от комментариев, я смог изменить фоновый сценарий на нижеследующий:

//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 поскольку это то, что я объявлял при отправке сообщения из фонового сценария.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню