javascript - EventSource 监听器不会在 Firefox 中的页面加载时触发

标签 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),然后服务器将数据发送回上面注册的监听器。

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

但是,在 Firefox 上,监听器不会以任何方式使用react。

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

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

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

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

谢谢。

最佳答案

最终更新

将此移至单独的帖子:

https://stackoverflow.com/questions/13159977


===更新===

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

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

现在使用丑陋的 hack:

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_file_runner 时,连接已经建立。

firefox除外,firefox是后连接的。

不知道如何以及为什么。

修复很简单:

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

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

关于javascript - EventSource 监听器不会在 Firefox 中的页面加载时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804074/

相关文章:

javascript - Autofocus 在 Firefox 上不起作用,在来自另一个页面时不起作用

javascript - 在服务器端截取 Flash 游戏/动画的屏幕截图? (或者客户端?)

javascript - 检测点击任何子节点并在 JavaScript 中获取其 ID 属性

javascript - PrototypeJS 库与 Firefox 扩展兼容?

html - 为什么尝试使用 SSE 时 DeferredResult 在 setResult() 上结束

javascript - HTML SSE 请求正文

node.js - 服务器发送的事件在简单快速 SSE 的 chrome devtools 中显示为空白

javascript - 过滤拒绝的 promise

javascript - jQuery .after() 在 IE 中不工作

javascript - 浏览器中 location.hash 的最大大小