【问题标题】:jQuery 1.9 - Internet Explorer 9 freezes after first $ajax requestjQuery 1.9 - Internet Explorer 9 在第一次 $ajax 请求后冻结
【发布时间】:2013-01-15 15:49:39
【问题描述】:

对于dynamic page,我使用 Ajax 长轮询,即使使用 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>

控制台没有显示错误。

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

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

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

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

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

【问题讨论】:

  • 控制台有错误吗? http 流量呢?
  • @jbabey 看到我的编辑,我会用我在 Firefox 中的发现更新它
  • 你清除缓存了吗?您正在发出一个 GET 请求,该请求将缓存 http 响应。如果您希望 jQuery 在调用中添加缓存中断查询字符串参数,请将缓存选项设置为 ajax 调用。
  • 在旁注中,链接文章中的一个 cmets 已经涵盖了这一点:“你确定 $.ajax 中的超时参数是这样工作的,即将下一次执行延迟至少 30 “
  • @jbabey 我想这是按设计的,我正是出于这个原因延迟了响应 - 避免客户端超载。换句话说:服务器控制下一次刷新页面的时间。

标签: javascript jquery ajax internet-explorer-9


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    Lars 的评论中有一个reply,这是作者的建议。

    【讨论】:

    • +1 - 另一个答案也很有效 - 很难说哪个是“最好的”
    • 事实上,我认为你有两个问题:一个是得到一个缓存响应,这可能太快了,IE 似乎没有正确处理它,立即开始下一个请求。另一个问题是您希望长轮询的工作方式:它不会在下一个请求之前等待 30 秒,而您可以使用 setTimeout 版本完成什么。
    • 想法不是在下一个请求之前等待30秒,而是保持与服务器的连接打开并调用轮询函数并重新启动轮询过程(重新打开连接),一旦成功或错误回调被执行。
    【解决方案3】:

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

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

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

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

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

    【讨论】:

    • 只是一个提醒。如果您在 Windows Vista 及更高版本中使用带有库缓存的 SO,那么在使用您曾经使用过的程序时,您将获得性能提升,因为所需的库已经缓存到内存中。
    猜你喜欢
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多