无法获得chrome.runtime.onMessage来收听

时间:2015-10-31 11:57:36

标签: javascript google-chrome google-chrome-extension

当用户在上下文菜单中单击我的项目时,我想从<!doctype html> <html> <head> <title>Figure examples</title> <link rel="stylesheet" href="http://cdn.pydata.org/bokeh/release/bokeh-0.10.0.min.css" type="text/css" /> <script type="text/javascript" src="http://cdn.pydata.org/bokeh/release/bokeh-0.10.0.min.js"></script> {{ script|safe }} </head> <body> <div class='bokeh'> {{ div|safe }} </div> </body> </html> 发送消息并在我的内容脚本background.js中监听它,以便我可以运行一些代码来操作DOM。

我按原样从Chrome Message Parsing docs复制了示例代码,但我无法触发侦听器功能。

这是我的script.js文件:

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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

在不理解的情况下使用示例代码通常是一个坏主意。

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

  1. 如果您需要代码与正常页面一起执行,则需要Content Scripts

    文档详细描述了它,但有两种方法可以使用它们:在清单中声明它们并以编程方式注入。

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

    在许多情况下你不需要那个;在任何的情况下,以这种方式注入的代码会丢失其特殊的扩展权限,并且无法使用onMessage