sendMessage из фона расширения или всплывающего окна для содержимого скрипта не работает

Я знаю, что этот вопрос неоднократно задавали по-разному, но я попытался пройти все ответы (надеюсь, я никого не пропустил), и ни один из них не помог мне.

Вот код моего расширения:

манифест:

{
"name": "test",
"version": "1.1",
"background": 
{ 
    "scripts": ["contextMenus.js"]
},

"permissions": ["tabs", "<all_urls>", "contextMenus"],

"content_scripts" : [
    {
        "matches" : [ "http://*/*" ],
        "js": ["jquery-1.8.3.js", "jquery-ui.js"],
        "css": [ "jquery-ui.css" ],
        "js": ["openDialog.js"]
    }
],

"manifest_version": 2
}

contextMenus.js

function onClickHandler(info, tab) {
    if (info.menuItemId == "line1"){

      alert("You have selected: " + info.selectionText);

      chrome.extension.sendMessage({action:'open_dialog_box'}, function(){});

      alert("Req sent?");

    }
}

chrome.contextMenus.onClicked.addListener(onClickHandler);

chrome.runtime.onInstalled.addListener(function() {

  chrome.contextMenus.create({"id": "line1", "type": "normal", "title": "I'm line 1",     "contexts":["selection"]});

});

openDialog.js

chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {

  if (msg.action == 'open_dialog_box') {
    alert("Message recieved!");
  }
});

Два предупреждения фоновой страницы работают, а одно из content_script - нет.

сообщение журнала консоли: Ошибка порта: не удалось установить соединение. Приемного конца не существует.

В чем моя вина?


person Subway    schedule 09.01.2013    source источник
comment
Вы должны использовать chrome.tabs.sendMessage() для отправки сообщений в сценарии содержимого, а не chrome.extension.sendMessage().   -  person apsillers    schedule 10.01.2013


Ответы (4)


На своей фоновой странице вы должны позвонить

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    chrome.tabs.sendMessage(tabs[0].id, {action: "open_dialog_box"}, function(response) {});  
});

вместо того, чтобы использовать chrome.extension.sendMessage, как вы это делаете сейчас.

Вариант chrome.tabs отправляет сообщения сценариям содержимого, тогда как функция chrome.extension отправляет сообщения всем другим компонентам расширения.

person apsillers    schedule 09.01.2013
comment
Спасибо. Это правильно, за исключением того, что chrome.tabs.sendMessage должен указывать, на какую вкладку отправлять его. Итак, решение меняется на: chrome.tabs.query({active: true}, function(tabs){ chrome.tabs.sendMessage(tab.id, {action: "open_dialog_box"}, function(response) { }); }); - person Subway; 10.01.2013
comment
Этот ответ мне помог. Большое спасибо за этот полезный ответ. - person Touhid; 19.10.2014
comment
Мы даже можем передать null вместо {active: true}, чтобы указать на текущую вкладку. - person Chakri; 31.10.2016
comment
что надо написать, чтобы получить на content-script.js? - person Kushal Jain; 30.06.2017
comment
@KushalJain Я только что понял это. В JS-файле сценария содержимого вы захотите добавить прослушиватель событий следующим образом: chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { /* Code Here */ } ); message - это параметр, содержащий { action: "open_dialog_box" } или все, что вы отправляете. sender - это объект, содержащий идентификатор вашего расширения Chrome. sendResponse - это параметр, содержащий function(response) {} или любую другую функцию, которую вы передаете для вызова после обработки сообщения. - person jsea; 22.05.2018
comment
Я не понимаю ... Как я могу отправить JSON или текст между content_script.js и background.js ?? - person c-an; 04.02.2019
comment
добавить еще один необязательный параметр, так как подпись метода была изменена - person ThinkTank; 15.07.2019
comment
Это решение не сработало для меня. Я точно следую документации. Я скопировал весь код из developer.chrome.com/extensions/messaging Это очень простой пример, но мы не можем понять его правильно. Получение ошибки Не удалось установить соединение. Приемного конца не существует. Любые идеи - person umsateesh; 14.10.2019
comment
Я тебя поцелую @apsillers, богом клянусь - person Mel Macaluso; 26.04.2020
comment
@umsateesh Вы нашли какое-нибудь решение? - person bugwheels94; 04.01.2021
comment
Спасибо! Я застрял на день с этой проблемой, когда я не мог отправлять сообщения в сценарий содержимого из фонового сценария. ???? - person leocreatini; 10.06.2021

@apsillers правильно. Также не забудьте вернуть true в слушателе сценария содержимого, иначе он может закрываться слишком рано.

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    console.log(message)
    return true
});
person Ronan Ca    schedule 04.08.2020
comment
Это устранило это для меня - я не получал ответа, но добавление return true заставило его работать. - person rupertonline; 18.11.2020
comment
Клянусь, на ТАК самый простой ответ обычно правильный. Не могу поверить, что это решило эту проблему, но это было так. Спасибо, что поделился! - person jstafford; 31.03.2021

Вот пример фонового сценария, который отправляет сообщение в файл сценария содержимого.

background.js

chrome.tabs.sendMessage(tabs[0].id,"your message"); 

content-script / content.js

chrome.runtime.onMessage.addListener(function (response, sendResponse) {
          console.log(response);
});
person Saravanan Selvamohan    schedule 19.11.2020

Мой вариант использования требовал отправки сообщения фоновому скрипту с веб-страницы. Я использовал chrome.runtime.onMessageExternal, чтобы поймать это сообщение.

Внутри этого слушателя я в основном пересылал сообщение своему сценарию содержимого, чтобы он мог выполнять свою задачу, но я не мог понять, почему мой сценарий содержимого в прослушивателе сообщений не может поймать сообщение.

Оказывается, подождав 1 секунду перед отправкой сообщения с веб-страницы (я в основном делал это при загрузке), я смог увидеть, как сообщение попадает в мой сценарий содержимого.

person Nikita Jerschow    schedule 22.11.2020