API的具体细节,等下再说,先试试这个API~
下面是一个简单的栗子,大家可以先在各个网站的控制台里面运行查看Notification的效果:
因为兼容性问题,所以在使用Notification之前,我们需要查看浏览器是否支持Notification这个API:
if(window.Notification){//桌面通知的逻辑}通知权限:为了避免网站滥用通知扰民,在向用户显示通知之前,需要经过用户同意。
检测浏览器是否支持Notification之后,需要检测一下用户通知权限。
Notification.requestPermission()基于promise语法,then的回调函数参数是用户权限的状态Notification.permission的值。
constoptions={};//传空配置consttitle='这里是标题';constnotification=newNotification(title,options)//显示通知上面这段代码就可以显示一个简单的通知了,只要用户允许你弹窗。
requireInteraction:保持通知不自动关闭
默认值为false,通知会在三四秒之后自动关闭。
当设置为true,并且当有超过两个通知(newNotification(title,options))时,会出现如下图的通知叠加状态。
这种情况显然,我们只能默认操作最后一个通知,除非你把每个通知返回的实例都保存下来。
PS:如果没有触发叠加,很可能是因为你两次通知的tag配置项是相同的(相同tag只能出现一个弹窗)。
PS:safari下不支持该选项,默认自动关闭
renotify:相同
默认值为false,chorme下相同tag的通知不替换,还是老的通知
设置为true,两个相同tag的通知,新通知替换之前旧的通知。
注意:使用renotify,必须要同时设置tag选项,否则将会报错。
PS:safari下不支持该选项,默认两个相同tag的通知,新通知替换之前旧的通知。
生成通知,会返回一个实例,如下:
constinstanceNotification=newNotification(title,options)instanceNotification就是当前通知的实例,在该实例上,我们可以查询该通知的配置,监听事件,调用实例方法。
下文都以instanceNotification指代通知返回的实例。
在通知实例上可以读取到设置通知时的所有配置,比如:
通知标题:instanceNotification.title、通知内容:instanceNotification.body、通知图标:instanceNotification.icon等。
PS:这些属性都是只读的,不能删除,不能修改,不能遍历。
我们可以使用通知的实例来监听通知的事件:
instanceNotification.onclick=e=>{//dosomething可以是:打开网址,发请求,关闭通知等}注意:最好是一发出通知就立即监听事件,否则有些事件可能一开始没被触发或永远不会触发。
例如:用定时器5秒后才监听通知的点击和显示事件,则永远不会触发通知显示的回调,点击事件在5秒后才可以正常起作用但会错误五秒之前用户的点击。
instanceNotification.close()没有设置不自动关闭的话,chrome通知将会在4.5秒左右自动关闭通知,safari则是5秒钟(无法设置不自动关闭)。
notification没有定时控制通知多久后消失的功能,当出现多个通知,也无法统一关闭。
这里是一些API/浏览器细节,以及可能会遇到的问题,可以先不看,等真正遇到了,回头再来看。
chrome浏览器的通知设置位置:设置>高级>内容设置>通知
saafari浏览器:偏好设置>网站>通知>找到网站>修改权限/恢复默认
在chorme浏览器中:当用户关闭请求权限的弹窗(右上角的叉叉),页面还没刷新,我们可以再次向用户请求权限。页面刷新过后,浏览器默认用户拒绝。
在safari浏览器下,没有关闭请求权限的选项,用户必须选择同意/拒绝。
可能是网站进行了同源限制(比如github),不是域名下面的图片,会报错,不能调用。
在safari下面,同一个网站(比如谷歌),同样的代码,chorme可以正常显示icon,safari却没有icon,也没有报错。
这个表现,通知没有icon、标题、内容,就显得没有意义了,浏览器以这种形式,限制开发者不要频繁打扰用户。
本文写的比较细,可以先mark一下,然后以后真正用到这个API了,可以先通过文中的栗子,然后再查找对应的内容。
还有就是注意浏览器间的差异,我自己就试了chrome和safari,然后这两个浏览器在实现细节上有很多不一样的地方,开发的时候注意一下。