从开发者控制台`;不能使用`document.execCommand(“复制”)从开发者控制台`;不

2019-05-12 00:47发布

调用document.execCommand( '复制'); 从Chrome开发者控制台返回false每次。

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

任何想法,为什么?

Answer 1:

document.execCommand('copy')必须由用户触发。 这不仅从控制台,它的任何地方,这不是由用户触发的事件中。 见下面,单击事件将返回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()来触发复制命令只会影响到真剪贴板中的内容。 如何实现可以被配置为允许到剪贴板写访问本规范的范围之内。



Answer 2:

作为替代方案,使用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);


Answer 3:

我相信, copy命令需要具有聚焦在浏览器上,当你到控制台并执行命令,当前窗口失去焦点。 但是,可能是其他的原因,因为它的工作,如果我给于setTimeout()



Answer 4:

此方法适用于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'
    })
  }
}


文章来源: Cannot use `document.execCommand('copy');` from developer console