1

Я искал много усилий, пытаясь исправить эту проблему, но не может найти решение. Я пытаюсь выполнить простую задачу настройки слушателя и отправителя в моем расширении Chrome.Ошибка порта: Не удалось установить соединение. Конец приема не существует

Мой манифест

{ 
    "manifest_version": 2, 

    "name": "my app", 
    "description": "text", 
    "version": "0.1", 
    "background":{ 
    "scripts":["background.js"] 
    }, 

    "content_scripts": [ 
    { 
     // http://developer.chrome.com/extensions/match_patterns.html 
     "matches": ["http://myurl.com/*"], 
     "js": ["jquery-1.9.1.min.js", "myapp.js"], 
     "all_frames": true 
    } 
    ], 
    "browser_action": { 
    "default_icon": "/icons/icon-mini.png", 
    "default_popup": "popup.html" 
    } 
} 

В моем фоне JS

chrome.tabs.getSelected(null, function(tab) { 
    chrome.tabs.sendMessage(tab.id, {greeting: "hello"}, function(response) { 
    console.log(response.farewell); 
    }); 
}); 

В моих popup.js (оказываемая CoffeeScript, пожалуйста, простите то странный синтаксис)

(function() { 

    $(function() {}); 

    chrome.extension.onMessage.addListener(function(request, sender, sendResponse) { 
    if (console.log(sender.tab)) { 
     "from a content script:" + sender.tab.url; 
    } else { 
     "from the extension"; 
    } 
    if (request.greeting === "hello") { 
     return sendResponse({ 
     farewell: "goodbye" 
     }); 
    } 
    }); 

}).call(this); 

В моем myapp.js

chrome.extension.sendMessage({ 
     greeting: "hello" 
    }, function(response) { 
     return console.log(response.farewell); 
    }); 

Я следовал the tutorial. Не знаю, почему это не работает. Я довольно приличный с JS, очень неясно, почему это ведет себя странно. Любая помощь была бы чрезвычайно оценена!

+0

Каков результат вашего кода? Любые ошибки? –

+0

ошибка находится в заголовке сообщения: –

ответ

3

С этим кодом возникает более одной проблемы, поэтому позвольте мне разбить его.

Из того, что я вижу, вы пытаетесь отправить сообщение из своего сценария контента во всплывающее окно, и есть фоновая страница, которая ничего не делает.

Проблема № 1

Код в popup.js, кроме того, что странно запутанным, не фон страницы. Он запускается только тогда, когда открыт popup, поэтому он не сможет прослушать сообщение.

Проблема # 2

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

В результате этих двух вещей заключается в следующем:

Background page -> content script (no listener) 
Content Script -> extension pages (no listener) 

Я предлагаю сделать свой фон страницы ступице ваших сообщений. Если вам нужно общаться между вашим всплывающим окном и сценарием контента, сделайте его popup -> content script и используйте sendResponse() для ответа.

Редактировать: Вот пример сообщения, которое вам нужно. Просто замените ваши переменные.

Content Script

... 
//get all of your info ready here 

chrome.extension.onMessage.addListener(function(message,sender,sendResponse){ 
    //this will fire when asked for info by the popup 
    sendResponse(arrayWithAllTheInfoInIt); 
}); 

Popup

... 
chrome.tabs.query({'active': true,'currentWindow':true},function(tab){ 
    //Be aware 'tab' is an array of tabs even though it only has 1 tab in it 
    chrome.tabs.sendMessage(tab[0].id,"stuff", function(response){ 
    //response will be the arrayWithAllTheInfoInIt that we sent back 
    //you can do whatever you want with it here 
    //I will just output it in console 
    console.log(JSON.stringify(response)); 
    }); 
}); 
+0

Thanks BeardFist. У меня есть массив в моем сценарии содержимого, который я хотел бы отображать в своем всплывающем окне. Это в конечном итоге то, что я пытаюсь сделать. Любые предложения по этому поводу? –

+0

@ZackShapiro Я предлагаю использовать 'chrome.tabs.sendMessage' из вашего всплывающего окна, чтобы инициировать соединение с скриптом содержимого. Поместите в свой скрипт контента 'chrome.extension.onMessage.addListener'. Затем используйте 'sendResponse (stuff)', чтобы отправить массив обратно во всплывающее окно. Я могу написать пример, если вы хотите. – BeardFist

+0

Спасибо @BeardFist! Пример был бы замечательным! –

0

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

Если вкладка не полностью загружена, сценарий содержимого не будет запущен и пока не будет ждать сообщений.

Вот код:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
    if (changeInfo.status === 'complete') { 
    // can send message to this tab now as it has finished loading 
    } 
} 

Так что если вы хотите отправить сообщение на активную вкладку, вы можете убедиться, что он завершил загрузку первым.

Смежные вопросы

 Смежные вопросы