首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >铬扩展替换选定的文本

铬扩展替换选定的文本
EN

Stack Overflow用户
提问于 2013-11-03 22:25:56
回答 1查看 930关注 0票数 2

我正在尝试将我的firefox插件移植到chrome上,下面是我的示例代码。

档案: myscript.js (部分)

代码语言:javascript
代码运行次数:0
运行
复制
.
.
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

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
{
  "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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-04 09:34:36

(1)我的init()函数应该放在哪里(应该只运行一次来初始化插件全局) ?

根据您的需求,有两个事件应该满足您的初始化需求:

chrome.runtime.onInstalled

当扩展第一次安装、扩展更新到新版本和Chrome更新到新版本时触发。

例如:chrome.runtime.onInstalled.addListener(function() {...});

chrome.runtime.onStartup

当安装了此扩展的配置文件首先启动时触发。启动匿名配置文件时不会触发此事件,即使该扩展在“拆分”隐名模式下运行。

例如:chrome.runtime.onStartup.addListener(function(details) {...});

(2)用函数的输出替换选定的文本。上面的代码不起作用,上面写着"modifySelection“没有找到.

这是因为没有定义函数modifySelection。你从哪里得到这个名字的?更新

根据OP在注释中的反馈,一个简单的modifySelection()函数可能如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
function modifySelection(newValue) {
    var range = document.getSelection().getRangeAt(0);
    range.deleteContents();
    range.insertNode(document.createTextNode(newValue));
}

(注:只有在选择只涉及TextNodes时才能正常工作。在其他情况下,它可能破坏DOM,因此需要对所选内容进行更详细的解析。)

如果函数位于不同的(file2.js)文件中,(3)如何调用它们。目前,我将所有函数放在一个文件(myscript.js)中。

注入所有必要的文件,然后像往常一样调用函数。也就是说,所有注入的内容脚本都在同一个JS上下文中执行。例如:

代码语言:javascript
代码运行次数:0
运行
复制
"content_scripts": [{
  "matches": ["<all_urls>"],
  "js": ["file1.js", "file2.js", ...],
  "all_frames": true
}],

file1.js中:

代码语言:javascript
代码运行次数:0
运行
复制
...
function funcInFile1() {...}
...

file2.js

代码语言:javascript
代码运行次数:0
运行
复制
...
var res = funcInFile1();
...

(Note:内容脚本按它们出现在"js“数组中的顺序注入。在调用每个资源之前,确保它是可用的。例如,在注入funcInFile1()之前尝试调用file1.js将导致错误。)

(4)如何在菜单中创建菜单.

如果您的意思是“创建子菜单”,则可以在createProperties函数的parentId参数中包含一个parentId属性:

parentId: 父菜单项的ID;这使该项成为以前添加的项的子项。

还可以看到这个演示扩展,它(以及其他事情)就是这样做的。

一些结束语--

  1. chrome.extension.onMessage被否决了。请使用chrome.runtime.onMessage代替。
  2. 如果可能的话,尝试使用事件页 (而不是背景页面)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19758956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档