Javascript 在Firefox中加载页面时不会触发EventSource侦听器

Javascript 在Firefox中加载页面时不会触发EventSource侦听器,javascript,firefox,server-sent-events,Javascript,Firefox,Server Sent Events,当它在其他(所有)浏览器中工作时,我对它在Firefox中不工作的原因感到有点困惑 初始化EventSource并注册侦听器: var output = new EventSource('/subscribe'); output.addEventListener('shell_stream', function(e) { $('#shell-output').append(e.data + "<br/>"); }, false); var output=newevents

当它在其他(所有)浏览器中工作时,我对它在Firefox中不工作的原因感到有点困惑

初始化EventSource并注册侦听器:

var output = new EventSource('/subscribe');

output.addEventListener('shell_stream', function(e) {
    $('#shell-output').append(e.data + "<br/>");
}, false);
var output=neweventsource('/subscribe');
output.addEventListener('shell_stream',函数(e){
$(“#shell输出”).append(e.data+”
); },假);
然后在页面加载时,我查看查询字符串,如果有文件和run操作,我将它们发送到服务器(通过ajax),服务器将数据发送回上面注册的侦听器

对脚本进行了大量调试。 它确实发送请求并接收有效响应,并且服务器确保向侦听器发送数据

但是,在Firefox上,侦听器不会做出任何反应

值得注意的是,如果用户单击Run按钮,监听器的工作会非常完美,该按钮调用的函数与在查询字符串中找到文件和运行时在页面加载时调用的函数完全相同

另外,如果我在页面加载时触发一个
警报()
,然后用户单击它,监听器就会工作

以下是可在各种浏览器中尝试的实时链接:

谢谢。

最终更新 将此移动到另一个帖子:


==更新===

忘记/错过了每隔N秒调用一次onopen)

所以我的文件一直在运行:)

现在使用一个丑陋的黑客:

initialized = false;
var output = new EventSource( ... );

output.onopen = function() {
  if(initialized) return true;
  initialized = true;

  ...
  invoke_file_runner( ... );
}
已初始化
确保它只运行一次


找到了

我的代码如下所示:

var output = new EventSource( ... );
...
invoke_file_runner( ... );
有趣的是,当执行
invoke\u file\u runner
时,所有浏览器上的连接都已建立

firefox除外,firefox之后会建立连接

不知道如何和为什么

解决方法很简单:

var output = new EventSource( ... );
output.onopen = function() {
  ...
  invoke_file_runner( ... );
}

这将确保只有在建立连接后才执行调用文件运行程序。

在EventSource HTTP请求连接到服务器之前,服务器是否会尝试将数据发送到EventSource?所编写的代码看起来像EventSource和随后立即触发的XHR,但这实际上取决于服务器在获得XHR时做了什么。不,我也有同样的想法。它肯定只有在连接后才会发送请求。好的,所以我刚刚完成了这一步。当页面加载时,浏览器在事件源的HTTP连接上获得136字节的响应。响应有两个rpc_流事件:进度条上的显示和进度条上的隐藏。当我点击“运行”按钮时,我会看到进度条的另一个显示,然后是一个216字节的块,它有几个shell_流事件,然后是另一个rpc_流来隐藏进度条。因此,在原始加载时,服务器似乎没有发送shell_流事件……好吧,那么它在其他浏览器中是如何工作的呢?还有,为什么在加载时我会做一个简单的
警报('something')
并且用户单击它,流将在不单击Run按钮的情况下工作。它与用户交互有关,比如流只有在用户以某种方式与页面交互后才能工作。我最好的猜测是,您仍然在某个地方存在竞争,这导致您的服务器根据接收的请求顺序发送错误的内容。这就是它在其他浏览器中的工作方式,以及如果有什么事情改变了这里的事件时间(一个
alert()
就可以了)。你可以通过在加载setTimeout期间做任何你正在做的工作来测试这个理论……哈哈,看来我可以接受我自己的答案,但我的观点在哪里呢?:)此外,还可以使用一次事件侦听器
output.addEventListener(“open”、/*func*/,{once:true})