Ссылки Ajax в Internet Explorer 7 загружаются только один раз - PullRequest
13 голосов
/ 29 октября 2008

Я пишу приложение и пытаюсь связать простую функциональность 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;
}

Любая помощь будет оценена.

Ответы [ 8 ]

16 голосов
/ 29 октября 2008

Это происходит потому, что Internet Explorer игнорирует директиву no-cache и кэширует результаты вызовов ajax. Затем, если следующий запрос будет идентичным, он будет просто обслуживать кэшированную версию. Есть простой обходной путь, и это просто добавление случайной строки в конце вашего запроса.

 xmlHttp.open("GET","blurb.php?"+Math.random();
6 голосов
/ 29 октября 2008

Похоже, IE кеширует ответ. Если вы либо измените свои вызовы на методы POST, либо отправите соответствующие заголовки, чтобы сообщить IE не кэшировать ответ, это должно сработать.

Заголовки, которые я отправляю, чтобы убедиться, что они не кэшируются:

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

Обратите внимание, что срок годности может быть в любое время в прошлом.

3 голосов
/ 29 октября 2008

Проблема в том, что IE делает дурацкие вещи, когда обработчик ответа установлен до вызова open. Вы не делаете этого для первого запроса xhr, но поскольку вы повторно используете объект xhr, когда вызывается второе открытие, обработчик ответа уже установлен. Это может сбивать с толку, но решение простое. Создайте новый объект xhr для каждого запроса:

переместить:

var xmlHttp = new XMLHttpRequest();

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

1 голос
/ 13 апреля 2009

Ответный заголовок, который лучше всего подходит для меня в случае IE AJAX, - Expires: -1, что, вероятно, не соответствует спецификации, но упоминается в статье поддержки Microsoft ( Как предотвратить кэширование в Internet Explorer ) , Это используется в сочетании с Cache-Control: no-cache и Pragma: no-cache.

1 голос
/ 11 февраля 2009

Читать без проблем в [текст ссылки] [1] [1]: http://en.wikipedia.org/wiki/XMLHttpRequest

0 голосов
/ 04 ноября 2012

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

"...&ts=" + dojo.date.stamp.toISOString(new Date())
0 голосов
/ 14 марта 2012

В jQuery.ajax вы можете установить для параметра «cache» значение false:

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

0 голосов
/ 10 декабря 2008

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

Я согласен с этим .. он отлично работает как решение этой проблемы. проблема в том, что кеширование URL в IE7 было ужасным, игнорируя заголовок no-cache и сохраняя ресурс в своем кеше, используя его URL в качестве индекса ключа, поэтому лучшее решение - добавить случайный параметр в URL GET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...