我正在编写一个应用程序,我正在尝试将简单的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;
}
任何帮助都将不胜感激。
答案 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-cache
和Pragma: no-cache
一起使用。
答案 5 :(得分:0)
xmlHttp.open( “GET”, “blurb.php?” +的Math.random();
我同意这一点......它完美地解决了这个问题。 问题是IE7的网址缓存非常糟糕,忽略了无缓存标头并使用其url作为密钥索引将资源保存到其缓存中,因此最好的解决方案是向GET网址添加随机参数。
答案 6 :(得分:0)
在jQuery.ajax中,您可以将“cache”设置为false:
答案 7 :(得分:0)
使用Dojo,可以使用dojo.date.stamp
完成,只需将以下内容添加到网址:
"...&ts=" + dojo.date.stamp.toISOString(new Date())