【问题标题】:Copy selected text via a context menu option in a Chrome extension通过 Chrome 扩展程序中的上下文菜单选项复制选定的文本
【发布时间】:2015-03-09 15:30:46
【问题描述】:

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

目前,我只是在复制一个硬编码的字符串文字,但我想知道如何将其更改为复制选定的文本。具体来说,我不知道如何正确创建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 对象。

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

Is that possible calling content script method by context menu item in Chrome extension?

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

其他一些相关问题是:

Copy to Clipboard in Chrome Extension

How to copy text to clipboard from a Google Chrome extension?

【问题讨论】:

  • 您正在调用函数而不是传递函数引用。并仔细阅读click event handler of chrome.contextMenus.create的文档,你的函数签名完全关闭了。
  • 您能否提供一个示例,我一直在阅读并重读该页面,但我很困惑。我看到了很多例子,虽然我做了什么。它们过时了吗?
  • 你的意思是我没有正确创建 createProperties 对象吗?
  • 这里的问题由两部分组成:1)你调用一个函数而不是传递一个函数引用(在Stack Overflow上有数百个关于这个问题的问题,搜索你会发现...... ) 和 2) onclick 处理程序与 API 描述不匹配。你能先链接到你提到的一些“过时”的例子吗?也许这个例子并没有过时,而是你的一个误解。
  • 会做,现在编辑。

标签: javascript google-chrome google-chrome-extension contextmenu clipboard-interaction


【解决方案1】:

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

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

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

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

// 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 键,它指定您要使用 event page

{
    "manifest_version": 2,

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

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

    "background": {
        "page": "background.html",
        "persistent": false
    }
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多