<font size="3"> 在本文中将利用封装过的API实现一个定时提醒工具。<br> <br> 工具的主要目的是:自己经常坐在电脑前,一坐就是好几个小时,希望有工具能够每小时提醒自己起来活动休息一会。<br> <br> 主要功能有:用户可以设置周期性的提醒时间,比如设置每1小时提醒一次,1小时后将弹出通知框提醒用户时间到。<br> <br> 其他包括:用户能够设置对话框的持续时间,比如持续15秒,15秒后对话框消失,以及提醒内容等。<br> <br> <br> <strong>HTML&CSS</strong><br> <br> 首先先创建基本的HTML结构如下:<br> <br> </font><div class="blockcode"> <div id="code_qEf"><ol> <li><font size="3"><br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> <meta charset="utf-8"> <br> </font></li> <li><font size="3"> <title>时间提醒</title> <br> </font></li> <li><font size="3"> <style><br> </style></font></li> <li><font size="3"> div {<br> </font></li> <li><font size="3"> margin:40px 15px;<br> </font></li> <li><font size="3"> }<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> #main { <br> </font></li> <li><font size="3"> margin:0 auto;<br> </font></li> <li><font size="3"> width:360px;<br> </font></li> <li><font size="3"> border: 2px solid green;<br> </font></li> <li><font size="3"> }<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> .operation {<br> </font></li> <li><font size="3"> text-align:center;<br> </font></li> <li><font size="3"> }<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> <div id="main"> <br> <li><font size="3"> <div><label for="interval">设置时间间隔(分):<input id="interval" type="number" value="60"></label></div> <br> </font></li> <li><font size="3"> <div><label for="duration">弹窗持续时间(分):<input id="duration" type="number"></label></div> <br> </font></li> <li><font size="3"> <div><label for="content">设置提醒消息:<textarea id="content">你已经做了很久啦,让眼睛放松放松吧~~!</textarea></label></div> <br> </font></li> <li><font size="3"> <div class="operation"> <br> <li><font size="3"> <input type="button" value="开始" id="start"><br> </font></li> <li><font size="3"> <input type="button" value="停止" id="stop"><br> </font></li> <li><font size="3"> </font></li> </div> <br> </font></li> <li><font size="3"> </font></li> </div> <br> </font></li> <li><font size="3"> <script src="desktopNotify.js"></script><br> </font></li> <li><font size="3"> <script src="desktop-notification.js"></script><br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"></font></li> </ol></div> <em onclick="copycode($('code_qEf'));"><font size="3">复制代码</font></em> </div> <font size="3"><br> desktopNotify.js是前面提到的封装过的Notification API, desktop-notification.js则是相关的业务逻辑JS,后面会说到。基本的效果如下,虽然是丑陋了点- -!!<br> <br> </font><p align="center"><font size="3"><img id="_aimg_8214" aid="8214" zoomfile="data/attachment/forum/201210/18/103702rgrxg7zg5qr8w6g8.png" src="data/attachment/forum/201210/18/103702rgrxg7zg5qr8w6g8.png" class="zoom" onclick="zoom(this, this.src, 0, 0, 0)" style="max-width:90%" alt="0000.png" title="0000.png" w="376"><br> </font></p> <font size="3"><br> 程序的逻辑比较简单,设置各个字段,点击"开始"按钮,程序开始计时,到指定时间,弹出通知框。<br> <strong><br> JavaScrip</strong><br> <br> desktopNotify.js的功能主要是对原生Notification API做一些基本封装,代码如下:<br> <br> </font><div class="blockcode"> <div id="code_cjS"><ol> <li><font size="3">//desktopNotify.js<br> </font></li> <li><font size="3">void function() {<br> </font></li> <li><font size="3"> var _instance = null,<br> </font></li> <li><font size="3"> _permissionStatus = -1,<br> </font></li> <li><font size="3"> _eventTable = {<br> </font></li> <li><font size="3"> "show": 1,<br> </font></li> <li><font size="3"> "error": 1,<br> </font></li> <li><font size="3"> "close": 1,<br> </font></li> <li><font size="3"> "click": 1<br> </font></li> <li><font size="3"> };<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> *调用例子: <br> </font></li> <li><font size="3"> * var DN = window.XX.DesktopNotify;<br> </font></li> <li><font size="3"> * DN.requestPermission(function(){<br> </font></li> <li><font size="3"> * DN.show("http://xxx", "hello", "world");<br> </font></li> <li><font size="3"> * });<br> </font></li> <li><font size="3"> */ <br> </font></li> <li><font size="3"> var DesktopNotify = {<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> *检测是否支持Notification,支持返回true <br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> isSupport : function() {<br> </font></li> <li><font size="3"> return 'Notification' in window || 'webkitNotifications' in window;<br> </font></li> <li><font size="3"> },<br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> *弹出一个文本桌面通知 <br> </font></li> <li><font size="3"> *<br> </font></li> <li><font size="3"> * @param {String} iconURL:图标资源<br> </font></li> <li><font size="3"> * @param {String} title: 标题<br> </font></li> <li><font size="3"> * @param {String} content: 内容<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> show : function(iconURL, title, content) {<br> </font></li> <li><font size="3"> _instance = this.create(iconURL, title, content);<br> </font></li> <li><font size="3"> _instance.show();<br> </font></li> <li><font size="3"> },<br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> *弹出一个 HTML桌面通知<br> </font></li> <li><font size="3"> *<br> </font></li> <li><font size="3"> * @param {String} url:html链接资源<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> showHTML : function(url) {<br> </font></li> <li><font size="3"> _instance = this.createHTML(url);<br> </font></li> <li><font size="3"> _instance.show();<br> </font></li> <li><font size="3"> },<br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> /***<br> </font></li> <li><font size="3"> * 关闭一个桌面通知<br> </font></li> <li><font size="3"> * <br> </font></li> <li><font size="3"> * @param {Object} cb: 隐藏后的回调函数<br> </font></li> <li><font size="3"> * <br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> hide : function(cb) {<br> </font></li> <li><font size="3"> _instance && _instance.close();<br> </font></li> <li><font size="3"> cb && cb();<br> </font></li> <li><font size="3"> },<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> * 释放通知对话框引用<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> destroy: function() {<br> </font></li> <li><font size="3"> _instance = null,<br> </font></li> <li><font size="3"> _permissionStatus = -1;<br> </font></li> <li><font size="3"> },<br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> * 检查权限状态<br> </font></li> <li><font size="3"> * @return {Number}: 0为允许,1为不允许, 2为禁止<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> checkPermission : function() {<br> </font></li> <li><font size="3"> return _permissionStatus = webkitNotifications.checkPermission();<br> </font></li> <li><font size="3"> },<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> * 检查是否得到授权<br> </font></li> <li><font size="3"> * @return {Boolean}: true表示得到授权<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> isPermitted: function() {<br> </font></li> <li><font size="3"> return this.checkPermission() === 0;<br> </font></li> <li><font size="3"> },<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> * 请求授权<br> </font></li> <li><font size="3"> * @param {Object} cb:得到授权后的回调函数<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> requestPermission: function(cb) {<br> </font></li> <li><font size="3"> if(this.isPermitted()) {<br> </font></li> <li><font size="3"> cb && cb();<br> </font></li> <li><font size="3"> } else {<br> </font></li> <li><font size="3"> webkitNotifications.requestPermission(cb);<br> </font></li> <li><font size="3"> }<br> </font></li> <li><font size="3"> },<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> * 创建一个文本性质的通知对话框,但不展示<br> </font></li> <li><font size="3"> * @param {Object} iconURL<br> </font></li> <li><font size="3"> * @param {Object} title<br> </font></li> <li><font size="3"> * @param {Object} content<br> </font></li> <li><font size="3"> * @return {Object} Notification实例<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> create: function(iconURL, title, content) {<br> </font></li> <li><font size="3"> return webkitNotifications.createNotification(iconURL, title, content);<br> </font></li> <li><font size="3"> },<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> * 创建一个HTML性质的通知对话框,但不展示<br> </font></li> <li><font size="3"> * @param {Object} url: 指向html页面的链接<br> </font></li> <li><font size="3"> * @return {Object} Notification实例<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> createHTML: function(url) {<br> </font></li> <li><font size="3"> return webkitNotifications.createHTMLNotification(url);<br> </font></li> <li><font size="3"> },<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> * 添加事件监听函数<br> </font></li> <li><font size="3"> * @param {Object} type: 事件类型<br> </font></li> <li><font size="3"> * @param {Object} fn: 监听函数<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> on: function(type, fn) {<br> </font></li> <li><font size="3"> _eventTable[type] && _instance && _instance.addEventListener(type, fn, false); <br> </font></li> <li><font size="3"> },<br> </font></li> <li><font size="3"> <br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> * 移除事件监听函数<br> </font></li> <li><font size="3"> * @param {Object} type: 事件类型<br> </font></li> <li><font size="3"> * @param {Object} fn: 监听函数<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> un: function(type, fn) {<br> </font></li> <li><font size="3"> _eventTable[type] && _instance && _instance.removeEventListener(type, fn, false); <br> </font></li> <li><font size="3"> }<br> </font></li> <li><font size="3"> };<br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> window.XX || (window.XX = {});<br> </font></li> <li><font size="3"> window.XX.DesktopNotify = DesktopNotify;<br> </font></li> <li><font size="3">}();</font></li> </ol></div> <em onclick="copycode($('code_cjS'));"><font size="3">复制代码</font></em> </div> <font size="3"><br> desktop-notification.js则是业务代码,如下:<br> <br> </font><div class="blockcode"> <div id="code_e22"><ol> <li><font size="3">//desktop-notification.js<br> </font></li> <li><font size="3">void function() {<br> </font></li> <li><font size="3"> var TITLE = '时间到啦~~!亲!!',<br> </font></li> <li><font size="3"> //图标路径<br> </font></li> <li><font size="3"> ICONURL = 'icon.png';<br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> var DN = window.XX.DesktopNotify;<br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> * 通知函数,根据设置的时间间隔,周期的弹出通知框<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> function notify(content, duration) {<br> </font></li> <li><font size="3"> DN.show(ICONURL, TITLE, content);<br> </font></li> <li><font size="3"> setTimeout(function() {<br> </font></li> <li><font size="3"> DN.hide();<br> </font></li> <li><font size="3"> }, duration);<br> </font></li> <li><font size="3"> }<br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> if (!DN.isSupport()) {<br> </font></li> <li><font size="3"> alert('浏览器不支持桌面通知!');<br> </font></li> <li><font size="3"> return;<br> </font></li> <li><font size="3"> }<br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> var startEl = document.getElementById('start'),//开始按钮<br> </font></li> <li><font size="3"> stopEl = document.getElementById('stop'),//停止按钮<br> </font></li> <li><font size="3"> intervalEl = document.getElementById('interval'),//提醒时间间隔输入框<br> </font></li> <li><font size="3"> contentEl = document.getElementById('content'),//提醒内容输入框<br> </font></li> <li><font size="3"> durEl = document.getElementById('duration'),//通知框持续时间输入框<br> </font></li> <li><font size="3"> timer = null;<br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> startEl.addEventListener('click', function(evt) {<br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> * 点击“开始”,先申请用户授权,经过授权后,获取相关的提醒时间间隔,以及内容,周期的调用notify函数弹出通知框<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> DN.requestPermission(function() {<br> </font></li> <li><font size="3"> timer = setInterval(notify, intervalEl.value * 60 * 1000, contentEl.value, durEl.value * 60 * 1000);<br> </font></li> <li><font size="3"> startEl.disabled = true;<br> </font></li> <li><font size="3"> });<br> </font></li> <li><font size="3"> }, false);<br> </font></li> <li><font size="3"><br> </font></li> <li><font size="3"> stopEl.addEventListener('click', function(evt) {<br> </font></li> <li><font size="3"> /**<br> </font></li> <li><font size="3"> * 点击“停止”,清除周期调用<br> </font></li> <li><font size="3"> */<br> </font></li> <li><font size="3"> clearInterval(timer);<br> </font></li> <li><font size="3"> startEl.disabled = false;<br> </font></li> <li><font size="3"> }, false);<br> </font></li> <li><font size="3">}();</font></li> </ol></div> <em onclick="copycode($('code_e22'));"><font size="3">复制代码</font></em> </div> <font size="3"><br> <strong> 运行效果</strong><br> <br> 注意,网页必须在HTTP或HTTPS协议下打开,而不能直接用File协议打开,否则无法运行(若用户设置了浏览器接收任何通知,倒是可以直接打开运行)。运行的效果如下:<br> <br> </font><p align="center"><font size="3"><img id="_aimg_8215" aid="8215" zoomfile="data/attachment/forum/201210/18/103702guasopzhn1o11sni.png" src="data/attachment/forum/201210/18/103702guasopzhn1o11sni.png" class="zoom" onclick="zoom(this, this.src, 0, 0, 0)" style="max-width:90%" alt="000.png" title="000.png" w="315"><br> </font></p> <font size="3"><br> 即便当浏览器最小化,或者未在高亮状态,通知框一样会定时弹出。<br> <br> <strong> 总结<br> </strong><br> 在本文中,利用了HTML5 Notification做了一个简单的小工具,用于提醒自己不要久坐,按时休息= =!虽然界面是丑陋了点,不过效果还可以。<br> <br> <br> 完整代码点击:<a href="https://github.com/Exodia/jsdemo/tree/master/desktop-notifications" target="_blank">https://github.com/Exodia/jsdemo/tree/master/desktop-notifications</a><br> <br> </font><br>