H5 Notification提醒


有时访问一些网站,我们虽然离开这个页面了,但有时桌面右上角会弹出一个信息提醒框,这个就是H5的Notification桌面通知功能。


正文

有时访问一些网站,我们虽然离开这个页面了,但有时桌面右上角会弹出一个信息提醒框,这个就是H5的Notification桌面通知功能。

代码示例:

var notification = new Notification(
    "工单新信息",
    {
        body: "您有1条工单信息,快去查看吧",
        dir: "auto",
        lang: "zh-CN",
        tag: "WoDealNotice",
        icon:'/images/icon.jpg',
        requireInteraction: true,
        renotify: false
    }
);
// 点击事件监听
notification.onclick = function () {
    window.focus();
    notification.close();
    $(".notification-box").trigger("click");
};
// 监听显示事件
notification.onshow = function () { 
    console.log('onshow'); 
};
// 监听错误事件
notification.onerror = function () { 
    console.log('onerror'); 
};
// 监听关闭事件
notification.onclose = function () { 
    console.log('onclose'); 
};

// 如果提示不可用的补充功能
if (window.Notification && window.Notification.permission !== 'granted') {
    $(".notification-box").show();
}

解读语法:

let myNotification = new Notification(title, options);

title 定义一个通知的标题,当它被触发时,它将显示在通知窗口的顶部。

options 可选 options对象包含应用于通知的任何自定义设置选项。选项有:

dir: 显示通知的方向。默认是auto,跟随浏览器语言设置行为,你也可以通过设置ltr和rtl的值来覆盖该行为(虽然大多数浏览器似乎忽略这些设置)
lang: 通知的语言,如使用代表一个BCP 47语言标签的  DOMString 指定的。请参阅Sitepoint ISO 2字母语言代码页面,以获得简单的参考。
badge: 一个 USVString 包含用于表示通知的图像的URL, 当没有足够的空间来显示通知本身时。
body: 一个 DOMString 表示通知的正文,将显示在标题下方。
tag:  一个 DOMString 代表通知的 一个识别标签。
icon:  一个 USVString 包含要在通知中显示的图标的URL。
image: 一个 USVSTring包含要在通知中显示的图像的URL。
data: 您想要与通知相关联的任意数据。这可以是任何数据类型。
vibrate: 一个振动模式 vibration pattern 设备的振动硬件在通知触发时发出。
renotify: 一个 Boolean 指定在新通知替换旧通知后是否应通知用户。默认值为false,这意味着它们不会被通知。
requireInteraction: 表示通知应保持有效,直到用户点击或关闭它,而不是自动关闭。默认值为false。

以下选项列在最新规范中,浏览器中暂不支持:

silent: 一个 Boolean 指明通知是否应该是无声的,即,不需要发出声音或振动,无论设备设置如何。默认值为false,这意味着它不会保持静默。
sound:一个 USVString 包含通知触发时要播放的音频文件的URL。
noscreen: 一个 Boolean 指定通知触发是否应启用设备的屏幕。 默认值为false,这意味着它将启用屏幕。
sticky: 一个 Boolean 指明通知是否应该是“粘”, 即不易被用户清理。默认值为false,这意味着它不会粘。

上面的示例只有在浏览器给当前站点给了通知权限时,才会有桌面通知,如果是默认授权是弹不出的,我们需要询问授权,看一下下面的用法:

Notification.requestPermission(function (permission) {
    if (permission === "granted") {
        var notification = new Notification(
            "工单新信息",{
                body: "您有1条工单信息,快去查看吧",
                dir: "auto",
                lang: "zh-CN",
                tag: "WoDealNotice",
                icon:'/images/icon.jpg',
                requireInteraction: true,
                renotify: false
            });
        // 点击事件监听
        notification.onclick = function () {
            window.focus();
            notification.close();
            $(".notification-box").trigger("click");
        };
        // 监听显示事件
        notification.onshow = function () { console.log('onshow'); };
        // 监听错误事件
        notification.onerror = function () { console.log('onerror'); };
        // 监听关闭事件
        notification.onclose = function () { console.log('onclose'); };
    } else {
        $(".notification-box").show();
    }
});

Notification 接口的 requestPermission() 方法请求用户当前来源的权限以显示通知。

封装示例

notify.js:

export default class notify{
    constructor(options) {
        this.options = options;
        this.timer = null;
        this.scrollTitle = '';
        this.notify = null;
    }
    //notify通知提示
    requestPermission(){
        if (window.Notification && window.Notification.permission !== 'granted') {
            window.Notification.requestPermission();
        }
    }
    // 是否启用notify通知
    isPermission() {
        return window.Notification && Notification.permission === 'granted';
    }
    // 发送通知
    notifyMessage(){ 
        let title = this.options.title ? this.options.title : '';
        let notification = this.options.notification ? this.options.notification : {};
        let onclick = this.options.onclick ? this.options.onclick : null;
        if(window.Notification){
            this.notify = new Notification(title,notification);
            // this.notifyTitle();
            this.notify.onclick = ()=>{
                onclick && typeof onclick === 'function' && onclick(this.notify);
            }
            this.notify.onshow = ()=>{
                this.options.onshow && typeof this.options.onshow === 'function' && this.options.onshow(this.notify);
            }
            this.notify.onclose = ()=>{
                this.options.onclose && typeof this.options.onclose === 'function' && this.options.onclose(this.notify);
            }
            this.notify.onerror = ()=>{
                this.options.onerror && typeof this.options.onerror === 'function' && this.options.onerror(this.notify);
            }
        }
    }
    // title通知提示
    notifyTitle(){
        console.log(this.options.messageNum,'this.options.messageNum');
        let messageNum = this.options.messageNum ? this.options.messageNum : 0;
        let title = this.options.tabTitle || document.title;
        let intervalNum = this.options.intervalNum ? this.options.intervalNum : 1000;
        this.clearTimer();
        this.timer = setInterval(()=>{
            if(messageNum){
                if(this.options.effect === 'flash'){
                    document.title = this.options.tabTitle === document.title ? `TMS(${this.options.messageNum})` : this.options.tabTitle;
                }else if(this.options.effect === 'scroll'){
                    if (!this.scrollTitle || !this.scrollTitle.slice(1)) {
                        document.title = title;
                        this.scrollTitle = title;
                    } else {
                        this.scrollTitle = this.scrollTitle.slice(1);
                        document.title = this.scrollTitle;
                    }
                }
            }
        },intervalNum);
    }
    closeNotify() {
        this.notify.close();
    };
    // 清除计时器
    clearTimer(){
        this.timer && clearInterval(this.timer);
        this.scrollTitle = '';
        this.notify.close();
        // document.title = this.options.tabTitle;
    }
}

调用:

this[typeMap[type]["dataWrapper"]] = new notify(
    {
        messageNum: this.totalNumber,
        title: `${typeMap[type]['des']}新信息`,
        effect: "flash",
        tabTitle: "管理系统",
        notification: {
            body: `您有${val[typeMap[type]["info"]]}条${typeMap[type]['des']}消息,快去查看吧`,
            tag: type,
            icon: "/static/assets/images/icon_logo.png",
            requireInteraction: true,
            renotify: false
        }
    },
    onclick:()=>{
        window.focus();
        notify.close();
        this.titleNotify.clearTimer();
        if (type == 1) {
            this.$refs.chatWindow.show();
        } else {
            this.goNewOrder();
        }
    }
);
this[typeMap[type]["dataWrapper"]].notifyMessage();






参考资料

Web 开发技术请参见 Web API 接口参考请参见 notificationNotification.Notification() https://developer.mozilla.org/zh-CN/docs/Web/API/Notification/Notification

Web 开发技术请参见 Web API 接口参考请参见 notificationNotification.requestPermission() https://developer.mozilla.org/zh-CN/docs/Web/API/notification/requestPermission

H5 Notification桌面推送消息 https://blog.csdn.net/CodingNoob/article/details/81090779

H5的Notification特性 - Web的桌面通知功能 https://segmentfault.com/a/1190000012127653

Notification 桌面通知 https://www.jianshu.com/p/22c408dcf2f7


返回