vue.js 将文本复制到剪贴板:无法读取未定义的阅读“writeText”的属性

hs1ihplo  于 2023-03-24  发布在  Vue.js
关注(0)|答案(3)|浏览(742)

我有一个按钮

当我点击复制

copyImageLinkText({ mouseenter, mouseleave }, e) {
  this.showCopiedText = !this.showCopiedText
  navigator.clipboard.writeText(this.imageLink)

  clearTimeout(this._timerId)
  mouseenter(e)
  this._timerId = setTimeout(() => mouseleave(e), 1000)
},

这条线在我的MacBook Pro上似乎可以完美地在本地工作

navigator.clipboard.writeText(this.imageLink)

当我构建并部署到我的开发服务器时,它工作。
TypeError:无法读取未定义的属性(阅读“writeText”)

uujelgoq

uujelgoq1#

navigator.clipboard的使用需要一个安全的来源。因此,如果您的开发环境是通过HTTP服务的,那么剪贴板方法将不可用。

此功能仅适用于secure contexts(HTTPS)以及部分或所有支持的浏览器。
也许您可以检查window.isSecureContext是否可以使用此方法,并相应地禁用复制文本按钮。

变通方案

最好的选择是在你的开发环境中使用HTTPS。
但既然你要求一个变通方案,这里有一个(非常黑客)的工作方法。使用Document.exec命令,这不再是推荐的,而有利于ClipboardAPI

function unsecuredCopyToClipboard(text) {
  const textArea = document.createElement("textarea");
  textArea.value = text;
  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();
  try {
    document.execCommand('copy');
  } catch (err) {
    console.error('Unable to copy to clipboard', err);
  }
  document.body.removeChild(textArea);
}

用法

然后,您可以检查是否为!navigator.clipboard并调用fallback方法,否则继续使用普通的navigator.clipboard.writeText(...)函数。例如:
x一个一个一个一个x一个一个二个x

6fe3ivhb

6fe3ivhb2#

最好使用async,并将代码放在try catch块中。

async copyCode() {
 try {
     await navigator.clipboard.writeText(this.input);
 } catch (e) {
     console.log(e);
 }
}
31moq8wy

31moq8wy3#

我也遇到了同样的问题,这里有一个解决方案
#不要使用--xnavigator.clipboard.writeText()
#使用--〉document.execCommand('copy')

相关问题