use*_*908 5 javascript html2canvas vue.js nuxt.js web-share
在我的 Nuxt PWA 中,我有一个函数可以使用这个包将 HTML 转换为 Canvas 。生成的图像采用 64 进制。现在我希望能够通过以下方式共享该图像:Whatsapp、Facebook、电子邮件、Instagram 等。我找到了几个软件包,但它们似乎都不支持仅共享文件 URL 和文本。
这是我的分享功能:
shareTicket(index) {
html2canvas(this.$refs['ticket-' + index][0], {
backgroundColor: '#efefef',
useCORS: true, // if the contents of screenshots, there are images, there may be a case of cross-domain, add this parameter, the cross-domain file to solve the problem
}).then((canvas) => {
let url = canvas.toDataURL('image/png') // finally produced image url
if (navigator.share) {
navigator.share({
title: 'Title to be shared',
text: 'Text to be shared',
url: this.url,
})
}
})
Run Code Online (Sandbox Code Playgroud)
当我删除条件时,我在控制台中收到一个不是函数的if (navigator.share)错误。navigator.share我在某处读到它只适用于 HTTPS,所以我上传到我的临时服务器并尝试,但仍然遇到相同的错误。
需要明确的是,我希望能够共享生成的图像本身,而不是 URL。
kis*_*ssu 11
告诉我这个 URL 是否适合你: https: //nuxt-share-social-media.netlify.app
如果适合,你可以在这里找到 Github 存储库: https: //github.com/kissu/so-share-图像赏金
代码是
<template>
<div>
<div id="capture" ref="element" style="padding: 10px; background: #f5da55">
<h4 style="color: #000">Hello world!</h4>
</div>
<br />
<br />
<button @click="share">share please</button>
</div>
</template>
<script>
import html2canvas from 'html2canvas'
export default {
methods: {
share() {
// iife here
;(async () => {
if (!('share' in navigator)) {
return
}
// `element` is the HTML element you want to share.
// `backgroundColor` is the desired background color.
const canvas = await html2canvas(this.$refs.element)
canvas.toBlob(async (blob) => {
// Even if you want to share just one file you need to
// send them as an array of files.
const files = [new File([blob], 'image.png', { type: blob.type })]
const shareData = {
text: 'Some text',
title: 'Some title',
files,
}
if (navigator.canShare(shareData)) {
try {
await navigator.share(shareData)
} catch (err) {
if (err.name !== 'AbortError') {
console.error(err.name, err.message)
}
}
} else {
console.warn('Sharing not supported', shareData)
}
})
})()
},
},
}
</script>
Run Code Online (Sandbox Code Playgroud)
灵感来自@denvercoder9!
method上下文中工作得很好!async因为 ESlint,如果你想在之后做点什么$refs因为这就是你应该如何在 Vue 生态系统中选择 DOM 的特定部分v91) 上进行了测试,工作得很好!这是我对浏览器的体验(在 MDN 示例和我的应用程序上进行了测试,结果完全相同)
| 在哪里 | 在职的 |
|---|---|
| iPad 镀铬 | 是的 |
| 火狐浏览器 | 是的 |
| iPad 游猎 | 是的 |
| 窗口镀铬物 | 是的 |
| 火狐浏览器 | 不 |
| 安卓浏览器 | 是的 |
| 安卓 火狐 | 不 |
| 桌面 linux chrome | 不 |
| 桌面 linux 火狐 | 不 |
对我来说,这是一个仅限移动设备的功能(就像 Android 一样)。但看起来甚至一些桌面浏览器也在处理这个问题。我不得不承认,当我看到这个可以在 Windows 上运行时,我真的感到很惊讶。
这是 Google 发布的一篇有趣的文章,与此兼容性相关:https ://web.dev/web-share/#browser-support
再次阅读MDN,它说
Web Share API 的 navigator.share() 方法调用设备的本机共享机制。
所以,我猜测“(桌面)设备”大多不支持 Share API。
TLDR:这完全按预期工作,但到目前为止兼容性确实很差。