在不少场景下,须要一种通知的交互方式来提醒用户,传统方式下能够在页面实现一个 Dialog,或经过修改网页的 title 来实现消息的通知。然而传统的实现存在着必定的不足,在网页最小化的状况下,没法查看任何通知,致使用户没法及时获取通知信息。html
给力的 W3C 推出了 Notifications API,专一于 WEB 的通知。数组
Notifications API 的 Notification 界面用于配置和显示用户的桌面通知。 这些通知的外观和特定功能因平台而异,但一般它们提供了一种向用户异步提供信息的方法。浏览器
此 API 在 WebWorker 环境下也可使用。 注意:此 API 必须运行在 https 环境下,非 https 环境没法受权。bash
流程:异步
语法:函数
var myNotification = new Notification(title, options);
复制代码
参数:ui
event.action
来获取)
event.currentTarget.data
来获取。静态属性:spa
Notification.permission
,获取当前用户对通知的权限。值:
实例属性:(含义同构造器中的 option).net
点击显示通知框时触发的事件。3d
Notification.onclick = function(event) { ... };
复制代码
能够经过 preventDefault()
阻止焦点显示到 notification 打开的 tab 上。 经过 event.currentTarget
来获取属性。
通知关闭时,触发此事件。 必须调用 Notification.close()
才能触发此事件。
Notification.onclose = function() { ... };
复制代码
用做错误事件的事件处理程序。发生错误时,将调用指定的函数。若是为null,则没有错误处理程序生效。
Notification.onerror = EventListener;
复制代码
通知出现的时候,触发此事件。
Notification.onshow = function() { ... };
复制代码
静态方法:
Notification.permission
。当前 permission 为 default 时,出现受权通知:
注意:在 PC 中,当出现受权通知时,若是不作任何选择,而是点击右上角的关闭x,连续三次这种操做后,系统会自动设置为 denied。
当前 permission 为 granted 时,直接返回 Promise,执行 then 后的代码。后续不须要在申请权限。
当前 permission 为 denied 时,直接返回 Promise,执行 catch 后面的代码。后续一直是拒绝状态,再也不弹出受权框。此时 serviceWorker pushManager 不可用,订阅会抛出错误。此状态下,只能经过用户本身去修改权限。
实例方法:
Notification.requestPermission().then(() => {
var n = new Notification('天气预报', {
body: '今每天气晴朗,详情请点击~',
icon: 'https://img.alicdn.com/tfs/TB1XPvwUVzqK1RjSZFvXXcB7VXa-1024-1024.png',
requireInteraction: true,
data: {
nav: 'https://baidu.com'
}
});
n.onclick = event => {
n.close();
if(event.currentTarget.data.nav) {
window.open(event.currentTarget.data.nav);
}
};
}).catch(() => {
alert('通知权限已禁止,请设置打开权限');
})
复制代码
actions 必须在 serviceWorker 中使用。
navigator.serviceWorker.ready.then(swReg => {
Notification.requestPermission().then(() => {
swReg.showNotification('好友请求', {
body: '美女向你打招呼~',
icon: 'https://img.alicdn.com/tfs/TB1qyPtU3HqK1RjSZFEXXcGMXXa-640-859.png',
requireInteraction: true,
actions: [{
action: 'yes',
title: '加好友',
}, {
action: 'no',
title: '拒绝'
}]
});
})
})
复制代码
sw 环境处理代码:
self.addEventListener("notificationclick", function(event) {
console.log("notificationclick", event);
event.notification.close();
if(event.action == 'yes') {
// ***
} else if(event.action == 'no') {
// xxx
}
});
复制代码
博客名称:王乐平博客
CSDN博客地址:blog.csdn.net/lecepin