5

对于动态页面,我使用 Ajax Long Polling,即使使用 jQuery 1.9,Internet Explorer 在第一次请求后也会挂起。

脚本代码基于文章Simple Long Polling Example with JavaScript and jQuery

 <script type="text/javascript" charset="utf-8"> 
   $(document).ready(function(){ 
     (function poll(){
       $.ajax({ url: "ajaxstats.json", success: function(data){
         $("button.requests" ).empty().append(data.requests);
   }, dataType: "json", complete: poll, timeout: 30000 });
     })();
   });
 </script>

控制台显示没有错误。

ajaxstats.jsonIE 网络监视器立即显示对资源的许多请求,响应时间 < 1 ms304 (not modified)响应代码。响应正文正确(JSON 代码)。

服务器代码总是将答案延迟 1000 毫秒。在 Firefox 中,Firebug XHR 日志显示每个请求大约需要 1000 毫秒,正如预期的那样。

Firefox 和 Internet Explorer 的 HTTP 响应代码不同:

  • 在 Firefox 中:响应代码是200 ok
  • 在 Internet Explorer 9 中,响应代码为304 (not modified)

有没有办法解决这个 IE 问题?

4

3 回答 3

7

尝试将缓存参数设置为false,如果设置为false,它将强制浏览器不缓存请求的页面。

 <script type="text/javascript" charset="utf-8"> 
   $(document).ready(function(){ 
     (function poll(){
       $.ajax({ url: "ajaxstats.json", success: function(data){
         $("button.requests" ).empty().append(data.requests);
   }, dataType: "json", complete: poll, timeout: 30000, cache: false });
     })();
   });
 </script>
于 2013-01-31T14:27:33.590 回答
3

使用setTimeout文章上的版本。该timeout选项设置请求的超时时间,而不是等待下一个请求的时间。

有对来自 Lars 的评论的回复,作者提出了这一点。

于 2013-01-31T14:25:53.577 回答
1

除了 IE9 很慢之外,我没有很好的答案来解释为什么 IE9 会挂起。调用 ajax 调用的回调将间歇性地花费很长时间。在工作中进行测试时,我发现在 IE9 中针对同一台服务器执行相同的 ajax 调用所花费的时间是 Firefox 中的 5 倍以上,即使浏览器在同一台机器上运行也是如此。

如果您正在构建一个实时应用程序并且可以访问它运行的实际服务器,我强烈建议您使用 Socket.IO。 http://socket.io/ 最初它是为 node.js 构建的,但现在大多数主要语言都有服务器端实现。

客户端库有这个后备顺序:

  • 网络套接字
  • Adobe Flash 插座
  • AJAX 长轮询
  • AJAX 多部分流式传输
  • 永远的 iframe
  • JSONP 轮询

在较新的浏览器上,您可以获得真正的 Web 套接字性能,在那些不支持它的浏览器上,您可以获得免费的长轮询,但您可以使用相同的干净 Socket.IO 接口将其视为 Web 套接字。

于 2013-01-31T14:36:57.093 回答