html5中文学习网

您的位置: 首页 > html5教程 > 入门教程 » 正文

突袭HTML5之Javascript API扩展5―其他扩展(应用缓存/服务端消息/桌面通知)_html5教程技巧

[ ] 已经帮助:人解决问题
点评:前面已经总结了主要的API扩展(应用缓存/服务端消息/桌面通知),下面的几个只有在特定的场合才能发挥它的潜质,无一例外,IE均不支持,桌面通知目前只有Chrome支持,感兴趣的朋友可以了解下,或许对你有所帮助
前面已经总结了主要的API扩展,下面几个扩展只有在专用的场合才会发挥最大的作用,这里简单了解一下。下面这些特性无一例外,IE均不支持。应用缓存和服务端消息在其他的主流浏览器中都是支持的。桌面通知目前只有Chrome支持。 SRzHTML5中文学习网 - HTML5先行者学习网
应用缓存 SRzHTML5中文学习网 - HTML5先行者学习网
很多时候,我们需要缓存一些不经常改变的页面来提高访问速度;而且对于某些应用,我们也希望在离线的情况下也可以使用。在HTML5中,你可以通过一个称之为“应用缓存”的技术很方便的实现这些功能。 SRzHTML5中文学习网 - HTML5先行者学习网
在应用缓存的实现中,HTML5允许我们创建一个缓存manifest文件来方便的生成一个离线版的应用。 SRzHTML5中文学习网 - HTML5先行者学习网
实现步骤SRzHTML5中文学习网 - HTML5先行者学习网
1. 启用页面的缓存,很简单,只需要在document的html中包含manifest属性: SRzHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
SRzHTML5中文学习网 - HTML5先行者学习网
<!DOCTYPE HTML> SRzHTML5中文学习网 - HTML5先行者学习网
<html manifest="demo.appcache"> SRzHTML5中文学习网 - HTML5先行者学习网
... SRzHTML5中文学习网 - HTML5先行者学习网
</html> SRzHTML5中文学习网 - HTML5先行者学习网
SRzHTML5中文学习网 - HTML5先行者学习网
每一个包含这个manifest属性的页面当用户访问的时候都会被缓存。如果manifest属性没有指定的话,将不会缓存(除非网页被直接在manifest文件中指定)。manifest文件扩展名还没有统一的标准,推荐的扩展名是".appcache"。 SRzHTML5中文学习网 - HTML5先行者学习网
2. 服务器端配置manifest文件的MIME类型 SRzHTML5中文学习网 - HTML5先行者学习网
一个manifest文件需要被正确的MIME-type支持,这种文件类型为"text/cache-manifest"。必须在所使用的web服务器上进行配置。例如:Apache 中可在 .htaccess 中添加: AddType text/cache-manifest manifest。 SRzHTML5中文学习网 - HTML5先行者学习网
3.编写manifest文件 SRzHTML5中文学习网 - HTML5先行者学习网
manifest文件是一个简单的文本文件,告诉了浏览器去缓存什么内容(或者不缓存什么内容)。 SRzHTML5中文学习网 - HTML5先行者学习网
manifest文件包含下面三个部分: SRzHTML5中文学习网 - HTML5先行者学习网
• CACHE MANIFEST - 在这个列表标题下的文件将会在下载后被缓存。 SRzHTML5中文学习网 - HTML5先行者学习网
• NETWORK - 在这个列表标题下的文件将要求连接到服务器,不会进行缓存。 SRzHTML5中文学习网 - HTML5先行者学习网
• FALLBACK - 在这个列表标题下的文件如果不能访问时,则显示特定的页面。 SRzHTML5中文学习网 - HTML5先行者学习网
完整的一个文件如下面的例子所示: SRzHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
SRzHTML5中文学习网 - HTML5先行者学习网
CACHE MANIFEST SRzHTML5中文学习网 - HTML5先行者学习网
# 2012-02-21 v1.0.0 SRzHTML5中文学习网 - HTML5先行者学习网
/theme.css SRzHTML5中文学习网 - HTML5先行者学习网
/logo.gif SRzHTML5中文学习网 - HTML5先行者学习网
/main.js SRzHTML5中文学习网 - HTML5先行者学习网
NETWORK: SRzHTML5中文学习网 - HTML5先行者学习网
login.asp SRzHTML5中文学习网 - HTML5先行者学习网
FALLBACK: SRzHTML5中文学习网 - HTML5先行者学习网
/html5/ /offline.html SRzHTML5中文学习网 - HTML5先行者学习网
SRzHTML5中文学习网 - HTML5先行者学习网
提示: SRzHTML5中文学习网 - HTML5先行者学习网
#开头的代表注释。 SRzHTML5中文学习网 - HTML5先行者学习网
*可以用表示所有的其它资源或者文件。例如: SRzHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
SRzHTML5中文学习网 - HTML5先行者学习网
NETWORK: SRzHTML5中文学习网 - HTML5先行者学习网
* SRzHTML5中文学习网 - HTML5先行者学习网
SRzHTML5中文学习网 - HTML5先行者学习网
表示所有的资源或者文件都不会缓存。 SRzHTML5中文学习网 - HTML5先行者学习网
4.更新缓存 SRzHTML5中文学习网 - HTML5先行者学习网
一旦一个应用被缓存,它将保持缓存除非一下情况发生: SRzHTML5中文学习网 - HTML5先行者学习网
• 用户删除了缓存 SRzHTML5中文学习网 - HTML5先行者学习网
• manifest文件被修改 SRzHTML5中文学习网 - HTML5先行者学习网
• 应用缓存被程序修改 SRzHTML5中文学习网 - HTML5先行者学习网
所以一旦文件被缓存,除了人为的修改情况,浏览器将会持续的显示缓存版本内容,即使你修改了服务器文件。为了让浏览器更新缓存,你只能去修改manifest文件。 SRzHTML5中文学习网 - HTML5先行者学习网
:以"#"开始的行是注释行,但是可以有其它用处。如果你的修改只涉及到一个图片或者javascript功能,那些变化是不会被重新缓存的。在注释中更新日期和版本是让浏览器重新缓存你的文件的一个方法 SRzHTML5中文学习网 - HTML5先行者学习网
:浏览器可以有很多不同大小限制的缓存数据(有些浏览器允许5M的缓存数据)。 SRzHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
SRzHTML5中文学习网 - HTML5先行者学习网
<strong>服务端消息</strong> SRzHTML5中文学习网 - HTML5先行者学习网
还有一个经常使用的场景是:当服务端的数据发生变化时,如何让客户端知道?这在以前的做法是:页面主动去查询服务端是否有更新。根据前面的介绍,我们知道,使用WebSocket可以实现双向通讯。这里再介绍另外一个HTML5中新特性:服务端消息(Server-Sent Events)。 SRzHTML5中文学习网 - HTML5先行者学习网
在HTML5中,承载这项特性的对象是EventSource对象。 SRzHTML5中文学习网 - HTML5先行者学习网
使用步骤如下: SRzHTML5中文学习网 - HTML5先行者学习网
1.检查浏览器对EventSource对象的支持性,这个大家都知道了: SRzHTML5中文学习网 - HTML5先行者学习网
SRzHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
SRzHTML5中文学习网 - HTML5先行者学习网
if(typeof(EventSource)!=="undefined") SRzHTML5中文学习网 - HTML5先行者学习网
{ SRzHTML5中文学习网 - HTML5先行者学习网
// Yes! Server-sent events support! SRzHTML5中文学习网 - HTML5先行者学习网
// Some code..... SRzHTML5中文学习网 - HTML5先行者学习网
}else { SRzHTML5中文学习网 - HTML5先行者学习网
// Sorry! No server-sent events support.. SRzHTML5中文学习网 - HTML5先行者学习网
} SRzHTML5中文学习网 - HTML5先行者学习网
SRzHTML5中文学习网 - HTML5先行者学习网
2.服务器端的发送消息代码 SRzHTML5中文学习网 - HTML5先行者学习网
服务器端的发送更新消息很简单:设置content-type头信息为”text/event-stream"后,你就可以发送事件。以ASP代码为例: SRzHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
SRzHTML5中文学习网 - HTML5先行者学习网
<% SRzHTML5中文学习网 - HTML5先行者学习网
Response.ContentType="text/event-stream" SRzHTML5中文学习网 - HTML5先行者学习网
Response.Expires=-1 SRzHTML5中文学习网 - HTML5先行者学习网
Response.Write("data: >> 服务器时间" & now()) SRzHTML5中文学习网 - HTML5先行者学习网
Response.Flush() SRzHTML5中文学习网 - HTML5先行者学习网
%> SRzHTML5中文学习网 - HTML5先行者学习网
SRzHTML5中文学习网 - HTML5先行者学习网
3.浏览器端的接收消息代码 SRzHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
SRzHTML5中文学习网 - HTML5先行者学习网
var source=new EventSource("demo_sse.php"); SRzHTML5中文学习网 - HTML5先行者学习网
source.onmessage=function(event){ SRzHTML5中文学习网 - HTML5先行者学习网
document.getElementById("result").innerHTML+=event.data + "SRzHTML5中文学习网 - HTML5先行者学习网
"; SRzHTML5中文学习网 - HTML5先行者学习网
}; SRzHTML5中文学习网 - HTML5先行者学习网
SRzHTML5中文学习网 - HTML5先行者学习网
代码说明: SRzHTML5中文学习网 - HTML5先行者学习网
• 创建一个EventSource对象,指定发送更新的页面URL (这里是demo_see.jsp) SRzHTML5中文学习网 - HTML5先行者学习网
• 每一次一个更新接收后,onmessage事件就触发 SRzHTML5中文学习网 - HTML5先行者学习网
• 当onmessage时间触发,将得到的数据设置到id="result"的元素中 SRzHTML5中文学习网 - HTML5先行者学习网
EventSource对象除了onmessage事件外,还有处理错误的onerror事件,连接建立的onopen事件等。 SRzHTML5中文学习网 - HTML5先行者学习网
桌面通知 - 准HTML5特性 SRzHTML5中文学习网 - HTML5先行者学习网
桌面通知功能能够让浏览器即使是最小化状态也能将消息通知给用户。这和WebIM是最为天然的结合。不过,目前支持该特性的浏览器只有Chrome。弹窗是大家深恶痛绝的东西,所以开启这项特性需要得到用户的许可。 SRzHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
SRzHTML5中文学习网 - HTML5先行者学习网
<script> SRzHTML5中文学习网 - HTML5先行者学习网
function RequestPermission(callback) { SRzHTML5中文学习网 - HTML5先行者学习网
window.webkitNotifications.requestPermission(callback); SRzHTML5中文学习网 - HTML5先行者学习网
} SRzHTML5中文学习网 - HTML5先行者学习网
function showNotification() { SRzHTML5中文学习网 - HTML5先行者学习网
//通过window.webkitNotifications判断浏览器是否支持notification SRzHTML5中文学习网 - HTML5先行者学习网
if (!!window.webkitNotifications) { SRzHTML5中文学习网 - HTML5先行者学习网
if (window.webkitNotifications.checkPermission() > 0) { SRzHTML5中文学习网 - HTML5先行者学习网
RequestPermission(showNotification); SRzHTML5中文学习网 - HTML5先行者学习网
} else { SRzHTML5中文学习网 - HTML5先行者学习网
var notification =window.webkitNotifications.createNotification("[imgurl]","Title","Body"); SRzHTML5中文学习网 - HTML5先行者学习网
notification.ondisplay = function() { SRzHTML5中文学习网 - HTML5先行者学习网
setTimeout('notification.cancel()', 5000); SRzHTML5中文学习网 - HTML5先行者学习网
} SRzHTML5中文学习网 - HTML5先行者学习网
notification.show(); SRzHTML5中文学习网 - HTML5先行者学习网
} SRzHTML5中文学习网 - HTML5先行者学习网
} SRzHTML5中文学习网 - HTML5先行者学习网
} SRzHTML5中文学习网 - HTML5先行者学习网
</script> SRzHTML5中文学习网 - HTML5先行者学习网
SRzHTML5中文学习网 - HTML5先行者学习网
浏览器中打开此页面,就会看到桌面的右下角弹出一个持续5秒钟的消息窗口。 SRzHTML5中文学习网 - HTML5先行者学习网
这项特性使用起来很简单,但是在实际操作的过程中,应该尽量减少通知功能对用户的干扰,最大程度的减少通知功能的出现。 SRzHTML5中文学习网 - HTML5先行者学习网
下面是网上高手做这个应用的一些经验SRzHTML5中文学习网 - HTML5先行者学习网
1. 收到多条消息时确保只出现一条通知; SRzHTML5中文学习网 - HTML5先行者学习网
这个问题比较好解决,因为通知对象拥有一个名为"replaceId"的属性。指定该属性后,只要是相同replaceId的通知窗口弹出,都会覆盖之前弹出的窗口。在实际项目中是给所有的弹出窗口赋了一个相同的replaceId。不过需要注意的是,这种覆盖行为只在同域下有效。 SRzHTML5中文学习网 - HTML5先行者学习网
2. 当用户处于IM出现的页面中时(页面处于Focus状态)将不出现通知; SRzHTML5中文学习网 - HTML5先行者学习网
这个问题主要是在于判断浏览器窗口是否处于Focus状态,目前除了监听window的onfocus和onblur事件之外,貌似没有更好的方式。在项目中就是通过这种方式来记录窗口的Focus状态,然后当消息到达时根据Focus状态来判断是否弹出窗口。 SRzHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
SRzHTML5中文学习网 - HTML5先行者学习网
$(window).bind( 'blur', this.windowBlur).bind( 'focus', this.windowFocus); SRzHTML5中文学习网 - HTML5先行者学习网
SRzHTML5中文学习网 - HTML5先行者学习网
使用该方法需要注意的地方是,事件注册的事件点应该尽可能的靠前,如果注册太晚则当用户打开页面后再离开就会很容易出现状态的误判。 SRzHTML5中文学习网 - HTML5先行者学习网
3. 当用户使用多Tab开启多个存在IM的页面时,只要有一个页面处于Focus状态将不出现通知; SRzHTML5中文学习网 - HTML5先行者学习网
多页面间的状态共享可以通过本地存储来实现: SRzHTML5中文学习网 - HTML5先行者学习网
• 浏览器窗口Focus时修改本地存储中指定key的值为"focus" SRzHTML5中文学习网 - HTML5先行者学习网
• 浏览器窗口Blur时修改本地存储中指定key的值为"blur"。 SRzHTML5中文学习网 - HTML5先行者学习网
需要注意的是,Chrome下从一个Tab切换到另一个Tab时,Blur有可能比Focus后写入存储中,因此修改Focus状态时需要异步处理。 SRzHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
SRzHTML5中文学习网 - HTML5先行者学习网
/*window on focus事件*/ SRzHTML5中文学习网 - HTML5先行者学习网
//用延时是为了解决多个Tab之间切换时,始终让Focus覆盖其他Tab的Blur事件 SRzHTML5中文学习网 - HTML5先行者学习网
//注: 如果在点击Tab之前没有Focus到document上则点击Tab是不会触发Focus的 SRzHTML5中文学习网 - HTML5先行者学习网
setTimeout( function(){ SRzHTML5中文学习网 - HTML5先行者学习网
Storage.setItem( 'kxchat_focus_win_state', 'focus' ); SRzHTML5中文学习网 - HTML5先行者学习网
}, 100); SRzHTML5中文学习网 - HTML5先行者学习网
/*window on blur事件*/ SRzHTML5中文学习网 - HTML5先行者学习网
Storage.setItem( 'kxchat_focus_win_state', 'blur' ); SRzHTML5中文学习网 - HTML5先行者学习网
SRzHTML5中文学习网 - HTML5先行者学习网
实现以上状态共享后,新的消息到达后,只需要查看本地存储中’kxchat_focus_win_state’的值是否为blur,如果为blur才弹出窗口。 SRzHTML5中文学习网 - HTML5先行者学习网
4. 如何让用户点击通知浮动层即可定位到具体的聊天窗口 SRzHTML5中文学习网 - HTML5先行者学习网
通知窗口支持onclick等事件响应,而响应函数中的作用范围属于创建该窗口的页面。如下代码: SRzHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
SRzHTML5中文学习网 - HTML5先行者学习网
var n = dn.createNotification( SRzHTML5中文学习网 - HTML5先行者学习网
img, SRzHTML5中文学习网 - HTML5先行者学习网
title, SRzHTML5中文学习网 - HTML5先行者学习网
content SRzHTML5中文学习网 - HTML5先行者学习网
); SRzHTML5中文学习网 - HTML5先行者学习网
//确保只有一个提醒 SRzHTML5中文学习网 - HTML5先行者学习网
n.replaceId = this.replaceId; SRzHTML5中文学习网 - HTML5先行者学习网
n.onclick = function(){ SRzHTML5中文学习网 - HTML5先行者学习网
//激活弹出该通知窗口的浏览器窗口 SRzHTML5中文学习网 - HTML5先行者学习网
window.focus(); SRzHTML5中文学习网 - HTML5先行者学习网
//打开IM窗口 SRzHTML5中文学习网 - HTML5先行者学习网
WM.openWinByID( data ); SRzHTML5中文学习网 - HTML5先行者学习网
//关闭通知窗口 SRzHTML5中文学习网 - HTML5先行者学习网
n.cancel(); SRzHTML5中文学习网 - HTML5先行者学习网
}; SRzHTML5中文学习网 - HTML5先行者学习网
SRzHTML5中文学习网 - HTML5先行者学习网
在onclick的响应函数中访问的window对象即属于当前创建页面,因此可以很方便的与当前页面进行交互。以上代码便实现了点击弹出窗口会跳转到对应的浏览器窗口和打开IM窗口。 SRzHTML5中文学习网 - HTML5先行者学习网
:页面中的相关事件很多时候具有不确定的时序性,所以我们的代码尽量不要假设某些事件触发的顺序是一定的。比如上面的blur和focus事件SRzHTML5中文学习网 - HTML5先行者学习网

实用参考:SRzHTML5中文学习网 - HTML5先行者学习网
官方文档:http://www.w3schools.com/html5/SRzHTML5中文学习网 - HTML5先行者学习网
html5的一个中文教程:http://www.gbin1.com/tutorials/html5-tutorial/SRzHTML5中文学习网 - HTML5先行者学习网

SRzHTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助