关键在于服务端按sse标准发送含event:字段的消息,前端用addeventlistener监听自定义事件类型;每条消息需含event:、data:及双换行分隔,响应头须设content-type:text/event-stream等。

浏览器端用 EventSource 接收自定义事件类型(比如 update、notification、userLogin)的关键,是服务器按 SSE 标准格式发送带 event: 字段的消息,前端用 addEventListener 按名称监听,不能用 onxxx 属性方式。
服务器必须正确发送自定义事件格式
自定义事件不是靠 URL 或参数决定的,而是由服务端响应体中的字段明确声明。每条消息需满足:
-
event: update—— 声明事件类型,后面紧跟换行 -
data: {"id":1,"msg":"done"}—— 数据内容,必须以data:开头,后跟一个空格 - 两条消息之间用两个换行符
\n\n分隔 - 可选添加
id:(用于断线重连时定位位置)、retry:(控制重连间隔)
示例服务端片段(Node.js/Express):
id: 101
data: {"status":"success","step":3}
event: notification
data: {"title":"新消息","body":"你有1条未读"}
前端用 addEventListener 监听指定类型
EventSource 实例不支持 onupdate 这类属性监听自定义事件,只能用 addEventListener('update', ...)。标准事件(如 message、error)可用属性赋值,但自定义事件必须走这个 API。
es.addEventListener('update', e => { console.log('收到 update:', e.data); })es.addEventListener('notification', e => showNotify(e.data) )-
e.data是字符串,通常需JSON.parse()解析,注意加 try/catch
避免监听失效的常见坑
即使服务端发了 event: userLogin,前端也监听不到,往往因为:
- 服务端响应头缺失
Content-Type: text/event-stream或Cache-Control: no-cache - 消息格式错误:漏掉
data:前缀、少换行、data:后没空格、用了中文冒号 - 跨域未配置:服务端需返回
Access-Control-Allow-Origin: *(或具体域名) - 连接尚未就绪就监听:确保在
es.readyState === 1(open)后再绑定事件更稳妥,或直接在实例创建后立即监听(EventSource 会缓存已到达但未注册监听器的事件)
可以同时监听多种事件类型
一个 EventSource 实例能共存多个 addEventListener,互不影响。适合统一连接、分类处理:
es.addEventListener('update', handleUpdate)es.addEventListener('error', handleError)es.addEventListener('stream-end', () => es.close())- 仍保留
es.onmessage处理无event:字段的默认消息
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











