当它在其他(所有)浏览器中工作时,我在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
谢谢。
答案 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
。