H5 notification浏览器桌面通知
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); 参数一样
复制代码
推送通知
当Notification.permission
为granted
时,请求到用户权限之后,不必立即发送通知,可以在任意时刻,以任意形式来发送通知。
const options = {}; // 传空配置
const title = '这里是标题';
const notification = new Notification(title, options) // 显示通知
复制代码
上面这段代码就可以显示一个简单的通知了,只要用户允许你弹窗。
Notification
的参数:
- title:通知的标题
- options:通知的设置选项(可选)。
requireInteraction: 保持通知不自动关闭
默认值为false,通知会在三四秒之后自动关闭。
当设置为true
,并且当有超过两个通知(new Notification(title, options)
)时,会出现如下图的通知叠加状态。
这种情况显然,我们只能默认操作最后一个通知,除非你把每个通知返回的实例都保存下来。
我发布的npm包:notification-koro1,可以自定义一定的时间间隔自动关闭不自动关闭的通知,也可以一次性关闭所有通知
PS:如果没有触发叠加,很可能是因为你两次通知的tag配置项是相同的(相同tag只能出现一个弹窗)。
PS: safari下不支持该选项,默认自动关闭
renotify:相同
默认值为false,chorme下相同tag的通知不替换,还是老的通知
设置为true
, 两个相同tag的通知,新通知替换之前旧的通知。
注意:使用renotify
,必须要同时设置tag
选项,否则将会报错。
PS: safari下不支持该选项,默认两个相同tag的通知,新通知替换之前旧的通知。
Notification
的实例:
生成通知,会返回一个实例,如下:
const instanceNotification = new Notification(title, options)
复制代码
instanceNotification
就是当前通知的实例,在该实例上,我们可以查询该通知的配置,监听事件,调用实例方法。
下文都以instanceNotification
指代通知返回的实例。
通知的配置:
在通知实例上可以读取到设置通知时的所有配置,比如:
通知标题:instanceNotification. title
、通知内容:instanceNotification. body
、通知图标:instanceNotification. icon
等。
PS: 这些属性都是只读的,不能删除,不能修改,不能遍历。
事件处理:
我们可以使用通知的实例来监听通知的事件:
click
: 用户点击通知时被触发show
: 通知显示的时候被触发error
: 通知遇到错误时被触发close
: 用户关闭通知时被触发
instanceNotification.onclick = e => {
// do something 可以是:打开网址,发请求,关闭通知等
}
复制代码
注意:最好是一发出通知就立即监听事件,否则有些事件可能一开始没被触发或永远不会触发。
例如:用定时器5秒后才监听通知的点击和显示事件,则永远不会触发通知显示的回调,点击事件在5秒后才可以正常起作用但会错误五秒之前用户的点击。
关闭通知
instanceNotification.close()
复制代码
没有设置不自动关闭的话,chrome通知将会在4.5秒左右自动关闭通知,safari则是5秒钟(无法设置不自动关闭)。
notification没有定时控制通知多久后消失的功能,当出现多个通知,也无法统一关闭。
这两个问题,在我发布的NPM包:notification-koro1中,都解决掉了,并提供更清晰的回调
应用场景
- 即时通讯软件(邮件、聊天室)
- 体育赛事结果彩票/抽奖结果
- 新闻网站重大新闻通知
- 网站的重大更新,重大新闻等。
notification其他
这里是一些API/浏览器细节,以及可能会遇到的问题,可以先不看,等真正遇到了,回头再来看。
用户拒绝显示通知:
一旦用户禁止网站显示通知,网站就不能再请求用户授权显示通知,需要用户去设置中更改。
chrome浏览器的通知设置位置:设置>高级>内容设置>通知
saafari浏览器:偏好设置>网站>通知>找到网站>修改权限/恢复默认
关闭请求权限:
在chorme浏览器中:当用户关闭请求权限的弹窗(右上角的叉叉),页面还没刷新,我们可以再次向用户请求权限。页面刷新过后,浏览器默认用户拒绝。
在safari浏览器下,没有关闭请求权限的选项,用户必须选择同意/拒绝。
icon不显示问题:
可能是网站进行了同源限制(比如github),不是域名下面的图片,会报错,不能调用。
tag:
tag
相同的通知,同时只能出现一个,老通知是否会被覆盖取决于:renotify
配置和浏览器。- chrome下:当通知关闭之后,上次出现过的tag在一段时间内,不能再出现,比如刷新页面再请求相同tag的通知。(在safari下正常出现)
safari下面不能显示icon
在safari下面,同一个网站(比如谷歌),同样的代码,chorme可以正常显示icon,safari却没有icon,也没有报错。
谷歌之后发现,在stack overflow里面看到safari只支持body和tag选项,并不支持icon选项。
连续触发
在safari和chrome下短时间内连续触发通知(不设tag
,不设requireInteraction
),会出现如下表现:
这个表现,通知没有icon、标题、内容,就显得没有意义了,浏览器以这种形式,限制开发者不要频繁打扰用户。
notification-Koro1:
试一下notification-Koro1啦, 持续维护,简单方便~
结语
本文写的比较细,可以先mark一下,然后以后真正用到这个API了,可以先通过文中的栗子,然后再查找对应的内容。
还有就是注意浏览器间的差异,我自己就试了chrome和safari,然后这两个浏览器在实现细节上有很多不一样的地方,开发的时候注意一下。
希望看完的朋友可以点个喜欢/关注,您的支持是对我最大的鼓励。
以上2019.02.17
参考资料:
作者:OBKoro1
链接:https://juejin.im/post/5c6df433f265da2de80f5eda
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
H5 notification浏览器桌面通知的更多相关文章
- 浏览器桌面通知--Notification
前言 最近项目上要用到浏览器桌面通知,之前虽然知道有这个东西,但是一直没有用过,借此机会了解下桌面通知的机制,在此分享下. 1.权限 首先需要明确的是,不是所有网页都可以发桌面通知的,不然不得烦死,那 ...
- 浏览器桌面通知Notification探究
首先说明,这篇博文不是科普讲解的,而是立flag研究的,是关于浏览器消息自动推送,就是下面这个玩意: 最近常常在浏览器看到这样的消息推送,还有QQ.com的推送,现在我对这个不了解,不知道叫消息自动推 ...
- 浏览器桌面通知Notification实践
一言不合就上图: 最近常常在浏览器看到这样的消息推送,还有QQ.com的推送,现在我对这个不了解,不知道叫消息自动推送对不对,这个时chrome浏览器的截图,出现在右下角,其他浏览器的样式可能有些微差 ...
- 浏览器桌面通知(notifications)
近期在做公司后台管理系统,当有任务到来时,须要通知当事人,可是 当事人有可能在做别的,浏览器有可能会被最小化,这样就非常难看到通知了.经过查找发现有些浏览器能够使用noitfications.能够在桌 ...
- HTML5开启浏览器桌面通知 Web Notification
说明: 1.Chrome要求必须https才可以开启浏览器通知 2.显示图片在本服务器,不支持跨越 3.自定义声音Chrome不播放,Firefox正常播放 代码如下: <!-- /** * @ ...
- Chrome浏览器桌面通知提示设置
版本 24.0.1312.56 m 老版本23.* 桌面通知,也可以由用户在Chrome浏览器中自定义:板手 -> 选项 -> 高级选项 –> 通知 (管理例外情况…).
- 用于浏览器桌面通知的Web API 接口 -notification
notification 接口用于浏览器向用户提供通知内容:常见的如网页版的微信: 1.实现,需要Notifications API 提供的通知接口: 用法: let notification = n ...
- Chrome浏览器桌面通知提示功能使用
http://www.cnblogs.com/meteoric_cry/archive/2012/03/31/2426256.html
- h5桌面通知Notification
H5中的桌面通知Notification 前言: 对于一个前端开发者,逛网页总会留意一些新奇的功能,对于上班总会用到Teambition的我,总是能收到Notification...所以今天就来研究下 ...
随机推荐
- loadrunner11 下载路径+安装+破解+汉化
下载地址:http://pan.baidu.com/s/1eQs1Ynw 1.解压安装包 2.运行“setup.exe”,点击“LoadRunner完整安装程序”开始安装,另外此安装包有许多附带组件, ...
- AX_CreateAndPostPurch
static void CreateAndPostPurch(Args _args) { List il = new List(Types::Record); DocumentNum Document ...
- 【翻译】Flume 1.8.0 User Guide(用户指南) Sink
翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...
- redis学习-string常用命令
keys * :查询所有的key值 set:为指定键设置对应的值 get:获取指定键的值 mset:一次传入多个键值对 mget:一次获取多个键的值 del:删除指定键 strlen:获取指定键值的长 ...
- require() module.export Object.keys()
import API from"../../api/api.js"; var data = require('../../utils/data.js').songs; // ...
- VUE项目 npm run build卡住不动,也不报错
npm config set registry http://registry.cnpmjs.org try again npm run build 居然能动了....
- Python3.* 和Python2.*的区别
许多Python初学者都会问:我应该学习哪个版本的Python.对于这个问题,我的回答通常是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本.等学得差不多了,再 ...
- 用js实现贪吃蛇
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 大数据之hiveSQL
最近增加了学习java基础算法,包括几种排序算法,二叉树(前序,后序,中序),队列和栈,bmp搜索,广义搜索算法,迭代等等一些技巧(自己动手绝对比单纯的理论要强的多,多练练) HIVE是hadoop生 ...
- kafka中zookeeper的操作
bin/zookeeper-shell.sh localhost:2181 <<< "get /brokers/ids/4" ./zkCli.sh -server ...