Internet Explorer 7 Ajax链接仅加载一次

时间:2008-10-28 21:24:42

标签: javascript ajax internet-explorer

我正在编写一个应用程序,我正在尝试将简单的AJAX功能绑定。它在Mozilla Firefox中运行良好,但Internet Explorer中有一个有趣的错误:每个链接只能被点击一次。浏览器必须完全重启,只需重新加载页面就行不通。我写了very simple example application来证明这一点。

Javascript转载如下:

var xmlHttp = new XMLHttpRequest();

/*
item: the object clicked on
type: the type of action to perform (one of 'image','text' or 'blurb'
*/
function select(item,type)
{

    //Deselect the previously selected 'selected' object
    if(document.getElementById('selected')!=null)
    {
        document.getElementById('selected').id = '';
    }
    //reselect the new selcted object
    item.id = 'selected';

    //get the appropriate page
    if(type=='image')
        xmlHttp.open("GET","image.php");
    else if (type=='text')
        xmlHttp.open("GET","textbox.php");
    else if(type=='blurb')
        xmlHttp.open("GET","blurb.php");

    xmlHttp.send(null);
    xmlHttp.onreadystatechange = catchResponse;

    return false;

}
function catchResponse()
{
    if(xmlHttp.readyState == 4)
    {
        document.getElementById("page").innerHTML=xmlHttp.responseText;
    }

    return false;
}

任何帮助都将不胜感激。

8 个答案:

答案 0 :(得分:16)

这是因为Internet Explorer忽略了no-cache指令,并缓存了ajax调用的结果。然后,如果下一个请求相同,它将只提供缓存版本。有一个简单的解决方法,那就是在查询的末尾添加随机字符串。

 xmlHttp.open("GET","blurb.php?"+Math.random();

答案 1 :(得分:6)

看起来IE正在缓存响应。如果要么更改对POST方法的调用,要么发送相应的标头告诉IE不要缓存响应,它应该可以工作。

我发送的标头确保它不缓存:

Pragma: no-cache
Cache-Control: no-cache
Expires: Fri, 30 Oct 1998 14:19:41 GMT

请注意,到期日期可以是过去的任何时间。

答案 2 :(得分:3)

问题在于,在调用open之前设置响应处理程序时,IE会搞错。您没有为第一个xhr请求执行此操作,但由于您重用了xhr对象,因此在调用第二个open时,已经设置了响应处理程序。这可能令人困惑,但解决方案很简单。为每个请求创建一个新的xhr对象:

移动:

var xmlHttp = new XMLHttpRequest();

在select函数内部。

答案 3 :(得分:1)

阅读[link text] [1] [1]中的“无问题”部分:http://en.wikipedia.org/wiki/XMLHttpRequest

答案 4 :(得分:1)

在IE AJAX案例中对我来说效果最好的响应标头是Expires: -1,这可能不是每个规范,但在Microsoft支持文章(How to prevent caching in Internet Explorer)中提到。这与Cache-Control: no-cachePragma: no-cache一起使用。

答案 5 :(得分:0)

  

xmlHttp.open( “GET”, “blurb.php?” +的Math.random();

我同意这一点......它完美地解决了这个问题。 问题是IE7的网址缓存非常糟糕,忽略了无缓存标头并使用其url作为密钥索引将资源保存到其缓存中,因此最好的解决方案是向GET网址添加随机参数。

答案 6 :(得分:0)

在jQuery.ajax中,您可以将“cache”设置为false:

http://api.jquery.com/jQuery.ajax/

答案 7 :(得分:0)

使用Dojo,可以使用dojo.date.stamp完成,只需将以下内容添加到网址:

"...&ts=" + dojo.date.stamp.toISOString(new Date())