jQuery 1.9 - Internet Explorer 9 在第一次$ajax请求后冻结

jQuery 1.9 - Internet Explorer 9 freezes after first $ajax request

本文关键字:ajax 请求 冻结 第一次 Internet Explorer jQuery      更新时间:2023-09-26

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

脚本代码基于文章 使用 JavaScript 和 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>

控制台未显示任何错误。

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

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

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

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

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

尝试将缓存参数设置为 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>

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

有一个回复来自拉尔斯的评论,作者建议这样做。

除了

IE9很慢之外,我对IE9挂起的原因没有很好的答案。 调用 ajax 调用的回调将间歇性地花费很长时间。 在工作中进行测试,我看到对同一服务器的相同 ajax 调用在 IE9 中花费的时间是 Firefox 中的 5 倍以上,即使浏览器在同一台机器上运行也是如此。

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

客户端库具有以下回退顺序:

  • 网络套接字
  • Adobe Flash Socket
  • AJAX 长轮询
  • AJAX 多部分流式处理
  • 永远的 Iframe
  • JSONP 轮询
在较新的浏览器上,您可以获得真正的Web套接字性能,在不支持

它的浏览器上,您可以免费获得长时间轮询,但您可以使用相同的干净 Socket.IO 界面将其视为Web套接字。