在不少場景下,須要一種通知的交互方式來提醒用戶,傳統方式下能夠在頁面實現一個 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