【问题标题】:TypeError: Failed to construct 'ClipboardItem': Failed to convert value to 'Blob'TypeError:无法构造“ClipboardItem”:无法将值转换为“Blob”
【发布时间】:2020-08-27 14:29:55
【问题描述】:

我想将文本和 html 写入用户剪贴板。我正在使用来自 MDN 的代码 sn-p:https://developer.mozilla.org/en-US/docs/Web/API/Clipboard/write

navigator.permissions.query({ name: 'clipboard-write' }).then(result => {
    if (result.state === 'granted') {
        let data = [new ClipboardItem({ "text/plain": message })];
        navigator.clipboard.write(data).then(function() {
            $.growl.notice({ message: ResourceService.getKey("CopyToClipboardSuccess"), location: "tc", title: "" });
        }, function() {
            $.growl.error({ message: ResourceService.getKey("CopyToClipboardError"), location: "tc", title: "" });
        });
    }
});

我得到的只是这个错误:

Uncaught (in promise) TypeError: Failed to construct 'ClipboardItem': Failed to convert value to 'Blob'.

还有其他方法可以将文本和 HTML 复制到剪贴板。我错过了什么?

【问题讨论】:

  • 能否给出message变量的类型和内容?第三行好像不能转成blob。
  • 另外,您使用的是什么浏览器? Clipboard API 在撰写本文时只是一个草稿,似乎只有 Chrome 完全支持它(ClipboardItem)。 developer.mozilla.org/en-US/docs/Web/API/…
  • 我正在使用最新的 Chrome 并且消息是一个字符串

标签: javascript google-chrome clipboard


【解决方案1】:

假设您的消息是字符串类型,here is a demo code

你的代码是

navigator.permissions.query({ name: 'clipboard-write' }).then(result => {
    if (result.state === 'granted') {
        const type = 'text/plain';
        const blob = new Blob([message], { type });
        let data = [new ClipboardItem({ [type]: blob })];
        navigator.clipboard.write(data).then(function() {
            $.growl.notice({ message: ResourceService.getKey("CopyToClipboardSuccess"), location: "tc", title: "" });
        }, function() {
            $.growl.error({ message: ResourceService.getKey("CopyToClipboardError"), location: "tc", title: "" });
        });
    }
});

但剪贴板 API 和事件仍在草稿中,我建议使用 clipboard.js 等替代方案

【讨论】:

  • 我将如何同时添加 - 文本和 html?比如文本是“香蕉”,HTML 是“banana.com">Banana</a>"
  • ClipboardItem 目前只支持文字和图片,你可以通过运行setTimeout(async () =&gt; { const clipboardItems = await navigator.clipboard.read(); console.log(clipboardItems[0].types); }, 1000);查看你的浏览器支持的类型
  • 我明白了,还有其他可能完成这项任务吗?如果我猜对了,clipboard.js 也只会复制文本?
  • 恐怕不行,任何系统在OS层面都不支持HTML类型,所以这是不可能的,但是如果你的文本是有效的HTML,word、excel之类的软件可以识别并解释它作为html
  • HTML 在 Safari 中受支持,并将在 Chrome 86 中得到支持。此处也对此进行了描述:stackoverflow.com/a/63457395/7548103
猜你喜欢
  • 2015-08-14
  • 2021-06-20
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
相关资源
最近更新 更多