使用HTML5 Notication API实现一个定时提醒工具

55bd 12年前

初识Chrome Notification API 这篇博文介绍了Notification API以及chrome的实现,同时也对相关的API做了一个简单的封装,在本文中将利用封装过的API实现一个定时提醒工具。

       工具的主要目的是:自己经常坐在电脑前,一坐就是好几个小时,希望有工具能够每小时提醒自己起来活动休息一会。
       主要功能有:用户可以设置周期性的提醒时间,比如设置每1小时提醒一次,1小时后将弹出通知框提醒用户时间到。
       其他包括:用户能够设置对话框的持续时间,比如持续15秒,15秒后对话框消失,以及提醒内容等。


HTML&CSS

      首先先创建基本的HTML结构如下:

<!DOCTYPE html>  <html>   <head>    <meta charset="utf-8" />    <title>时间提醒</title>    <style>     div {      margin:40px 15px;     }          #main {          margin:0 auto;      width:360px;      border: 2px solid green;     }          .operation {      text-align:center;     }         </style>   </head>   <body>    <div id="main">    <div><label for="interval">设置时间间隔(分):<input id="interval" type="number" value="60" /></label></div>    <div><label for="duration">弹窗持续时间(分):<input id="duration" type="number"  value="1" /></label></div>    <div><label for="content">设置提醒消息:<textarea id="content" >你已经做了很久啦,让眼睛放松放松吧~~!</textarea></label></div>    <div class="operation">     <input type="button" value="开始" id="start" />     <input type="button" value="停止" id="stop" />    </div>    </div>    <script src="desktopNotify.js"></script>    <script src="desktop-notification.js"></script>   </body>  </html>

desktopNotify.js是前面提到的封装过的Notification API, desktop-notification.js则是相关的业务逻辑JS,后面会说到。基本的效果如下,虽然是丑陋了点- -!!

程序的逻辑比较简单,设置各个字段,点击"开始"按钮,程序开始计时,到指定时间,弹出通知框。

 

JavaScript

desktopNotify.js的功能主要是对原生Notification API做一些基本封装,代码如下:
//desktopNotify.js  void function() {   var _instance = null,    _permissionStatus = -1,    _eventTable = {     "show": 1,     "error": 1,     "close": 1,     "click": 1    };         /**    *调用例子:     * var DN = window.XX.DesktopNotify;    * DN.requestPermission(function(){    *    DN.show("http://xxx", "hello", "world");    * });    */    var DesktopNotify = {        /**     *检测是否支持Notification,支持返回true      */    isSupport : function() {     return 'Notification' in window || 'webkitNotifications' in window;    },      /**     *弹出一个文本桌面通知      *     * @param {String} iconURL:图标资源     * @param {String} title: 标题     * @param {String} content: 内容     */    show : function(iconURL, title, content) {     _instance = this.create(iconURL, title, content);     _instance.show();    },          /**     *弹出一个 HTML桌面通知     *     * @param {String} url:html链接资源     */    showHTML : function(url) {     _instance = this.createHTML(url);     _instance.show();    },      /***     * 关闭一个桌面通知     *       * @param {Object} cb: 隐藏后的回调函数      *      */    hide : function(cb) {     _instance && _instance.close();     cb && cb();    },        /**     * 释放通知对话框引用     */    destroy: function() {     _instance = null,     _permissionStatus = -1;    },      /**     * 检查权限状态     * @return {Number}: 0为允许,1为不允许, 2为禁止     */    checkPermission : function() {     return _permissionStatus = webkitNotifications.checkPermission();    },        /**     * 检查是否得到授权     * @return {Boolean}: true表示得到授权     */    isPermitted: function() {     return this.checkPermission() === 0;    },            /**     * 请求授权      * @param {Object} cb:得到授权后的回调函数     */    requestPermission: function(cb) {     if(this.isPermitted()) {      cb && cb();     } else {      webkitNotifications.requestPermission(cb);     }    },        /**     * 创建一个文本性质的通知对话框,但不展示      * @param {Object} iconURL     * @param {Object} title      * @param {Object} content      * @return {Object} Notification实例     */    create: function(iconURL, title, content) {     return webkitNotifications.createNotification(iconURL, title, content);    },        /**     * 创建一个HTML性质的通知对话框,但不展示      * @param {Object} url: 指向html页面的链接      * @return {Object} Notification实例     */    createHTML: function(url) {     return webkitNotifications.createHTMLNotification(url);    },        /**     * 添加事件监听函数      * @param {Object} type: 事件类型      * @param {Object} fn: 监听函数     */    on: function(type, fn) {     _eventTable[type] && _instance && _instance.addEventListener(type, fn, false);     },        /**     * 移除事件监听函数      * @param {Object} type: 事件类型      * @param {Object} fn: 监听函数     */    un: function(type, fn) {      _eventTable[type] && _instance && _instance.removeEventListener(type, fn, false);     }   };     window.XX || (window.XX = {});   window.XX.DesktopNotify = DesktopNotify;  }();

desktop-notification.js则是业务代码,如下:
//desktop-notification.js  void function() {      var TITLE = '时间到啦~~!亲!!',              //图标路径          ICONURL = 'icon.png';        var DN = window.XX.DesktopNotify;       /**      * 通知函数,根据设置的时间间隔,周期的弹出通知框      */      function notify(content, duration) {          DN.show(ICONURL, TITLE, content);          setTimeout(function() {              DN.hide();          }, duration);      }        if (!DN.isSupport()) {          alert('浏览器不支持桌面通知!');          return;      }        var startEl = document.getElementById('start'),//开始按钮          stopEl = document.getElementById('stop'),//停止按钮          intervalEl = document.getElementById('interval'),//提醒时间间隔输入框          contentEl = document.getElementById('content'),//提醒内容输入框          durEl = document.getElementById('duration'),//通知框持续时间输入框          timer = null;        startEl.addEventListener('click', function(evt) {          /**           * 点击“开始”,先申请用户授权,经过授权后,获取相关的提醒时间间隔,以及内容,周期的调用notify函数弹出通知框           */          DN.requestPermission(function() {              timer = setInterval(notify, intervalEl.value * 60 * 1000, contentEl.value, durEl.value * 60 * 1000);              startEl.disabled = true;          });      }, false);        stopEl.addEventListener('click', function(evt) {          /**           * 点击“停止”,清除周期调用           */          clearInterval(timer);          startEl.disabled = false;      }, false);  }();

运行效果

注意,网页必须在HTTP或HTTPS协议下打开,而不能直接用File协议打开,否则无法运行(若用户设置了浏览器接收任何通知,倒是可以直接打开运行)。运行的效果如下:
 
</div>

即便当浏览器最小化,或者未在高亮状态,通知框一样会定时弹出。

总结

在本文中,利用了HTML5 Notification做了一个简单的小工具,用于提醒自己不要久坐,按时休息= =!虽然界面是丑陋了点~~~ 不过效果还可以··。。

 完整的源码请访问:https://github.com/Exodia/jsdemo/tree/master/desktop-notifications