document.execCommand复制文本踩的坑

3,649 阅读1分钟

1.遇到的问题

在Chrome浏览器里代码正常执行,可以通过document.execCommand方式将文本复制到粘贴板,但将代码部署到客户端后不能成功复制

handleCopyText = () => {
    let copyText = document.querySelector("#ocr-paste-input");
    copyText.select();
    document.execCommand('Copy', false, null);
    setTimeout(() => {
      window.message.success('解析后的文本已复制到剪贴板');
      copyText.blur();
    }, 0);
}

2. 调试方式

测试环境的代码中增加location.href跳转到本地服务,进行断点调试,执行此处时发现document.execCommand('Copy', false, null); 执行结果为false, 不能成功复制, 所以推测是客户端所嵌浏览器的内核导致的; 但写了一个仅console该结果【document.execCommand('Copy', false, null)】的demo,输出结果是true,至此处傻眼晕古七……

查阅document.execCommand文档,在用户触发的同步操作中,执行结果为true,在异步操作中,执行结果为false,而我代码中在setState后进行该操作,终于找到原因。客户端内核是Chrome/66.0.3359.181,浏览器中内核是Chrome/81.0.4044.122,推测内核差异导致了执行结果的区别,最终改成了支持异步的复制方式

handleCopyText = () => {
    let copyText = document.querySelector("#ocr-paste-input");
    navigator.clipboard.writeText(copyText.innerHTML)
      .then(() => {
        window.message.success('解析后的文本已复制到剪贴板');
      })
      .catch(err => {
        // 如果用户没有授权,则抛出异常
        window.message.warning('无法复制此文本,请手动复制');
      });
}