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();

внутри функции выбора.

Ответ 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.

Ответ 8

Используя Dojo, это можно сделать с помощью dojo.date.stamp, просто добавив следующее к URL:

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