通过 Chrome 扩展中的上下文菜单选项复制所选文本
Copy selected text via a context menu option in a Chrome extension
我正在尝试创建一个上下文菜单选项,用于将一些文本复制到系统剪贴板。
目前,我只是复制一个硬编码的字符串文字,但我想知道如何更改它以复制选定的文本。具体来说,我不知道如何正确创建 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?
"createProperties" in the documentation is the dictionary that is passed to the chrome.contextMenus.create
方法(即带有 "title"、"contexts" 等的东西)
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 to an 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
}
}
我正在尝试创建一个上下文菜单选项,用于将一些文本复制到系统剪贴板。
目前,我只是复制一个硬编码的字符串文字,但我想知道如何更改它以复制选定的文本。具体来说,我不知道如何正确创建 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?
"createProperties" in the documentation is the dictionary that is passed to the chrome.contextMenus.create
方法(即带有 "title"、"contexts" 等的东西)
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 to an 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
}
}