Javascript addEvent侦听时未触发EventSource

Javascript addEvent侦听时未触发EventSource,javascript,html,server-sent-events,Javascript,Html,Server Sent Events,我不知道如何用javascript从EventSource捕获事件。我就是这样做的,但是“running”从未出现在控制台中 var es = new EventSource(myUrl); es.addEventListener("time", function(e){ console.log("running") }, false); es.onopen = function(){ co

我不知道如何用javascript从EventSource捕获事件。我就是这样做的,但是“running”从未出现在控制台中

        var es = new EventSource(myUrl);

        es.addEventListener("time", function(e){
         console.log("running")
        }, false);

        es.onopen = function(){
          console.log('open')
        },
        es.onerror = function(e){
          console.log('error')
        },
它登录“打开”,我在浏览器控制台的“网络”部分看到它已连接并每5秒更新一次,当我卷曲到服务器时,我每5秒收到一次响应:

:ok

event: time
data: {"data":"tick","ttl":"60","published_at":"2014-08-22T08:26:17.624Z","id":"53ff6e065067544829091287"}

event: time
data: {"data":"tick","ttl":"60","published_at":"2014-08-22T08:26:22.630Z","id":"53ff6e065067544829091287"}

如何在JS中捕捉这个事件?

首先,坏消息是:它看起来是正确的

标准允许冒号后面的空格。但是使用它从来没有一个好的理由,它只是浪费了一个字节的带宽,所以我要做的第一件事就是删除空间。如果这确实解决了它,您可能正在处理一个浏览器错误(让我们知道)

我要尝试的第二件事是使用默认事件。因此:

  • 服务器端:停止发送
    事件:时间
  • 客户端:更改为使用“消息”事件处理程序
像这样:

es.addEventListener("message", function(e){
  console.log("running");
  }, false);
如果这还不能解决问题,那么开始查看您发送的空白。如果它真的修复了它,那么事件头就会出现一些奇怪的情况

然而,你也可以回避这个问题。我个人从不使用
事件:
行,而是始终将事件类型放在JSON数据中。您的
“数据”:“勾选”
可能已经这样做了,但如果没有,它可以像发送这样的数据一样简单:

data:{"event":"time","data":"tick","ttl":"60","published_at":"2014-08-22T08:26:17.624Z","id":"53ff6e065067544829091287"}

data:{"event":"time","data":"tick","ttl":"60","published_at":"2014-08-22T08:26:22.630Z","id":"53ff6e065067544829091287"}

data:{"event":"somethingElse","this":"and","that":[9,8,7]}

只需通读这些文档——这只是一个偶然的机会:您是否检查了要发送的行尾字符?这里有这样的信息:“注意:如果一行不包含冒号,则整行将被视为字段名,并带有一个空值字符串。”这是否意味着我在event:time之后需要一个冒号?我会再次检查:
然后必须通过逐行读取所有内容来解析流,使用U+000D回车U+000A换行符(CRLF)字符对、一个U+000A换行符(LF)字符(不在U+000D回车(CR)字符之前)和一个U+000D回车符(CR)字符后面不跟U+000A换行符(LF)字符是一行可以结束的方式。
@jeremyJStarcher谢谢你的帮助!但我想我不明白你刚刚发布的内容。回车U+000A是一个新行,对吧,与冒号无关。那么我到底做错了什么呢?P.S.忘了那个明目张胆的插件:我在我的书《数据推送应用》第8章中讲述了
事件:
行使用HTML5 SSE。我不使用它的主要原因是这本书展示了如何支持旧浏览器,而使用事件行会使一切变得更加复杂。第二个原因是,对于SSE的典型用例,它没有任何优势。