|
Notification是HTML5新增的API,用于向用户配置和显示桌面通知。上次在别的网站上看到别人的通知弹窗,好奇之余也想知道如何实现的。实际去查一下发现并不复杂,且可以说比较简单,故写篇博客分享给大家,希望能帮你们了解这个API。
npm包:
我还发了一个npm包:notification-Koro1,非常轻量简洁,觉得不错的话,点个Star吧~
chrome下Notification的表现:
以谷歌为例,一开始需要用户允许通知:
允许通知之后,显示的通知长这样:
Notification特性
该通知是脱离浏览器的,即使用户没有停留在当前标签页,甚至最小化了浏览器,也会在主屏幕的右上角显示通知,然后在一段时间后消失。
我们可以监听通知的显示,点击,关闭等事件,比如点击通知打开一个页面。
栗子:去各个网站里面的控制台去运行
API的具体细节,等下再说,先试试这个API~
下面是一个简单的栗子,大家可以先在各个网站的控制台里面运行查看Notification的效果:
- var options = {
- dir: "auto", // 文字方向
- body: "通知:OBKoro1评论了你的朋友圈", // 通知主体
- requireInteraction: true, // 不自动关闭通知
- // 通知图标
- icon: "https://upload-images.jianshu.io/upload_images/5245297-818e624b75271127.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"
- };
- notifyMe('这是通知的标题', options);
- function notifyMe(title, options) {
- // 先检查浏览器是否支持
- if (!window.Notification) {
- console.log('浏览器不支持通知');
- } else {
- // 检查用户曾经是否同意接受通知
- if (Notification.permission === 'granted') {
- var notification = new Notification(title, options); // 显示通知
- } else if (Notification.permission === 'default') {
- // 用户还未选择,可以询问用户是否同意发送通知
- Notification.requestPermission().then(permission => {
- if (permission === 'granted') {
- console.log('用户同意授权');
- var notification = new Notification(title, options); // 显示通知
- } else if (permission === 'default') {
- console.warn('用户关闭授权 未刷新页面之前 可以再次请求授权');
- } else {
- // denied
- console.log('用户拒绝授权 不能显示通知');
- }
- });
- } else {
- // denied 用户拒绝
- console.log('用户曾经拒绝显示通知');
- }
- }
- }
复制代码
浏览器支持:
MDN:目前Notification除了IE浏览器不支持外, 其他浏览器都已支持桌面通知,移动端浏览器基本都未支持。
因为兼容性问题,所以在使用Notification之前,我们需要查看浏览器是否支持Notification这个API:
- if(window.Notification){
- // 桌面通知的逻辑
- }
复制代码
通知权限:
为了避免网站滥用通知扰民,在向用户显示通知之前,需要经过用户同意。
Notification.permission 用于表明当前通知显示的授权状态,它有三个值:
default: 默认值,用户还未选择
granted: 用户允许该网站发送通知
denied: 用户拒绝该网站发送通知
检测权限:
检测浏览器是否支持Notification之后,需要检测一下用户通知权限。
- if (Notification.permission === 'granted') {
- console.log('用户曾经同意授权');
- // 随时可以显示通知
- } else if (Notification.permission === 'default') {
- console.log('用户还未选择同意/拒绝');
- // 下一步请求用户授权
- } else {
- console.log('用户曾经拒绝授权 不能显示通知');
- }
复制代码
请求权限
当Notification.permission为default的时候,我们需要使用Notification.requestPermission()来请求用户权限。
Notification.requestPermission()基于promise语法,then的回调函数参数是用户权限的状态Notification.permission的值。
- Notification.requestPermission().then(permission => {
- if (permission === 'granted') {
- console.log('用户同意授权');
- // 随时可以显示通知
- } else if (permission === 'default') {
- console.log('用户关闭授权 可以再次请求授权');
- } else {
- console.log('用户拒绝授权 不能显示通知');
- }
- });
- // 老版本使用的是回调函数机制:Notification.requestPermission(callback); 参数一样
复制代码
|
获得 大穷神卡 一张
卡片说明:曲奇饼 被 [残忍的蓝焰] 附体!失去了 46 泰拉.
卡片效果:损失 46 泰拉
|