3

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

初始化 EventSource 并注册一个监听器:

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

output.addEventListener('shell_stream', function(e) {
    $('#shell-output').append(e.data + "<br/>");
}, false);

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

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

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

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

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

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

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

谢谢你。

4

1 回答 1

2

最终更新

将此移至单独的帖子:

https://stackoverflow.com/questions/13159977


=== 更新 ===

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

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

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

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仅在建立连接后执行。

于 2012-10-30T23:40:02.213 回答