我正在尝试将我的firefox插件移植到chrome上,下面是我的示例代码。
档案: myscript.js (部分)
.
.
function init() {
.
.
.
}
function myFunc(inp, option) {
.
.
.
}
chrome.extension.onMessage.addListener(function (message, sender, response) {
switch (message) {
case "ITRANS":
console.log("ITRANS");
if (document.getSelection().baseNode != null){
init();
window.modifySelection(myFunc(window.getSelection().toString(), 0));
}
break;
case "Devanagari":
console.log("Devanagari");
if (document.getSelection().baseNode != null){
init();
window.modifySelection(myFunc(window.getSelection().toString(), 1));
}
break;
default:
console.log("Default");
}
});
文件: background.js
var _selection_univ = chrome.contextMenus.create({
"title": "INDIC 2 ITRANS",
"id": "ITRANS",
"onclick": reportclick,
"contexts": ["selection"]
}, function () {
console.log("Context Menu 1 ITRANS");
});
var _selection_univ = chrome.contextMenus.create({
"title": "Eng 2 Devanagari",
"id": "Devanagari",
"onclick": reportclick,
"contexts": ["selection"]
}, function () {
console.log("Context Menu 2 Devanagari");
});
function reportclick(info, tab) {
switch (info.menuItemId) {
case "ITRANS":
console.log("BG: ITRANS");
chrome.tabs.sendMessage(tab.id, "ITRANS");
break;
case "Devanagari":
console.log("BG: Devanagari");
chrome.tabs.sendMessage(tab.id, "Devanagari");
break;
default:
console.log("BG: Default");
}
}
文件: manifest.json
{
"name": "Parivartan",
"version": "0.8.2",
"manifest_version": 2,
"permissions":[
"contextMenus",
"<all_urls>",
"tabs"
],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["myscript.js"],
"all_frames": true
}
],
"background": {
"scripts": ["background.js"]
}
}
我想不出有几件事。
(1)应该在哪里放置init()函数(应该只运行一次以初始化插件全局)。
(2)将选定的文本替换为函数的输出。上面的代码不起作用,上面写着"modifySelection“找不到。
(3)如果函数位于不同的(file2.js)文件中,如何调用它们。目前,我将所有函数放在一个文件(myscript.js)中。
(4)如何在菜单中创建菜单。
我试着在google上搜索,但是找不到解决上述问题的方法。有人能帮帮我吗。
-Mohan
发布于 2013-11-04 01:34:36
(1)我的init()函数应该放在哪里(应该只运行一次来初始化插件全局) ?
根据您的需求,有两个事件应该满足您的初始化需求:
当扩展第一次安装、扩展更新到新版本和Chrome更新到新版本时触发。
例如:chrome.runtime.onInstalled.addListener(function() {...});
当安装了此扩展的配置文件首先启动时触发。启动匿名配置文件时不会触发此事件,即使该扩展在“拆分”隐名模式下运行。
例如:chrome.runtime.onStartup.addListener(function(details) {...});
(2)用函数的输出替换选定的文本。上面的代码不起作用,上面写着"modifySelection“没有找到.
这是因为没有定义函数modifySelection
。你从哪里得到这个名字的?更新
根据OP在注释中的反馈,一个简单的modifySelection()
函数可能如下所示:
function modifySelection(newValue) {
var range = document.getSelection().getRangeAt(0);
range.deleteContents();
range.insertNode(document.createTextNode(newValue));
}
(注:只有在选择只涉及TextNodes时才能正常工作。在其他情况下,它可能破坏DOM,因此需要对所选内容进行更详细的解析。)
如果函数位于不同的(file2.js)文件中,(3)如何调用它们。目前,我将所有函数放在一个文件(myscript.js)中。
注入所有必要的文件,然后像往常一样调用函数。也就是说,所有注入的内容脚本都在同一个JS上下文中执行。例如:
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["file1.js", "file2.js", ...],
"all_frames": true
}],
在file1.js
中:
...
function funcInFile1() {...}
...
在file2.js
中
...
var res = funcInFile1();
...
(Note:内容脚本按它们出现在"js“数组中的顺序注入。在调用每个资源之前,确保它是可用的。例如,在注入funcInFile1()
之前尝试调用file1.js
将导致错误。)
(4)如何在菜单中创建菜单.
如果您的意思是“创建子菜单”,则可以在createProperties函数的parentId
参数中包含一个parentId
属性:
parentId: 父菜单项的ID;这使该项成为以前添加的项的子项。
还可以看到这个演示扩展,它(以及其他事情)就是这样做的。
一些结束语--
https://stackoverflow.com/questions/19758956
复制相似问题