Ссылки Ajax в Internet Explorer 7 загружаются только один раз

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
13
0
8 107
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

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

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

Как именно вам установить эти заголовки? Могу ли я использовать функцию PHP header ()? Что-то в HTML? Я немного запутался.

stillinbeta 29.10.2008 15:07

Да, функцию PHP header () можно использовать для добавления этих

Mark Renouf 13.02.2009 19:10

А в ColdFusion вы можете использовать тег cfheader для их передачи с использованием атрибутов name и value. По какой-то причине мне пришлось добавить no-store в Cache-Control, и, конечно, в IE 8 даже это не сработало, но, по крайней мере, это было в IE 7 и Firefox 3.

Dave DuPlantis 21.05.2009 22:28
Ответ принят как подходящий

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

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

По моему опыту, добавление всех трех заголовков, которые я опубликовал выше, предотвратит кеширование IE, без необходимости добавлять случайное число.

pkaeding 29.10.2008 00:29

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

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

var xmlHttp = new XMLHttpRequest();

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

Спасибо, это помогло. Однако следует отметить, что мне нужно переместить обработчик событий внутри функции, чтобы он имел возможность читать переменную xmlHttpRequest.

stillinbeta 29.10.2008 14:54

При более внимательном рассмотрении кажется, что это не решило проблему.

stillinbeta 29.10.2008 15:01

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

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

Прочтите раздел "Нет проблем" в [текст ссылки] [1] [1]: http://en.wikipedia.org/wiki/XMLHttpRequest

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

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

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

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

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

Другие вопросы по теме