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

时间:2012-10-09 16:08:31

标签: 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);

然后在页面加载时我正在查询查询字符串,如果有文件和运行操作,我将它们发送到服务器(通过ajax),服务器将数据发送回上面注册的监听器。 / p>

调试了很多脚本。 它确实发送请求并接收有效响应,并确保服务器向监听器发送数据。

但是,在Firefox上,监听器不会以任何方式做出反应。

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

此外,如果我在页面加载时触发alert()并且用户单击它,则监听器将起作用!

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

http://cibox.org/slivu/stackoverflow?file=extract-image.rb&run=true

谢谢。

1 个答案:

答案 0 :(得分:2)

最终更新

将其移至另一个帖子:

https://stackoverflow.com/questions/13159977


=== UPDATE ===

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

所以我的文件永远在运行:)

现在使用丑陋的黑客:

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

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

  ...
  invoke_file_runner( ... );
}

initialized确保它只会运行一次。


找到它了!

我的代码如下:

var output = new EventSource( ... );
...
invoke_file_runner( ... );

有趣的是,在invoke_file_runner执行时,已经建立了所有浏览器连接。

除了firefox,之后建立连接。

不知道如何以及为什么。

修复很简单:

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

这将确保仅在建立连接后执行invoke_file_runner