HTML5简单入门系列(五)
前言
本篇将讲述HTML5的服务器发送事件(server-sent event)
Server-Sent 事件
Server-Sent 事件是单向消息传递,指的是网页自动获取来自服务器的更新。
以前的做法是网页不断的询问(向服务器发送请求)是否有可用的更新。通过服务器反馈之后,获得更新。
轮训方案
我们使用上篇HTML5简单入门系列(四)web worker的技术简单实现一下该轮训方案,主动向服务器询问是否有更新。
由于web worker不能访问document等对象,是不能和jQuery连用的,这里我们实现一个简单的js原生ajax来实现向服务器发送请求。
1、新建一个WebForm页面,作为ajax请求的后端,代码很简单,只是返回当前时间即可,如下
protected void Page_Load(object sender, EventArgs e)
{
try
{
Response.Write("data:" + DateTime.Now);
Response.Flush();
}
catch(Exception ee)
{
}
}
ps:这里我将webform的前台页面内容清空了,否则会同时返回页面内容。
2、按照web worker的使用方法,我们新建外部js和主线程html页面(和上篇示例中基本一致),代码如下:
webworker2.js
onmessage = function (event) {
ajaxFunction("WebForm2.aspx");
}
function ajaxFunction(url) {
var xmlHttp;
var resText;
try {
// Firefox, Opera 8.0+, Safari
xmlHttp = new XMLHttpRequest(); // 实例化对象
}
catch (e) {
// Internet Explorer
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
alert("您的浏览器不支持AJAX!");
return false;
}
}
}
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
postMessage(xmlHttp.responseText);
}
}
xmlHttp.open("GET", url, true);
xmlHttp.send(null);
}
当web worker接收到主线程启动的消息后,向webform发起请求。在XMLHTTPRequest的readystatechange事件中,服务器成功(200)返回后则postMessage回主线程更新页面。
webworker2.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
web worker实时时间:<div id="workerTime"></div>
<br />
主线程获取当前时间:<div id="curTime"></div>
<button onclick="mainthread()">主线程获取时间</button>
<script>
var interval;
if (typeof Worker != undefined) {
var worker = new Worker("webworker2.js");
worker.onmessage = function (event)
{
document.getElementById("workerTime").textContent = event.data;
}
interval = setInterval('worker.postMessage()', 1000);
} function mainthread() {
document.getElementById("curTime").textContent = new Date();
}
function stop() {
clearInterval(interval);
worker.terminate();
}
setTimeout(stop, 60000);//60秒之后清理interval
</script>
</body>
</html>
这里轮训时间,就是interval = setInterval('worker.postMessage()', 1000); 根据需要适当调整。
这是之前常用的轮训服务方案,而且我们接住web worker实现了多线程轮训。
HTML5 EventSource
再看看HTML5提供给我们的方案。
1、新建一个webform页面,用来充当服务器的数据更新。代码如下:
protected void Page_Load(object sender, EventArgs e)
{
try
{
Response.ContentType = "text/event-stream";
Response.CacheControl = "no-cache";
Response.Write("data:" + DateTime.Now);
Response.Flush();
}
catch(Exception ee)
{
}
}
注意:这里webform的前台内容依然存在,而上边轮训服务中我将其清空了。
2、新建一个html页面,我们在该页面上实现主动数据更新。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<div id="result"></div>
<script>
if (typeof EventSource != undefined) {
var source = new EventSource("WebForm1.aspx");
source.onmessage = function (event) {
document.getElementById("result").innerHTML += event.type + ":" + event.data + "<br />";
}
source.onerror = function (event) {
document.getElementById("result").innerHTML += event.type + "<br />";
}
}
else {
document.getElementById("result").innerHTML = "no support EventSource";
}
</script>
</body>
</html>
在上面的例子中,我们使用 onmessage 事件来获取消息,onerror获取错误消息。不过还可以使用其他事件:
| 事件 | 描述 |
|---|---|
| onopen | 当通往服务器的连接被打开 |
| onmessage | 当接收到消息 |
| onerror | 当错误发生 |
是不是简洁多了?
另外需要说明的是,EventSource并不是实时的获取服务器更新。在Chrome浏览器中是每3秒更新一次,在Firefox浏览器中是每隔5秒更新一次

不过LZ有点不明白,为什么执行了onmessage之后还是会执行onerror呢?而且error事件中也没有太多相关信息可查看...麻烦知道的园友大牛指教!
小结
好吧,也没啥好说的,就这样吧。
HTML5简单入门系列(五)的更多相关文章
- HTML5简单入门系列(六)
前言 之前几篇已经将HTML5的主要新增元素和特性简单介绍完毕,LZ一直在犹豫还要不要把其他元素也写出来,因为其实没什么东西可以写,就是自己用到时看一下就行.不过为了入门系列的完整,犹豫再三,还是决定 ...
- HTML5简单入门系列(九)
前言 上篇本来应该就是最后一篇了,但是楼主总觉得没有写上一个简单应用,不算是完整的学习系列.所以增加一篇关于动画的应用,对一个开源动画的介绍(很基础,非楼主原创). 本篇介绍一个基于Canvas的发光 ...
- HTML5简单入门系列(八)
前言 本篇介绍HTML5中相对复杂的一些APIs,其中的数学知识比较多.虽然如此,但是其实API使用起来还是比较方便的. 这里说明一下,只写出API相关的JS代码,因为他们都是基于一个canvas标签 ...
- HTML5简单入门系列(一)
前言 随着HTML5的流行,LZ作为一个web开发者,也决定学习一下前端前沿技术. HTML5 是下一代的HTML,它将成为 HTML.XHTML 以及 HTML DOM 的新标准.它是W3C( Wo ...
- HTML5简单入门系列(七)
前言 本篇详细介绍canvas画布的API.说是详细介绍,也只是一些常用的API及简单实例和说明.LZ本人也还没有看完全部,下篇会介绍剩余的一些内容. 本篇的示例中,LZ加入了注释,为的是只简单介绍A ...
- HTML5简单入门系列(四)
前言 今天这篇内容主要讲述HTML 5 Web Worker(一种支持前端js多线程的技术). 工作线程(Web Worker) web worker介绍 W3C 在 HTML5 的规范中提出了工作线 ...
- HTML5简单入门系列(三)
前言 本篇介绍HTML5支持的Web存储(Web Storage)和HTML 5 应用程序缓存. 客户端存储数据介绍 HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没 ...
- HTML5简单入门系列(二)
前言 上篇中写到HTML5中的画布(canvas)元素,查看了canvas其他的资料,发现这个元素相关内容太多,鉴于本系列只是基础(主要是LZ也是初学),不再做太多介绍,有机会的话再单独写相关内容.说 ...
- 07. Web大前端时代之:HTML5+CSS3入门系列~H5 地理位置
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 源码:https://github.com/duniti ...
随机推荐
- python学习第四天 --字符编码 与格式化及其字符串切片
字符编码 与格式化 第三天已经知道了字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采 ...
- 逃离迷宫(HDU 1728 BFS)
逃离迷宫 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- linq学习三个实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Idea使用记录--每次修改JS文件都需要重启Idea才能生效解决方法
最近开始使用Idea,有些地方的确比eclipse方便.但是我发现工程每次修改JS或者是JSP页面后,并没有生效,每次修改都需要重启一次Tomcat这样的确不方便.我想Idea肯定有设置的方法,不可能 ...
- 自定义栈类型,具有找到站内最小元素的min函数 ,且min(),pop(),push()函数的时间复杂度为O(1)
基本思想: // 借助一个辅助栈,入栈时,若新元素比辅助栈栈顶元素小,则直接放入辅助站 // 反之,辅助站中放入次小元素(即辅助栈栈顶元素)====保证最小元素出栈时,次小元素被保存 static c ...
- input元素有padding间距,所以使用box-sizing来保持宽度不超出父元素
http://vicbeta.com/code/2013/04/24/phone-over-width.html 手机web开发资料少,原创解决方案Mark. 手机页面遇到一个横竖屏切换时出现的问题. ...
- 测试jsp
一. get.jsp <%@ page contentType="text/html;charset=UTF-8"%> <%@ page import=" ...
- bzoj1379 [Baltic2001]Postman
Description 邮递员每天给N个村子的人送信,每个村子可能在某个十字路口上,或一条路的中央. 村子里的人都希望早点收到信,因此与邮递员达成一个协议:每个村子都有一个期望值Wi,如果这个村子是邮 ...
- c++ windows下declspec
一.declspec #ifdef STATIC_LIBS #define DLL_API static #else #define DLL_API __declspec (dllexport) #e ...
- HDU 1576 A/B(数论)
题目:求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1).数据给出n和b 推导过程 A/B = K K = 9973* ...