Chrome扩展程序从Background.js向内容脚本发送消息

时间:2014-01-15 21:02:19

标签: google-chrome-extension manifest content-script

我已阅读有关如何从后台javascript文件(main.js)发送消息到内容脚本(content.js)的文档,但我无法让onMessage打开我的警报。< / p>

的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!");
   }
});

3 个答案:

答案 0 :(得分:12)

感谢@Teepeemm的洞察力,我在向内容脚本发送消息之前已经包含了一个标签加载完成。

等待TAB完全加载

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) {});  
      });
   }
});

答案 1 :(得分:0)

旁注:chrome.extension.onMessage已被弃用,您应该使用chrome.runtime.onMessage - 尽管我不相信这会解决您的问题。

我记得我在使用内容脚本注入缩小的jquery文件时遇到了问题。尝试使用未缩小的版本(即jquery-1.8.3.js)。完成后,还要在清单文件中将jquery-1.8.3.js添加到web_accessible_resources。 (阅读here

如果它仍然不起作用,我的最后一个建议是将"<all_urls>"添加到清单中的权限数组。

答案 2 :(得分:0)

如果你有每个脚本宣布它的存在(我更喜欢console.logalert),你会看到后台脚本运行一次(在安装或启动时),而内容脚本运行每个新脚本页。这意味着您需要让一些外部事件触发消息。像

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

不要忘记在适当的时候致电chrome.pageAction.show(tabId);