无法从开发者控制台使用 `document.execCommand('copy');`

IT技术 javascript google-chrome domdocument execcommand
2021-03-07 05:58:17

调用document.execCommand('copy'); Chrome 开发者控制台false每次都会返回

自己试试吧。打开控制台并运行它,它永远不会成功。

知道为什么吗?

在此处输入图片说明

4个回答

document.execCommand('copy')必须由用户触发。它不仅来自控制台,还可以出现在用户触发的事件之外的任何地方。见下文,click 事件将返回 true,但没有事件的调用不会,并且在调度事件中的调用也不会。

console.log('no event', document.execCommand('bold'));

document.getElementById('test').addEventListener('click', function(){
    console.log('user click', document.execCommand('copy'));
});

document.getElementById('test').addEventListener('fakeclick', function(){
    console.log('fake click', document.execCommand('copy'));
});


var event = new Event('fakeclick')

document.getElementById('test').dispatchEvent(event) ;
<div id="test">click</ha>

见这里:https : //w3c.github.io/editing/execCommand.html#dfn-the-copy-command

从 document.execCommand() 触发的复制命令只会影响真实剪贴板的内容,如果事件是从用户信任和触发的事件中分派的,或者如果实现配置为允许这样做。如何配置实现以允许对剪贴板的写访问超出了本规范的范围。

或者,使用copy()Chrome 开发工具内置命令。您不能使用,document.execCommand("copy")因为这需要用户操作才能触发它。

copy()命令允许您复制任何字符串(或对象为 JSON)。要模拟,document.execCommand("copy")您可以使用以下命令获取当前选择getSelection().toString()

copy(getSelection().toString())

截屏

如果您需要document.execCommand("copy")专门进行实际测试(例如,调试使用它的脚本),并且由于某种原因使用调试器并不理想,您可以将代码包装在点击处理程序中,然后点击您的页面:

document.body.addEventListener("click", function() {
    console.log("copy", document.execCommand("copy"));
}, false);
复制当前选择?
2021-04-21 05:58:17
@PraveenKumar - 使用getSelection().toString(). 编辑了我的答案。
2021-04-24 05:58:17

我相信,copy命令需要将焦点放在浏览器上,当您转到控制台并执行命令时,当前窗口会失去焦点。但可能是其他原因,因为如果我屈服,它会起作用setTimeout()

此方法适用于最新版本的 safari

const copyUrl = (url, cb) => {
  try {
    var input = document.getElementById('copyInput')
    input.value = url
    input.focus()
    input.select()
    if (document.execCommand('copy', false, null)) {
      Message('复制成功')
    } else {
      Message({
        message: '当前浏览器不支持复制操作,请使用Ctrl+c手动复制',
        type: 'warning'
      })
    }
  } catch (e) {
    Message({
      message: `复制出错:${e}`,
      type: 'error'
    })
  }
}