翻译:疯狂的技术宅css
原文:css-tricks.com/how-to-use-…前端
未经容许严禁转载git
Web Share API 自从它首次在Android 版 Chrome 61中推出以来,彷佛已经再也不受到关注。从本质上讲,它提供了一种方法,能够直接从网站或 Web 应用中共享内容(例如连接或联系人卡片)时触发设备(若是使用 Safari 桌面也能够)的本机共享对话框。github
虽然用户已经能够经过本地方式从网页共享内容,但他们必须在浏览器菜单中找到该选项,即便这样,也没法控制共享内容。此API的引入容许开发人员经过利用用户设备上的本机内容共享功能,将共享功能添加到 APP 或网站中。web
与传统方法相比,这种方法具备许多优势:前端工程化
在咱们深刻了解 API 的工做原理以前,先要解决浏览器支持问题。说实话,目前浏览器支持不是很好。它仅适用于 Android 版 Chrome 和 Safari(桌面版和iOS版)。api
下面的浏览器支持数据来自Caniuse,其中包含更多详细信息。数字表示浏览器支持该版本及以上版本的功能。promise
Chrome | Opera | Firefox | IE | Edge | Safari |
---|---|---|---|---|---|
No | No | No | No | No | 12.1 |
iOS Safari | Opera Mobile | Opera Mini | Android | Android Chrome | Android Firefox |
---|---|---|---|---|---|
12.2 | No | No | No | 74 | No |
可是不要让这些阻止你在本身的网站上使用此 API。正如你所看到的,在不支持的浏览器上很容易实现备用方案。浏览器
要在你本身的 Web 项目中使用这个 API ,有两件事须要注意:网络
click
事件)触发API。To demonstrate how to use this API, I’ve prepared a demo that works essentially the same as it does on my site. Here’s how it looks like:
为了演示如何使用这个 API,我准备了一个demo,它与个人网站上的工做方式基本相同。这是它的样子:
CodePen上的演示:codepen.io/ayoisaiah/p…
See the Pen WebShare API Demo - Start by Ayooluwa ( @ayoisaiah) on CodePen.此时,单击共享按钮后,会弹出一个对话框,显示一些共享内容的选项。如下是帮助咱们实现这一目标的代码部分:
shareButton.addEventListener('click', event => {
shareDialog.classList.add('is-open');
});
复制代码
让咱们在此示例转的基础上更改使用 Web Share API。首先要检查用户的浏览器是否支持该 API,以下所示:
if (navigator.share) {
// Web Share API is supported
} else {
// Fallback
}
复制代码
使用 Web Share API 就像调用 navigator.share()
方法同样简单,调用时须要传递包含如下至少一个字段的对象:
url
:表示要共享的 URL 的字符串。一般是页面的URL,但也不必定。你能够经过 Web Share API 共享任何URL。title
:表示要共享的标题的字符串,一般是 document.title
。text
:你要包含的任何文字。如下是实践中的表现:
shareButton.addEventListener('click', event => {
if (navigator.share) {
navigator.share({
title: 'WebShare API Demo',
url: 'https://codepen.io/ayoisaiah/pen/YbNazJ'
}).then(() => {
console.log('Thanks for sharing!');
})
.catch(console.error);
} else {
// fallback
}
});
复制代码
此时,一旦在支持的浏览器中单击了共享按钮,本机选择器将弹出用户可与之共享数据的全部可能目标。目标能够是社交媒体应用、电子邮件、即时消息、SMS或其余已注册的共享目标。
API 是基于 promise 的,所以你能够附加一个 .then()
方法,若是共享成功,可能会显示成功消息,并用 .catch()
进行错误处理。在实际场景中,你可能但愿使像如下代码段同样去获取页面的标题和 URL:
const title = document.title;
const url = document.querySelector('link[rel=canonical]') ? document.querySelector('link[rel=canonical]').href : document.location.href;
复制代码
对于 URL,咱们首先检查页面是否具备规范的 URL,若是是,则使用该 URL。不然从 document.location
中获取 href
。
在不支持Web Share API的浏览器中,咱们须要提供备用机制,以便这些浏览器上的用户仍然能够得到一些共享选项。
在咱们的例子中,有一个对话框,弹出一些共享内容的选项,演示中的按钮实际上并无连接到任何地方,由于它只是一个演示。可是若是你想了解如何创经过建本身的连接在没有第三方脚本的状况下共享网页,Adam Coti 的文章 为你提供了一个很好的思路。
咱们想要作的是在不支持 Web Share API 的状况下在浏览器上显示备用的对话框。这就像把打开共享对话框的代码移动到 else
块中同样简单:
shareButton.addEventListener('click', event => {
if (navigator.share) {
navigator.share({
title: 'WebShare API Demo',
url: 'https://codepen.io/ayoisaiah/pen/YbNazJ'
}).then(() => {
console.log('Thanks for sharing!');
})
.catch(console.error);
} else {
shareDialog.classList.add('is-open');
}
});
复制代码
如今,不管使用哪一种浏览器,均可以覆盖全部用户。如下是两个移动浏览器上共享按钮行为的比较,一个支持Web Share API,另外一个没有:
在 Android 设备上测试支持该功能的共享按钮。 按下共享按钮时会触发 Android 的本机共享选项。 第二个测试显示在不支持该功能的 Android 设备上单击了贡献按钮。 这会产生手动添加的后备共享选项。
到 CodePen 上分别使用支持和不支持 Web Share 的浏览器去尝试一下!(codepen.io/ayoisaiah/p…
See the Pen WebShare API Demo - End by Ayooluwa ( @ayoisaiah) on CodePen.本文几乎涵盖了有关 Web Share API 的全部内容。把它加到你的网站上,访问者能够更轻松地经过联系人或其余原生应用在更多的社交网络上共享你的内容。
值得注意的是,若是你的 Web 应用符合渐进式 Web 应用的安装条件 ,则能够将作为共享目标添加到用户的主屏幕上。这是Web Share Target API 的一项功能,你能够在Google Developers上阅读相关内容。
虽然支持的浏览器不少,但很容易实现后备方案,因此我认为没有理由不该该采用这种方式。若是你想了解有关此 API 的更多信息,能够阅读此处的规范。
你是否用过 Web Share API?请在评论中分享。
##欢迎关注前端公众号:前端先锋,获取前端工程化实用工具包。