3

我正在尝试创建一个上下文菜单选项,它将一些文本复制到系统剪贴板。

目前,我只是在复制一个硬编码的字符串文字,但我想知道如何将其更改为复制选定的文本。具体来说,我不知道如何正确创建createProperties对象(见底部)

据我了解,这只能通过背景页面完成。

我有以下背景页面:

background.html

<textarea id="temp"></textarea>
<script src="context.js"></script>

context.js如下:

chrome.contextMenus.create({
    "title": "Freedom",
    "contexts": ["editable"],
    "onclick" : copyToClipboard
  });        

function copyToClipboard()
{ 
    var tempNode = document.getElementById("temp");
    tempNode.value = "some text";
    tempNode.select();
    var status = document.execCommand('copy',false,null);

    if(status) alert('successful');

    else alert('unsuccessful');
}    

manifest.json的如下:

{
    "manifest_version": 2,

    "name": "Freedom",
    "description": "Provides users useful and fun context menu options that they can access from anywhere.",
    "version": "1.0",

    "permissions": [
        "contextMenus",
        "clipboardWrite"
        ],  

    "background": {
        "page": "background.html"
    }   

}    

我显然错误地声明了 chrome.contextMenus.create() 函数。我已经阅读了它的文档,我只能想象我没有正确地创建createProperties对象。

我一直在尝试模仿这些来源:

是否可以通过 Chrome 扩展中的上下文菜单项调用内容脚本方法?

http://paul.kinlan.me/chrome-extension-adding-context-menus/

其他一些相关问题是:

在 Chrome 扩展中复制到剪贴板

如何将文本从 Google Chrome 扩展程序复制到剪贴板?

4

1 回答 1

3

文档中的“createProperties”是传递给chrome.contextMenus.create方法的字典(即带有“title”、“contexts”等的那个东西)

函数接收两个参数的状态的onclick事件描述。chrome.contextMenus.create第一个参数(“info”)是包含所选文本信息的字典。第二个参数(“tab”)包含有关选项卡的信息(在您的情况下,您不需要)。
“信息”字典有一个属性“selectionText”,当单击上下文菜单项时,该属性保存选定的文本。这可以在您的代码中使用,如下所示:

function copyToClipboard(info) {
    var tempNode = document.getElementById("temp");
    tempNode.value = info.selectionText; // <-- Selected text
    tempNode.select();
    document.execCommand('copy', false, null);
}

那将解决您的直接问题。
除此之外,您可以通过将背景页面转换为事件页面来改进您的扩展。事件页面优于后台页面的主要好处是您的扩展程序在后台闲置时不会不必要地使用内存。

// background.js

// Register context menu
chrome.runtime.onInstalled.addListener(function() {
    chrome.contextMenus.create({
        "id": "some id",  // Required for event pages
        "title": "Copy selected text to clipboard",
        "contexts": ["editable"],
        // "onclick" : ...  // Removed in favor of chrome.contextMenus.onClicked
    });

});

// Register a contextmenu click handler.
chrome.contextMenus.onClicked.addListener(copyToClipboard);

这是一个最小的 manifest.json (注意"persistent": false键,它指定您要使用事件页面

{
    "manifest_version": 2,

    "name": "Copy selected text to clipboard",
    "version": "1.0",

    "permissions": [
        "contextMenus",
        "clipboardWrite"
     ],

    "background": {
        "page": "background.html",
        "persistent": false
    }
}   
于 2015-01-11T22:53:49.357 回答