当用户在上下文菜单中单击我的项目时,我想从<!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
我做错了什么?
答案 0 :(得分:1)
在不理解的情况下使用示例代码通常是一个坏主意。
通过创建<script>
标记,您可以在当前页面的上下文中注入代码 - 这恰好是您的背景页。
如果您需要代码与正常页面一起执行,则需要Content Scripts。
文档详细描述了它,但有两种方法可以使用它们:在清单中声明它们并以编程方式注入。
内容脚本存在限制,因为它们can't interact with pages' own code。这就是the snippet you quote的用武之地 - 但仅限于已经运行的内容脚本。
在许多情况下你不需要那个;在任何的情况下,以这种方式注入的代码会丢失其特殊的扩展权限,并且无法使用onMessage
。