Расширение Chrome Отправить сообщение от Background.js к контенту Script

Я прочитал документацию о том, как сделать Отправить сообщение Из фонового файла javascript (main.js) в Content Script (content.js), но я не могу заставить onMessage открыть мое оповещение.

manifest.json

{
   "name": "Example",
   "version": "1.0.1",
   "manifest_version" : 2,
   "description": "Example Description",
   "background" : {
     "scripts" : ["main.js"]
   },
   "page_action" : {
      "default_icon": {
         "19": "icons/19.png",
         "38": "icons/38.png"
      },
      "default_title" : "Example Title"
   },
   "content_scripts": [{
      "matches": ["<all_urls>"],
      "js": ["lib/jquery-1.8.3.min.js","scripts/content.js"],
      "run_at": "document_idle",
      "all_frames": false
   }],
   "permissions": [
       "tabs",
       "geolocation"
   ],
   "icons": {
       "16": "icons/16.png",
       "48": "icons/48.png",
       "128": "icons/48.png"
   }

}

Фон javascript файл (main.js)

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

Содержимое javascript файла (content.js)

chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {
   if (msg.action == 'SendIt') {
      alert("Message recieved!");
   }
});

Ответы

Ответ 1

Благодаря пониманию @Teepeemm, я включил завершение загрузки вкладки перед отправкой сообщения в контент script.

ПОДТВЕРЖДАЙТЕСЬ, ЧТОБЫ БЫТЬ ПОЛНОСТЬЮ ЗАГРУЖЕНЫ

chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {          
   if (changeInfo.status == 'complete') {   
      chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
         chrome.tabs.sendMessage(tabs[0].id, {action: "SendIt"}, function(response) {});  
      });
   }
});

Ответ 2

Sidenote: chrome.extension.onMessage устарел, вы должны использовать chrome.runtime.onMessage - хотя я не верю, что это решит вашу проблему.

Я помню, что у меня была проблема с введением мини файла jquery с использованием скриптов содержимого. Попробуйте использовать неинфицированную версию (например, jquery-1.8.3.js). Как только вы это сделаете, добавьте jquery-1.8.3.js в web_accessible_resources в файл манифеста. (Читайте об этом здесь)

Если это все еще не работает, моим последним предложением было бы добавить "<all_urls>" в массив разрешений в вашем манифесте.

Ответ 3

Если у вас есть script объявить о своем присутствии (я предпочитаю от console.log до alert), вы увидите, что фоновый script выполняется один раз (при установке или запуске), а контент script работает с каждый новая страница. Это означает, что вы хотите, чтобы какое-то внешнее событие вызывало это сообщение. Что-то вроде

chrome.pageAction.onClicked.addListener(function(tab) {
    chrome.tabs.sendMessage(tab.id,{action:"SendIt"});
});

И не забудьте вызвать chrome.pageAction.show(tabId);, если это необходимо.