在 chrome 扩展 V3 中复制到剪贴板
Copy to clipboard in chrome extension V3
我正在开发 chrome 扩展 V3。我想将内容复制到我的 JS 文件中的剪贴板。
manifest.json如下,
"background" :{
"service_worker" :"eventPage.js"
},
"permissions" : [
"contextMenus",
"clipboardWrite"
]
我已经尝试了复制功能的 2 个解决方案。
解决方案 1:
const el = document.createElement('textarea');
el.value = str;
el.setAttribute('readonly', '');
el.style.position = 'absolute';
el.style.left = '-9999px';
document.body.appendChild(el);
el.select();
document.execCommand('copy');
document.body.removeChild(el);
结果:
Error in event handler: ReferenceError: document is not defined at copyToClipboard
解决方案 2:
navigator.clipboard.writeText(str);
结果:
Error in event handler: TypeError: Cannot read properties of undefined (reading 'writeText')
chrome 扩展是 运行 作为服务人员。所以我似乎无法访问 DOM 文档并且没有 writeText 的授权。有人有其他建议吗?
谢谢。
我会遵循 wOxxOm 给你的极好的建议,在一个具体的例子中详细说明它。你想要做的是有一个 ContentScript.js 在任何带有网页的活动选项卡上运行,因为你无法从 backGround.js 访问 DOM,然后发送消息到此脚本,您将从那里复制到剪贴板。
manifest.json
"background" :{
"service_worker" :"eventPage.js"
},
"permissions" : [
"contextMenus",
"clipboardWrite"
],
"content_scripts": [ // this is what you need to add
{
"matches": [
"<all_urls>"
],
"js": ["content.js"]
}
],
您可以从 background.js 发送一条消息,该消息将在 ContentScript.js
中处理
background.js
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id,
{
message: "copyText",
textToCopy: "some text"
}, function(response) {})
})
在 contentScript.js 中,您将捕获消息并将其复制到剪贴板。
content.js
chrome.runtime.onMessage.addListener( // this is the message listener
function(request, sender, sendResponse) {
if (request.message === "copyText")
copyToTheClipboard(request.textToCopy);
}
);
async function copyToTheClipboard(textToCopy){
const el = document.createElement('textarea');
el.value = textToCopy;
el.setAttribute('readonly', '');
el.style.position = 'absolute';
el.style.left = '-9999px';
document.body.appendChild(el);
el.select();
document.execCommand('copy');
document.body.removeChild(el);
}
我正在开发 chrome 扩展 V3。我想将内容复制到我的 JS 文件中的剪贴板。
manifest.json如下,
"background" :{
"service_worker" :"eventPage.js"
},
"permissions" : [
"contextMenus",
"clipboardWrite"
]
我已经尝试了复制功能的 2 个解决方案。
解决方案 1:
const el = document.createElement('textarea');
el.value = str;
el.setAttribute('readonly', '');
el.style.position = 'absolute';
el.style.left = '-9999px';
document.body.appendChild(el);
el.select();
document.execCommand('copy');
document.body.removeChild(el);
结果:
Error in event handler: ReferenceError: document is not defined at copyToClipboard
解决方案 2:
navigator.clipboard.writeText(str);
结果:
Error in event handler: TypeError: Cannot read properties of undefined (reading 'writeText')
chrome 扩展是 运行 作为服务人员。所以我似乎无法访问 DOM 文档并且没有 writeText 的授权。有人有其他建议吗?
谢谢。
我会遵循 wOxxOm 给你的极好的建议,在一个具体的例子中详细说明它。你想要做的是有一个 ContentScript.js 在任何带有网页的活动选项卡上运行,因为你无法从 backGround.js 访问 DOM,然后发送消息到此脚本,您将从那里复制到剪贴板。
manifest.json
"background" :{
"service_worker" :"eventPage.js"
},
"permissions" : [
"contextMenus",
"clipboardWrite"
],
"content_scripts": [ // this is what you need to add
{
"matches": [
"<all_urls>"
],
"js": ["content.js"]
}
],
您可以从 background.js 发送一条消息,该消息将在 ContentScript.js
中处理background.js
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id,
{
message: "copyText",
textToCopy: "some text"
}, function(response) {})
})
在 contentScript.js 中,您将捕获消息并将其复制到剪贴板。
content.js
chrome.runtime.onMessage.addListener( // this is the message listener
function(request, sender, sendResponse) {
if (request.message === "copyText")
copyToTheClipboard(request.textToCopy);
}
);
async function copyToTheClipboard(textToCopy){
const el = document.createElement('textarea');
el.value = textToCopy;
el.setAttribute('readonly', '');
el.style.position = 'absolute';
el.style.left = '-9999px';
document.body.appendChild(el);
el.select();
document.execCommand('copy');
document.body.removeChild(el);
}