2015-10-31 34 views
0

当用户在上下文菜单中单击我的项目时,我想从background.js发送一条消息,并在我的内容脚本script.js中侦听它,以便我可以运行一些代码操纵DOM。无法获取chrome.runtime.onMessage来侦听

我原样复制了Chrome Message Parsing docs的示例代码,但是我无法获取侦听器函数来触发。

这是我的manifest.json文件:

{ 
    "manifest_version": 2, 

    "name": "Background image downloader", 
    "description": "Easily lets you download images that are set as background-image in CSS", 
    "version": "0.0.1", 

    "permissions": [ 
    "tabs", 
    "contextMenus" 
    ], 

    "web_accessible_resources": [ 
    "script.js" 
    ], 

    "icons": { 
    "16": "assets/icon_16.png", 
    "48": "assets/icon_48.png", 
    "128": "assets/icon_128.png" 
    }, 

    "background" : { "scripts": ["background.js"] } 
} 

这里的background.js

// Inject the content script into each page (script.js) 
// http://stackoverflow.com/questions/9515704/building-a-chrome-extension-inject-code-in-a-page-using-a-content-script 
var s = document.createElement("script"); 
s.src = chrome.extension.getURL("script.js"); 
s.onload = function() { 
    this.parentNode.removeChild(this); 
}; 
(document.head || document.documentElement).appendChild(s); 

// Handle the click on the context menu 
function getClickHandler(info, tab) { 
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    console.log(tabs[0].id); 
    chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) { 
     console.log(response.farewell); 
    }); 
    }); 
}; 

// Create the context menu 
chrome.contextMenus.create({ 
    "title" : "Download image", 
    "type" : "normal", 
    "contexts" : ["all"], 
    "onclick" : getClickHandler 
}); 

而这里的script.js

console.log('script.js loaded'); 

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
    debugger // This never gets triggered 
    console.log(sender.tab ? 
       "from a content script:" + sender.tab.url : 
       "from the extension"); 
    if (request.greeting == "hello") 
     sendResponse({farewell: "goodbye"}); 
    }); 

我在做什么错?

+2

请参阅[扩展架构](https://developer.chrome.com/extensions/overview#arch)。您正在将脚本元素注入到背景页面中。它不是[内容脚本](https://developer.chrome.com/extensions/content_scripts)。查看[官方示例扩展](https://developer.chrome.com/extensions/samples)获取实际工作代码(特别是通过'executeScript'过滤列表) – wOxxOm

回答

1

使用示例代码而不理解通常是一个坏主意。

通过创建<script>标记,您可以在当前页面的上下文中注入代码 - 这恰好就是您的背景页面。

  1. 如果你需要你的代码执行一起正常的网页,你需要Content Scripts

    该文档充分详细地描述了它,但有两种广泛的方式来使用它们:在清单中声明它们并以编程方式注入它们。

  2. 内容脚本有限制,因为它们是can't interact with pages' own code。这就是the snippet you quote进来的地方 - 但仅限于已经运行的内容脚本。

    在很多情况下,您并不需要这些;在任何的情况下,以这种方式注入的代码失去其特殊扩展权限并且不能使用onMessage

+0

太棒了,谢谢。解决方案是简单地在清单中用'content_scripts'声明脚本并匹配到'“http:// */*”,“https:// */*”'。听众正在工作。谢谢你的帮助! –