You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复制到剪贴板后打开新窗口,如何解决焦点丢失异常?

解决剪贴板复制后打开新标签页的焦点问题

你遇到的Uncaught (in promise) DOMException: Document is not focused.错误,根源在于剪贴板写入是异步操作,之前的代码在剪贴板操作未完成时就执行了window.open(),导致原页面失去焦点,触发了浏览器对剪贴板操作的权限限制(剪贴板操作要求页面处于激活焦点状态)。

正确解决方案:用async/await确保剪贴板操作完成后再打开窗口

将copyToClipboard函数改为异步函数,通过await等待剪贴板写入操作完成,之后再执行打开新窗口的逻辑,就能避免焦点丢失的问题。

修改后的完整代码如下:

HTML代码

<body>
<button type="button" onclick="copyToClipboard()">Copy</button>
<div id="template">
  Test
</div>
</body>

JavaScript代码

async function copyToClipboard(){
    try {
      const htmlCode = template.innerHTML;
      const blobInput = new Blob([htmlCode], { type: 'text/html' })
      // 等待剪贴板写入完成
      await navigator.clipboard.write([new ClipboardItem({ 'text/html': blobInput })])
      alert('Copied')

      var win = window.open('https://mail.google.com/mail/', '_blank');
      if (win) {
          win.focus();
      } else {
          alert('Please allow popups for this website');
      }
    } catch (e) {
      alert(e)
    }
};

补充:你之前.then()写法的错误

你尝试的.then()写法无效,是因为直接把window.open()的执行结果传给了.then(),而非传递一个回调函数。正确的.then()写法应为:

navigator.clipboard.write([new ClipboardItem({ 'text/html': blobInput })])
  .then(() => {
    window.open('https://mail.google.com/mail/', '_blank');
  });

不过async/await的写法更简洁直观,可读性更高。

内容的提问来源于stack exchange,提问作者Markus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:25:14