Internet Explorer 7 Ajax связывается только с загрузкой один раз
Я пишу приложение, и я пытаюсь связать простые функции AJAX. Он отлично работает в Mozilla Firefox, но в Internet Explorer есть интересная ошибка: каждую из ссылок можно щелкнуть только один раз. Браузер должен быть полностью перезапущен, просто перезагрузка страницы не будет работать. Я написал очень простое примерное приложение, которое демонстрирует это.
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;
}
Любая помощь будет оценена.
Ответы
Ответ 1
Это происходит потому, что Internet Explorer игнорирует директиву no-cache и кэширует результаты вызовов ajax. Затем, если следующий запрос будет идентичным, он просто будет обслуживать кешированную версию. Там легко обходное решение, и это просто добавить случайную строку в конце вашего запроса.
xmlHttp.open("GET","blurb.php?"+Math.random();
Ответ 2
Похоже, IE кэширует ответ. Если вы либо меняете свои вызовы на методы POST, либо отправляете соответствующие заголовки, чтобы сообщить IE, чтобы он не кэшировал ответ, он должен работать.
Заголовки, которые я отправляю, чтобы убедиться, что они не кэшированы:
Pragma: no-cache
Cache-Control: no-cache
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Обратите внимание, что срок годности может быть в любое время в прошлом.
Ответ 3
Проблема заключается в том, что IE делает пустые вещи, когда обработчик ответа установлен до вызова open
. Вы не делаете этого для первого запроса xhr, но поскольку вы повторно используете объект xhr, когда вызывается второй открытый, обработчик ответа уже установлен. Это может ввести в заблуждение, но решение прост. Создайте новый объект xhr для каждого запроса:
переместите:
var xmlHttp = new XMLHttpRequest();
внутри функции выбора.
Ответ 4
Раздел "Нет проблем" в [текст ссылки] [1] [1]: http://en.wikipedia.org/wiki/XMLHttpRequest
Ответ 5
Заголовок ответа, который работал лучше всего для меня в случае с IE AJAX, это Expires: -1
, который, вероятно, не соответствует спецификации, но упоминается в статье поддержки Microsoft (Как предотвратить кеширование в Internet Explorer). Это используется в сочетании с Cache-Control: no-cache
и Pragma: no-cache
.
Ответ 6
xmlHttp.open( "GET", "blurb.php?" + Math.random();
Я согласен с этим... он отлично работает как решение этой проблемы.
проблема в том, что кэширование URL-адресов IE7 было ужасным, игнорируя заголовок без кэша и сохраняя ресурс в его кеше, используя его url в качестве ключевого индекса, поэтому лучшим решением является добавление случайного параметра к URL-адресу GET.
Ответ 7
В jQuery.ajax вы можете установить для параметра "cache" значение false:
http://api.jquery.com/jQuery.ajax/
Ответ 8
Используя Dojo, это можно сделать с помощью dojo.date.stamp
, просто добавив следующее к URL:
"...&ts=" + dojo.date.stamp.toISOString(new Date())