字符串包含无效字符 - Firefox

String contains an invalid character - Firefox

提问人:Elvis Murseli 提问时间:10/18/2023 更新时间:10/21/2023 访问量:50

问:

我遇到了一个奇怪的问题。它与将图像转换为画布有关。所以我可以在互联网上复制图像,并在粘贴时,我想从剪贴板获取数据并将其显示给用户,但是当我尝试将其粘贴到 firefox 上时,我得到“字符串包含无效字符”,之后当我再次尝试粘贴时,效果很好。对于 chrome,我目前正在使用 navigator.clipboard.read,但我也尝试过粘贴事件,它工作得很好,它第一次粘贴数据。 我正在使用 VueJS,这是我拥有的代码:

mounted() {
    window.addEventListener('paste', e => {
        if (!this.supportsReadNavigator) {
            this.handlePasteEvent(e)
        }
    })
},
created() {
    window.addEventListener('keydown', (e) => {
        // this.handleESC(e)
        if ((e.ctrlKey || e.metaKey) && e.key == 'v') {
            this.handlePasteFromClipboard(e)
        }
    });
},
methods: {
    async handlePasteFromClipboard() {
        if (navigator?.clipboard?.read) {
            this.supportsReadNavigator = true
            const data = await navigator.clipboard.read()
            const clipboardContent = data[0]
            const type = clipboardContent.types[0]
            if (type == 'image/png') {
                this?.$refs['clipboard-modal']?.showModal()
                const blob = await clipboardContent.getType('image/png')
                const url = window.URL.createObjectURL(blob)
                this.getDataBlob(url)
            }
        }
    },
    async handlePasteEvent(e) {
        if (e?.clipboardData?.items) {
            const data = e.clipboardData.items;
            const clipboardContent = data[0]
            const type = clipboardContent?.type

            if (clipboardContent.kind === "file" && type.indexOf("image") !== -1) {
                this?.$refs['clipboard-modal']?.showModal()
                const blob = clipboardContent.getAsFile();
                const url = window.URL.createObjectURL(blob)
                this.getDataBlob(url)
            } else if (clipboardContent.kind === "string" && clipboardContent.type === "text/html") {
                const htmlData = e.clipboardData.getData('text/html');
                
                if (!htmlData.includes('<img')) return

                const div = document.createElement('div')
                document.body.appendChild(div)
                div.innerHTML = htmlData

                const img = div.firstElementChild
                const canvas = document.createElement('canvas');
                const ctx = canvas.getContext('2d');
                img.crossOrigin = "anonymous"
                
                canvas.width = img?.width;
                canvas.height = img?.height;
                
                ctx.drawImage(img, 0, 0, img.width, img.height);
                document.body.appendChild(canvas)
                
                try {
                    const imageDataURL = await  canvas.toDataURL('image/png');
                    let blob = this.dataURLToBlob(imageDataURL)

                    this?.$refs['clipboard-modal']?.showModal()

                    this.clipboard_img = imageDataURL
                    this.clipboard_img_blob = await this.blobToFile(blob);
                } catch(e) {
                    console.log(e?.message);
                    this.$refs.show.showFlashError(e?.message || 'Something went wrong')
                    this.$nextTick(() => this?.$refs['clipboard-modal']?.hideModal())
                }

                div.style.display = 'none'
                canvas.style.display = 'none'
            }
        }
    },
}

如果你需要,我会提供更多信息。谢谢

JavaScript Firefox 画布 blob 粘贴

评论

1赞 Kaiido 10/18/2023
错误从何处触发?控制台的消息应具有您可以跟踪的跟踪。
0赞 Pointy 10/18/2023
这个问题可能与以下事实有关:压缩的图像文件(jpeg、png 等)将(或肯定可以)具有无法识别为 Unicode 代码点的字节序列。因此,如果浏览器认为它应该将您删除的图像文件视为字符串 (UTF-8) 内容,则图像可能会导致该内容中断。
0赞 Elvis Murseli 10/20/2023
嘿@Kaiido很抱歉没有早点回复,过去 2 天没有工作。你是对的,错误似乎来自 try{} 中的 dataURLToBlob 方法,据我所知。在这里,我在沙盒中添加了代码:codesandbox.io/s/zealous-wozniak-79z2ks?file=/src/components/... 。我稍微修改了一下,所以现在我们只使用粘贴事件,所以如果你愿意,你现在可以将 firefox 与 chrome 进行比较。如果您还需要其他东西,请告诉我
0赞 Elvis Murseli 10/20/2023
嘿@Pointy 也为2天没有回复而向你道歉,我在这条路上有点落后,所以我有点不明白。相反,如果你想检查它,我在这里添加了沙盒中的代码:codesandbox.io/s/zealous-wozniak-79z2ks?file=/src/components/......如果您还需要其他东西,请告诉我
0赞 Kaiido 10/20/2023
似乎在 macOS 上的 Firefox 118 上对我来说工作正常。我不得不修改一下Chrome的代码,以便它确实如此。img = div.querySelector("img")

答: 暂无答案