Я разрабатываю расширение в Chrome, и возникает проблема. В моем inject.js
я делаю запрос типа:
chrome.extension.sendRequest({command:'skip'},callback)
, а в моем `background.js я просто добавляю прослушиватель запросов, например:
chrome.extension.onrequest.addListener(function(req,sender,res){console.log("procession"})
Но есть ошибка:
Ошибка порта: Не удалось установить соединение. Конец приема не существует
Кажется ошибка в хроме?
PS:
часть моего manifest.json
"background": {
"scripts": ["background.js"]
},
"content_scripts": [
{
"matches": ["< all_urls >"],
"js": ["inject.js"]
}
],
Я использую Chromium 17, и я попытался перезагрузить расширение, повторно открыв браузер ... ничего не произошло
у кого-нибудь есть идеи?
Некоторые из других ответов здесь имеют хороший совет отладки или маленькие части загадки, однако если Вы хотите ввести в (третью сторону) веб-страницы как я, затем никакие ответы здесь не перечислили корректные компоненты.
существует 4 шага:
пример ниже должен быть всем, что необходимо позволить Вам вводить js, который отправляет сообщения от любой страницы на google.com к Вашему собственному расширению
Сначала в manifest.json, необходимо добавить обменивающиеся сообщениями правила, которые являются описаны здесь :
"externally_connectable": {
"matches": ["*://*.google.com/*"]
}
Затем в Вашем фоновый сценарий или страница, Вам нужно внешний слушатель ( Не регулярный chrome.runtime.onMessage.addListener, который был упомянут в ответах msot) , это описано здесь :
chrome.runtime.onMessageExternal.addListener( (request, sender, sendResponse) => {
console.log("Received message from " + sender + ": ", request);
sendResponse({ received: true }); //respond however you like
});
, После того как у Вас есть эти части, можно использовать отправитель сообщения , как Вы обычно делаете, но с дополнительный идентификатор как первый параметр:
chrome.runtime.sendMessage(myExtId, { /* whatever you want to send goes here */ },
response => {
/* handle the response from background here */
}
);
, Если Вы не знаете, как получить внешний идентификатор, который я использовал в качестве первого параметрического усилителя, Вы можете вводить свой дополнительный идентификатор как ниже. Это требуется потому что chrome.runtime.id и @@ extension_id оба сбоя для работы во введенных сценариях:
//create a script tag to inject, then set a variable with the id in that script
let idScript = document.createElement("script");
idScript.setAttribute("type", "application/javascript");
idScript.textContent = 'var myExtId = "' + chrome.runtime.id +'";';
let parent = ( document.head || document.documentElement );
parent.insertBefore( idScript, parent.firstChild );
//inject and run your other script here
idScript.remove(); //then cleanup
, поскольку мы устанавливаем его как var, другой сценарий может непосредственно получить доступ к значению теперь