我要开发一个彗星编程框架,我不能使用Web套接字或服务器发送事件(因为浏览器支持真的很糟糕(。因此,我需要保持 HTTP 连接处于活动状态,并将分块数据发送回客户端。
但是,当您进入工作时,问题就会显现出来:
- 使用 XMLHttpRequest 是不可能的,因为 IE 不会给你
xhr.responseText
,而xhr.readyState
是 3。 - 隐藏
iframe
没有用,因为当我将数据发送回客户端时,浏览器会显示加载程序。 - 我尝试将 JavaScript 文件发送回客户端,每次都发送函数执行命令,但浏览器在完全加载之前不会执行 JavaScript。
但是,当我查看Lightstreamer演示页面时,我看到它一点一点地将JavaScript文件发送回客户端,并且在每一步中,它都会向函数发送调用,并且该函数只是被执行(我不能做这部分(。Lightstreamer似乎使用AJAX,因为请求只是显示在Firebug的控制台选项卡中,但它在IE中也像一个魅力。
我尝试使用他们在请求中设置的每个 HTTP 标头字段,但没有结果。我也尝试使用HTTP Post而不是HTTP Get,但仍然没有结果。
我已经阅读了近20篇关于如何实现彗星的文章,但似乎没有一篇能解决我遇到的问题:
- 如何使其跨浏览器?
- 当新数据从服务器到达时如何获得通知(我应该挂接到什么事件(? 如何
- 使我的页面向用户显示为完全加载(如何实现它,以便浏览器不显示加载活动(?
谁能帮忙?我认为应该有一个我不知道的非常小的提示或技巧将所有概念粘合在一起。有谁知道Lightstreamer是如何克服这些问题的?
SockJS作者在这里。
- 如何使其跨浏览器?
这很难,预计要花几个月的时间在歌剧和IE上获取流媒体传输。
- 当新数据从服务器到达时如何获得通知(我应该挂接到什么事件(?
有多种技术,具体取决于特定的浏览器。为了获得良好的介绍,请查看 Socket.IO 和SockJS支持的不同回退协议。
如何
- 使我的页面向用户显示为完全加载(如何实现它,以便浏览器不显示加载活动(?
同样,有特定于浏览器的技巧。一种是在加载事件后延迟加载 AJAX。另一种是从 DOM 绑定和解绑 iframe。如果您仍然感兴趣,请阅读SockJS或 Socket.io 代码。
谁能帮忙?我认为应该有一个我不知道的非常小的提示或技巧将所有概念粘合在一起。有谁知道Lightstreamer是如何克服这些问题的?
基本上,除非你有非常充分的理由,否则不要重新发明轮子。使用SockJS,Socket.io,faye或任何其他已经解决这个问题的数十个项目。
你想要的方法是流式处理。
如何使其跨浏览器?
考虑到大多数浏览器,没有一致的方法。您必须根据浏览器选择合适的交通工具。更糟糕的是,您必须依靠浏览器嗅探来识别正在使用的浏览器,而功能检测对此毫无意义。您可以使用 XDomainRequest for IE8+、XMLHttpRequest for non-IE 和 Iframe for IE 6+。尽可能避免 iframe 传输。
当新数据从服务器到达时如何获得通知(我应该挂接到什么事件(?
这根据所使用的交通工具而有所不同。例如,XDomainRequest 触发进度事件,XMLHttpRequest 在块到达时触发 readystatechange 事件,但 Opera 和 IE 除外。
如何使我的页面向用户显示为完全加载(如何实现它,以便浏览器不显示加载活动(?
我不知道iframe的这个问题,但仍然发生在基于WebKit的浏览器中,例如Chrome和带有XMLHttpRequest的Safari。避免这种情况的唯一方法是在窗口的onload事件之后进行连接,但是,在Safari的情况下,这不起作用。
除了上述问题之外,您还必须考虑一些问题。
- 事件驱动的服务器 - 服务器应该能够异步处理。
- 传输要求 - 服务器的行为与所需的传输不同。
- 流格式 - 如果服务器要在单个块中发送大消息或多个消息,则单个块并不意味着单个数据。它可以是单个数据的片段或多个数据的串联。要识别什么是数据,应格式化响应。
- 错误处理 - Iframe 传输不提供任何断开连接的证据。
- 。
最后但并非最不重要的一点是,实现流式传输非常令人厌烦,而不是与长轮询不同。我建议你使用可靠的框架来做到这一点,比如我创建和管理的socketio,sockjs和jquery套接字。
祝你好运。
但是浏览器在完全加载之前不会执行JavaScript。
您是否尝试过发回包装在 <script>
标记中的代码?例如,代替:
<script type="text/javascript">
f(...data1...);
f(...data2...);
尝试
<script type="text/javascript">f(...data1...);</script>
<script type="text/javascript">f(...data2...);</script>
在您的情况下,最好的选择是在服务器端使用 JSONP + Long Pulling。您只需要记住在连接断开(超时(或收到响应时重新连接。
jquery 中的示例代码:
function myJSONP(){
$.getScript(url, {
success: function(){
myJSONP(); //re-connect
},
failure: function(){
myJSONP(); //re-connect
}
})
}
显然,你从服务器发出的响应必须是将调用全局函数的javascript代码。
或者,您可以使用一些jquery JSONP插件。
或者看看这个项目 http://www.meteor.com/(真的很酷,但没有尝试(