长轮询jQuery在IE中不起作用

4

$.ajax在IE中似乎无法工作。我该怎么办?这是IE的另一个bug吗?我需要提供我的代码来获得帮助吗?因为它似乎不能与任何$ .ajax示例一起使用。

我的代码:

function get_info(lines) {
    $.ajax({
        type: "POST",
        cache: false,
        url:  "chat.php?RandomNumber=" + Math.random(),
        data: "type=get_info&lines="+lines+"&RandomNumber=" + Math.random(),
        dataType: "json",
        success: function(msg){
          lines = msg.lines;

          if(msg.new_messages)
          {
            for(i = 0; i < msg.messages.length; i++)
            {
                $('.chat').append("<p>"+msg.messages[i]+"</p>");      
            }
            document.getElementById('chatty').scrollTop = document.getElementById('chatty').scrollHeight;
          }
        },
        complete: function() {
            setTimeout(get_info, 1000, lines); 
        }
    })    

};    

setTimeout(get_info, 1000, 0); 

2
请提供您的代码。 - Cfreak
2
IE在处理AJAX时可能会有些问题。它可能会缓存正在请求的页面,导致更新无法进行。解决这个问题的方法是确保每个AJAX请求在某种程度上是唯一的。话虽如此,问题也可能出在你的代码上! - James
@jayp:如何使“AJAX请求在某种方式上是唯一的”? - good_evening
最简单的方法是包含一个查询字符串,每次发出请求时都会递增。创建一个Javascript变量,将其包含在AJAX请求中,并在每次轮询服务器时递增它。 - James
我不使用jQuery,我使用普通的JavaScript - 如果您愿意,我可以创建一个示例! - James
显示剩余2条评论
2个回答

4

我现在看到您正在使用一种在IE浏览器上无法正常工作的setTimeout形式1, 2:

setTimeout(myFunction,myTimeout,parameter); //does NOT work for IE

不要直接使用函数作为参数,而是使用匿名函数来调用带有正确参数的目标函数:

setTimeout(function(){myFunction(myParameter);},myTimeout);

因此,您对setTimeout的初始调用应更改为:

setTimeout(function(){get_info(0);}, 1000); 

随后对 success 的调用应该是:

setTimeout(function(){get_info(lines);}, 1000); 

如果这是因为IE缓存了您的GET请求,您可以简单地为jQuery.ajax()设置cachefalse,让jQuery替您处理它(记得在更改后清除缓存):
//do this for *all* ajax requests
$.ajaxSetup ({
    cache: false
});

或者

//do it for this ajax request
$.ajax ({
    cache: false,
    //..other options here
});

嘿,我已经编辑了我的答案,我认为问题出在你使用的setTimeout上,将参数作为setTimeout的最后一个参数传递似乎不受IE支持。 - no.good.at.coding
这简直难以置信...谢谢 :) - good_evening
非常感谢 $.ajaxSetup ({ cache: false });,我遇到了类似的问题,这个方法解决了我的困扰。不需要缓存真是太棒了 :( - Davy8

1
在您的数据中添加时间戳以消除IE缓存。
    var timestamp = new Date();
    $.ajax({
        url: "/toto",
        data: { ....., timestamp: timestamp.getTime() },
        ...
    });

例如,像'random_num'一样发送参数,使用Math.random()*Math.random() - Tanner Ottinger
@Tanner Ottinger:我已经编辑了我的回答并附上了一些代码,请查看。 - good_evening

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接