客户端 API
EventSource 对象
SSE 的客户端 API 部署在EventSource
对象上。下面的代码可以检测浏览器是否支持 SSE。
if ('EventSource' in window) {
// ...
}
使用 SSE 时,浏览器首先生成一个EventSource
实例,向服务器发起连接。
var source = new EventSource(url);
上面的url
可以与当前网址同域,也可以跨域。跨域时,可以指定第二个参数,打开withCredentials
属性,表示是否一起发送 Cookie。
var source = new EventSource(url, { withCredentials: true });
readyState 属性
EventSource
实例的readyState
属性,表明连接的当前状态。该属性只读,可以取以下值。
- 0:相当于常量
EventSource.CONNECTING
,表示连接还未建立,或者断线正在重连。 - 1:相当于常量
EventSource.OPEN
,表示连接已经建立,可以接受数据。 - 2:相当于常量
EventSource.CLOSED
,表示连接已断,且不会重连。
var source = new EventSource(url);
console.log(source.readyState);
url 属性
EventSource
实例的url
属性返回连接的网址,该属性只读。
withCredentials 属性
EventSource
实例的withCredentials
属性返回一个布尔值,表示当前实例是否开启 CORS 的withCredentials
。该属性只读,默认是false
。
onopen 属性
连接一旦建立,就会触发open
事件,可以在onopen
属性定义回调函数。
source.onopen = function (event) {
// ...
};
// 另一种写法
source.addEventListener('open', function (event) {
// ...
}, false);
onmessage 属性
客户端收到服务器发来的数据,就会触发message
事件,可以在onmessage
属性定义回调函数。
source.onmessage = function (event) {
var data = event.data;
var origin = event.origin;
var lastEventId = event.lastEventId;
// handle message
};
// 另一种写法
source.addEventListener('message', function (event) {
var data = event.data;
var origin = event.origin;
var lastEventId = event.lastEventId;
// handle message
}, false);
上面代码中,参数对象event
有如下属性。
data
:服务器端传回的数据(文本格式)。origin
: 服务器 URL 的域名部分,即协议、域名和端口,表示消息的来源。lastEventId
:数据的编号,由服务器端发送。如果没有编号,这个属性为空。
onerror 属性
如果发生通信错误(比如连接中断),就会触发error
事件,可以在onerror
属性定义回调函数。
source.onerror = function (event) {
// handle error event
};
// 另一种写法
source.addEventListener('error', function (event) {
// handle error event
}, false);
自定义事件
默认情况下,服务器发来的数据,总是触发浏览器EventSource
实例的message
事件。开发者还可以自定义 SSE 事件,这种情况下,发送回来的数据不会触发message
事件。
source.addEventListener('foo', function (event) {
var data = event.data;
var origin = event.origin;
var lastEventId = event.lastEventId;
// handle message
}, false);
上面代码中,浏览器对 SSE 的foo
事件进行监听。如何实现服务器发送foo
事件,请看下文。
close() 方法
close
方法用于关闭 SSE 连接。
source.close();