在B站上看消息推送视频,大多都是阉割版的swoole、workman教程,在里面发现一个浏览器左上角询问是否显示通知的东西,顿时来了兴趣,今天搜索相关信息,最终实现了并看到了效果。效果如下:
代码:
<script> ; (function (window) { 'use strict'; var open_notify = localStorage.getItem('notify_switch'); console.log(open_notify); if (open_notify === 'true' || open_notify === null) { $('#notify_switch').removeClass('is_off').addClass('is_open'); } if (open_notify === null) { localStorage.setItem('notify_switch', 'true'); } function Notify() {} window.Notify = Notify; var inter = null; //设置参数; var options = { noticeList: [], //通知存储数组 notification: null, //通知对象 title: '', body: '', data: { url: 'https://meet.leimingyang.cn/' }, icon: '/merchant/resources/img/default-50x50.gif', content: "通知...", time: 1000 }; Notify.showNotice = function (title, body, icon, data) { if (!("Notification" in window)) { alert("抱歉,您的浏览器不支持桌面通知"); } else if (Notification.permission === "granted") { options.notification = new Notification(title ? title : options.title, { body: body ? body : options.body, icon: icon ? icon : options.icon, // requireInteraction: true, data: data }); options.noticeList.push(options.notification); } else if (Notification.permission !== "denied") { Notification.requestPermission(function (permission) { if (permission === "granted") { options.notification = new Notification(title ? title : options.title, { body: body ? body : options.body, icon: icon ? icon : options.icon, // requireInteraction: true, data: data }); options.noticeList.push(options.notification); } }); } }; //单击通知 Notify.clickNotice = function () { if (options.notification != null) { options.notification.onclick = function () { window.open(options.notification.data.url, '_blank'); Notify.clearNotice(); }; } }; //清除通知 Notify.clearNotice = function () { // options.notification.close(); options.noticeList[options.noticeList.length - 1].close(); options.noticeList.pop(); }; //清除所有通知 Notify.clearAllNotice = function () { for (var i = 0; i < options.noticeList.length; i++) { options.noticeList[i].close(); } }; //自动关闭 Notify.autoClose = function (time) { if (options.notification != null) { time == null ? setTimeout(options.notification.close.bind(options.notification), options.time) : setTimeout(options.notification.close.bind(options.notification), time); } }; //打开页面询问用户是否打开浏览器推送 Notify.isNotice = function () { if (window.Notification) { // 支持 console.log('yes'); } else { console.log('no'); // 不支持 } console.log(Notification.permission); Notification.requestPermission(function (permission) { console.log(permission) if (permission === "granted") { polling(); console.log(permission) return; //如果开启则开始轮询推送 } else if (permission === "denied") { console.log(permission) //如果用户选择关闭则关闭轮询 } }); }; function polling() { var open_notify_r = localStorage.getItem('notify_switch'); console.log(open_notify_r) if (open_notify_r != 'true') { console.log(open_notify_r) return; } inter = setInterval(function () { $.ajax({ url: "/api/v1/site/notice-msg", dataType: "json", success: function (res) { if (res.code === 200) { var data = res.data for (var i = data.length - 1; i >= 0; i--) { (function (item) { Notify.showNotice(item.title, item.content, item.icon, item); Notify.clickNotice(); Notify.autoClose(20000); })(data[i]) } } // Notify.clearNotice(); // Notify.clearAllNotice(); } }); }, 60000); } Notify.isNotice(); $('#notify_switch').click(function () { if ($(this).hasClass('is_open')) { $(this).removeClass('is_open').addClass('is_off'); localStorage.setItem('notify_switch', 'false'); clearInterval(inter); } else { $(this).removeClass('is_off').addClass('is_open'); localStorage.setItem('notify_switch', 'true'); clearInterval(inter); Notify.isNotice(); } }) })(window); </script>
注释比较详细,demo地址:https://meet.leimingyang.cn/
发表回复