HTML5学习笔记(一):桌面提醒
HTML5中的桌面提醒(web notifications)能够让用户得到实时的消息提醒,在网页多窗口聊天的时候,这一功能将极大的方便用户。例如新浪微博私信聊天时候的消息提醒功能。这里只考虑浏览器原生的功能,对于那些通过插件来实现的桌面提醒功能不做考虑(如360安全浏览器)。但是这一功能目前只有google chrome(21.0+)和Safari(6.0+)部分实现了,在手机端,也就Blackberry browser实现了(完全实现),实现这一功能的浏览器均以webkit为内核。应用的范围还很有限,在HTML5如火如荼的今天,我们依然可以做个很好的展望。
API介绍
桌面提醒功能是由window对象下的webkitNotifications来实现的,通过window.webkitNotifications将返回一个NotificationCenter对象。这个对象没有属性,但是却关联着四个方法:
1.requestPermission()
这个方法用于向用户请求获得消息提醒的权限,调用这个方法将产生如下效果(下图),分别对应着3中状态:“granted”(状态值:0)表示用户同意消息提醒;“default”(状态值:1)表示默认状态,用户既未拒绝,也未同意;“denied”(状态值:1)表示用户拒绝消息提醒。只有在状态值为0的时候才能够允许消息提醒,这个值保存在一个内部变量中,并且是只读的,通过checkPermission()方法可以提取到这个状态值。
2.checkPermission()
这个方法用于获取请求权限的状态值,并返回这个值。
3.createNotification()
这个方法以纯消息的方式创建提醒消息,它接受三个参数:iconURL, title, body。这三个参数均为字符串格式,iconURL表示一个图标地址、title表示消息标题、body表示消息主体,默认这三个参数为空字符串。
调用这个方法会返回一个Notification对象,我们可以针对这个对象做更多的设置。
属性:
dir:设置消息的排列方向,可取值为“auto”(自动), “ltr”(left to right), “rtl”(right to left),下图展示的是不同取值的显示效果。
tag:为消息添加标签。如果设置此属性,当有新消息提醒时,标签相同的消息,后一个消息框会替换先前一个,不会出现多重消息提示框。
onshow:事件属性,当消息框显示的时候触发该事件;
onclick:事件属性,当点击消息框的时候触发该事件;
onclose:事件属性,当消息关闭的时候触发该事件;
onerror:事件属性,当出现错误的时候触发该事件;(TODO:错误类型)
方法:
addEventListener && removeEventListener:常规的添加和移除事件方法;
show:显示消息提醒框;
close:关闭消息提醒框;
cancel:关闭消息提醒框(这个方法和close方法产生的效果是一样,不清楚他们之间有什么深层次的区别);
dispatchEvent:关于这个方法可以参考这里;
4.createHTMLNotification()
这个方法以HTML方式创建消息提醒,它接受一个参数,即HTML消息文档的URL。同样调用这个方法也会返回一个Notification对象,这个对象与用纯文本方式创建消息提醒返回的Notification对象相同,故对其属性和方法就不重述了。
实例
下面要创建一个桌面提醒的实例,真是的感受下这个一新功能。
1、由于支持桌面的浏览器还很有限,在使用这一功能前不可避免的要进行检测是否支持。
1 function supported(){ 2 if(window.webkitNotifications){ 3 return true; 4 } else{ 5 return false; 6 } 7 }
这是一个简单的功能检测,如果浏览器支持就返回true,否则返回false。
2、如果浏览器支持桌面提醒功能,接下来就是请求用户权限
1 function requestPermission(){ 2 if(supported){ 3 window.webkitNotifications.requestPermission(); 4 statue = window.webkitNotifications.checkPermission(); 5 } 6 }
通过requestPermission()方法来请求用户权限,并且使用checkPermission()方法来检查状态值,这个值存储在一个全局变量statue中。
3、检查statue值,根据不同的状态值,采取相应的行为。
1 function checkStatue(){ 2 switch (statue){ 3 case 0: // granted 4 message(); 5 break; 6 case 1: // default 7 requestPermission(); 8 break; 9 case 2: // denied 10 return; 11 } 12 }
当用户同意进行消息提醒的时候,即状态值为0,执行message()方法,这个方法创建一个消息框并显示。如果状态值为1,即用户并没有对权限请求作出反应,将会再次请求一次。如果用户拒绝了,即状态值为2,结束这次进程。
4、创建消息提醒框
NotificatonCenter对象提供了两种创建消息框的方法,即createNotification和createHTMLNotification,前者以纯文本的方式创建桌面提醒消息,后者以HTML方式创建桌面提醒消息。关于这两种方法的使用前面已经介绍了。
4.1、使用createNotification方法创建桌面提醒
1 function message(){ 2 var icon = "../IMAGE/mediaICON/pause.png"; //如果直接拷贝,这个地方URL路径可能会报错! 3 var title = "hupeng"; 4 var body = "Hello World"; 5 var msgObj = window.webkitNotifications.createNotification(icon, title, body); 6 msgObj.show(); 7 }
下图是运行效果
4.2、使用createHTMLNotification方法创建桌面提醒
1 function message(){ 2 var msgObj = window.webkitNotifications.createHTMLNotification("HTMLNotification.html"); 3 msgObj.show(); 4 }
这个方法需要提前定义一个HTML文件,下图是运行效果
4.3、设置桌面提醒框的属性
可以设置“dir”属性来控制文字的显示方式(注意:如果用createHTMLNotification方法来创建消息提醒框,该属性无效,文字的样式以定义的HTML文件为准),可以为来源相同的桌面提醒框设置相同的“tag”属性,这样可以保证每次提醒的都是最新消息。另外,Notification对象还有四个事件属性,将在下小节来介绍这几个属性。以下为实例代码
1 function message(){ 2 var icon = "../IMAGE/mediaICON/pause.png"; 3 var title = "hupeng"; 4 var body = "Hello World"; 5 var msgObj = window.webkitNotifications.createNotification(icon, title, body);
6 msgObj.dir = "rtl"; //设置dir属性 7 msgObj.tag = "aa"; //设置tag属性
8 msgObj.show(); 9 }
4.4、为桌面提醒框添加事件
前面我们提到的Notification对象的四个事件属性,我们可以通过这四个事件属性为Notification对象添加响应事件。例如我们通常希望桌面提醒框弹出后间隔一段时间自动关闭,可以通过如下代码来实现
1 function message(){ 2 var icon = "../IMAGE/mediaICON/pause.png"; 3 var title = "hupeng"; 4 var body = "Hello World"; 5 var msgObj = window.webkitNotifications.createNotification(icon, title, body);
6 msgObj.onshow = function(){ //设置消息提醒框在4秒后自动关闭 7 setTimeout(function(){ 8 msgObj.close(); //这里也可以使用cancel方法 9 }, 4000); 10 } 11 12 msgObj.show(); 13 }
当然也可以使用常规的addEventListener方法来实现。其他几个事件如click, close, error也类似。
注意:桌面提醒功能要在服务器的环境下才能够正常使用
-------------------------------------------------------------------------------分割线-----------------------------------------------------------------------------------
下面是一个小JS类,用于实现桌面提醒
1 function DesktopNotification(notificationStyle, options, displayTime) { 2 /** 3 *@param {Number} notificationStyle 设定创建消息框方式,可取值1(纯文本方式), 2(HTML方式) 默认为1 4 *@param {Object} options 设定消息体参数,包含三个属性(url, title, body),如果notificationStyle值为2,只需定义url属性 5 *@param {Number} displayTime 设定消息显示时间,单位ms, 默认为2000 6 */ 7 this.isSupport = undefined, 8 this.permissionStatue = 1, //PERMISSION_ALLOWED: 0, PERMISSION_NOT_ALLOWED: 1, PERMISSION_DENIED: 2 9 this.notificationStyle = notificationStyle || 1, 10 this.options = options ||{url: "", title: "", body: ""}, 11 this.displayTime = displayTime || 2000, 12 this.content = undefined 13 } 14 15 DesktopNotification.prototype = { 16 constructor: DesktopNotification, 17 18 checkSupport: function(){ 19 if(window.webkitNotifications){ 20 this.isSupport = true; 21 } else{ 22 this.isSupport = false; 23 } 24 }, 25 26 requestPermission: function(){ 27 window.webkitNotifications.requestPermission(); 28 this.permissionStatue = window.webkitNotifications.checkPermission(); 29 }, 30 31 checkPermissionStatue: function(){ 32 if(this.permissionStatue == 0){ 33 this.notificationContent(); 34 } 35 }, 36 37 notificationContent: function(){ 38 var self = this; 39 switch(this.notificationStyle){ 40 case 1 : 41 this.content = window.webkitNotifications.createNotification(this.options.url, this.options.title, this.options.body); 42 break; 43 case 2 : 44 this.content = window.webkitNotifications.createHTMLNotification(this.options.url); 45 break; 46 default : 47 alert('Sorry, you have not defined the notificationStyle.'); 48 }; 49 50 this.content.onshow = function(){ 51 setTimeout(function(){ 52 self.content.cancel(); 53 }, self.displayTime) 54 } 55 this.content.show(); 56 }, 57 58 init: function(){ 59 this.checkSupport(); 60 if(this.isSupport){ 61 this.requestPermission(); 62 this.checkPermissionStatue(); 63 } 64 } 65 66 }
使用示例:
1 var options = { 2 url : "../IMAGE/mediaICON/pause.png", 3 title : "hupeng", 4 body : "Hello World!" 5 }
6 var message = new DesktopNotification(1,options,4000); 7 message.init();
错误在所难免,请拾砖重拍!