为什么 document.execCommand("paste") 在 Google Chrome 中不起作用?

IT技术 javascript google-chrome google-chrome-extension clipboard
2021-02-09 11:26:50

我的扩展程序有问题。我想粘贴剪贴板中的数据。

到目前为止,我有这个:

function pasteAndGo()
{
    document.execCommand('paste')
    alert("Pasted")
}

警报出现,但没有粘贴任何内容。

我有一种感觉,这document是需要改变部分,但我不知道该怎么做。有任何想法吗?

6个回答

document.execCommand("paste")“合理”的浏览器不支持调用,因为它可能使脚本能够从剪贴板读取敏感数据(如密码),这是出于安全考虑。

这是兼容性矩阵document.execCommand("...")有关剪贴板事件:

“复制” “粘贴” “切”
IE 不适用
边缘 不适用
火狐 不适用
铬合金 不适用

我的两分钱:

  • EdgeFirefoxChrome的行为是“合理的”,因为它们阻止从剪贴板粘贴/读取数据。它们确实启用了剪切,因为剪切只是一个副本,然后是删除。
  • IE的行为对我来说毫无意义,因为它启用“有风险”的粘贴,但不执行剪切事件。

您可以使用document.queryCommandSupported方法检测可能的命令

编辑:根据 MDNdocument.queryCommandSupported现在已弃用,不应再使用。

Chrome 中曾经有一个实验性的剪贴板 API,但它在 Chrome 13 中被删除了。

Chrome 已转向更标准的document.execCommand('paste'),document.execCommand('copy')document.execCommand('cut')命令:https : //developer.mozilla.org/en/Rich-Text_Editing_in_Mozilla#Executing%5FCommands

在 Chrome 中,您需要将权限添加到清单中:“clipboardRead”和“clipboardWrite”。http://developer.chrome.com/extensions/declare_permissions.html

在 Chrome 38 之前,这些剪贴板权限仅适用于扩展页面,例如后台脚本。从 Chrome 39 开始,在清单文件 ( crbug.com/395376 ) 中声明剪贴板权限后,内容脚本也可以使用这些剪贴板 API

2021-03-22 11:26:50

这在背景页面中对我很有效。

function getClipboard() {
    var pasteTarget = document.createElement("div");
    pasteTarget.contentEditable = true;
    var actElem = document.activeElement.appendChild(pasteTarget).parentNode;
    pasteTarget.focus();
    document.execCommand("Paste", null, null);
    var paste = pasteTarget.innerText;
    actElem.removeChild(pasteTarget);
    return paste;
};

当然,您的扩展程序仍然需要“clipboardRead”权限,您必须使用消息传递将此信息返回到您的内容脚本:

内容.js:

chrome.extension.sendMessage({
    cmd: "clipboard", //$NON-NLS-0$
    action: "paste" //$NON-NLS-0$
}, function(response) {
    if (response.paste) {
        var range = document.getSelection().getRangeAt(0);
        range.deleteContents();
        range.insertNode(document.createTextNode(response.paste));
    }
});

背景.js:

function getClipboard() {
    var pasteTarget = document.createElement("div");
    pasteTarget.contentEditable = true;
    var actElem = document.activeElement.appendChild(pasteTarget).parentNode;
    pasteTarget.focus();
    document.execCommand("Paste", null, null);
    var paste = pasteTarget.innerText;
    actElem.removeChild(pasteTarget);
    return paste;
};

function onClipboardMessage(request, sender, sendResponse) {
    if (request.action === "paste") { //$NON-NLS-0$
        sendResponse({
            paste: getClipboard()
        });
    }
}

chrome.extension.onMessage.addListener(onClipboardMessage);
嗨@josephduffy 你让这个工作了吗?你的例子有帮助吗?
2021-03-31 11:26:50
@peter-ehrlich 嗨,彼得,这个例子怎么样?是你要求的吗?
2021-04-06 11:26:50

您不能在常规页面上执行它,只能在后台页面中执行。

一个背景页面的例子?
2021-03-20 11:26:50
你做整个不可见的textarea的事情吗?有人有代码示例吗?
2021-03-29 11:26:50
@brandaemon 确实,这没有任何意义
2021-03-30 11:26:50
不再正确,请参阅下面的答案(“从 chrome 39 开始,内容脚本也可以在清单文件中声明剪贴板权限后使用这些剪贴板 API”)
2021-04-06 11:26:50
什么是“常规页面”与“背景页面”?
2021-04-13 11:26:50

您需要设置clipboardRead使用权限document.execCommand('paste')clipboardWrite许可使用execCommand('copy')execCommand('cut')
否则,权限将被拒绝,什么也不会发生。

查看链接了解更多详情。