Jquery.get () не работает в IE8 / 9. Не загружать кэшированные страницы 304 без изменений - PullRequest
7 голосов
/ 18 января 2012

Code Igniter версия '2.0.3' JQuery 1,7 Плагин Jquery History

Привет, ребята,

У меня есть приложение CodeIgniter, которое я создал в стиле ajax. У меня есть функция следующим образом:

$(document).on('click','.ajax_link',function(e){
    //Stop the normal href action
    e.preventDefault();

    //Grab the destination URL
    var new_url = $(this).attr('href')

    //Grab the content via ajax and pass it to the history change function
    $.get(base_url+new_url,function(data){
        History.pushState({
            content:data.content,
            url:data.url
        }, data.title, data.url);
        //Refresh some site variables
        refresh();
    },'json');
});

Все, что он делает, это фиксирует щелчки на элементах привязки с классом ajax_link и отправляет ответ функции, которая обрабатывает размещение этих данных ответа на странице.

Это работает в Chrome и FF. Я нажимаю на ссылку, jQuery делает запрос get, я возвращаю объект JSON, и моя функция history.pushState () вставляет некоторые данные json на мою страницу.

У меня проблема в IE8. По сути, когда я впервые открываю приложение, ссылки работают, но они работают только один раз. Второй раз, когда я нажимаю на ссылку это:

  • Аякс GET
  • Получает ответ 304 (не изменен)
  • Не вызывает функцию обратного вызова jQuery.get() и, следовательно, останавливается.

Если очистить кеш, он снова заработает. Поэтому я предполагаю, что IE выполняет запрос get, но затем он видит, что он уже запрашивал тот же самый файл в прошлом ... и поэтому полностью останавливает процесс.

Кто-нибудь знает решение этой проблемы? Я искал упоминания о 304 ошибках и ошибках с ajax и кэшированием в IE, но пока не нашел проблемы, идентичной моей.

Любая помощь высоко ценится

(протестировано на виртуальной машине Windows IE8 и в режиме IE 8 в Internet Explorer 9)

решаемые

Просто нужно было добавить следующий код в мою функцию document.ready, и проблема исчезла.

$.ajaxSetup ({cache: false});

Ответы [ 2 ]

5 голосов
/ 18 января 2012

Изменить эту строку:

var new_url = $(this).attr('href')

К этому:

var new_url = $(this).attr('href') + '?' + Math.random();

Это называется "CacheBuster" и эффективно создает URL, похожий на:

"website.com/page.html?1241233"

Это случайное число будет отличаться для каждого клика ".ajax_link", поэтому IE будет думать, что это новая страница, и получит ее правильно.

0 голосов
/ 18 января 2012

У нас была проблема с IE (и Opera) не любит "application / json", где мы должны отобразить ответ как "text / plain".

...