HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新。+ Q `% H0 M; @1 p* U
7 z: M _6 }6 z+ | i' ]: Y# \. U k z/ o* @
Server-Sent 事件 - 单向消息传递Server-Sent 事件指的是网页自动获取来自服务器的更新。 以前也可能做到这一点,前提是网页不得不询问是否有可用的更新。通过服务器发送事件,更新能够自动到达。 例子:Facebook/Twitter 更新、股价更新、新的博文、赛事结果等。 ; Z6 B3 b- M# l$ G% d7 _
接收 Server-Sent 事件通知EventSource 对象用于接收服务器发送事件通知: - var source=new EventSource("demo_sse.php");3 }0 X2 T9 V, K7 N. g* N
- source.onmessage=function(event)
# t7 S; i- T$ b) D/ Z' d - {
7 @9 z& ?1 A. k( J" s - document.getElementById("result").innerHTML+=event.data + "<br>";% p* R' B2 }% r/ S: H. L- j( K# M- `
- };
复制代码实例解析: - 创建一个新的 EventSource 对象,然后规定发送更新的页面的 URL(本例中是 "demo_sse.php")
- 每接收到一次更新,就会发生 onmessage 事件
- 当 onmessage 事件发生时,把已接收的数据推入 id 为 "result" 的元素中- q9 S9 C8 `3 ^: s! R0 n3 h: ~
检测 Server-Sent 事件支持以下实例,我们编写了一段额外的代码来检测服务器发送事件的浏览器支持情况:
- if(typeof(EventSource)!=="undefined"): E( v. C- X4 L
- {
8 a1 \, K, w* L1 H - // 浏览器支持 Server-Sent
4 E3 _$ e: i- f7 H - // 一些代码....." U! e' i: [) D( s B
- }, @4 k2 N8 d; W! M5 n
- else3 C$ u: a) r2 n
- {
\. K( x* o1 T* r" { - // 浏览器不支持 Server-Sent..; h% C% z+ D0 w' n3 P, `0 b
- }
复制代码 服务器端代码实例为了让上面的例子可以运行,您还需要能够发送数据更新的服务器(比如 PHP 和 ASP)。 服务器端事件流的语法是非常简单的。把 "Content-Type" 报头设置为 "text/event-stream"。现在,您可以开始发送事件流了。 - <?php & @1 Q) T2 O( U/ l8 c
- header('Content-Type: text/event-stream');
% l3 M$ ]# k* }# e/ { - header('Cache-Control: no-cache'); 1 O& Y' G6 a. M& n
- 5 s7 K, L' C8 O2 `5 O
- $time = date('r');
$ e' w+ E9 v) H& Z - echo "data: The server time is: {$time}\n\n"; - Y7 p0 x. p8 w2 c9 i8 P4 l2 O
- flush();
! S9 \$ E; q! L6 r - ?>
复制代码ASP 代码 (VB) (demo_sse.asp): - <%
( p0 d! O4 K: w6 ?0 n4 r - Response.ContentType="text/event-stream"4 X% P" J" @8 X
- Response.Expires=-1
, ]4 S' ?) I; ~; d# C1 ~; j" u& \ - Response.Write("data: " & now())
. ~) f, }+ T! t2 N- @8 Y2 O; A - Response.Flush()- g2 I" R" P7 Y2 b x
- %>
复制代码代码解释: - 把报头 "Content-Type" 设置为 "text/event-stream"
- 规定不对页面进行缓存
- 输出发送日期(始终以 "data: " 开头)
- 向网页刷新输出数据0 I6 n- h: G1 w4 J5 r" f0 W( N3 \
EventSource 对象在上面的例子中,我们使用 onmessage 事件来获取消息。不过还可以使用其他事件: 事件 | 描述 | | onopen | 当通往服务器的连接被打开 | | onmessage | 当接收到消息 | | onerror | 当发生错误 | ' }! W# e+ m8 f, ^# j
& ]- f" B6 G8 U0 R; I
" z# b9 c3 E3 A) p1 ~, P7 | U i' I8 Q
! }6 K* q7 m# O# k/ l0 {
% D3 ?0 G2 h& B% z6 {
v! U, N) B3 K% U- y8 h$ L4 x2 }3 |, t, n; B+ X
' y8 t: t" U& u; k5 w4 R
6 M6 j9 z, \; f$ T |