Как предотвратить кеширование jQuery Ajax-запроса в Internet Explorer?


275

Как предотвратить кэширование запроса jQuery Ajax в Internet Explorer?


1
Использование POST вместо GET предотвращает кеширование. stackoverflow.com/questions/6216234/disable-ajax-caching
Прашант Гупта

8
Инструменты YSlow и Chrome dev будут предупреждать вас, если вы используете POST-запросы для AJAX - обычно GET должен быть предпочтительным методом, если вам действительно не нужно POST.
Павел Краковяк

Вот ваш ответ: отключить
кеширование

Ответы:


524

Вы можете отключить кэширование глобально, используя $.ajaxSetup(), например:

$.ajaxSetup({ cache: false });

Это добавляет временную метку к строке запроса при выполнении запроса. Чтобы отключить кэш для определенного $.ajax()вызова, установите cache: falseего локально, например:

$.ajax({
  cache: false,
  //other options...
});

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

2
Я знаю, что это старый ответ, просто интересно, влияет ли это на все вызовы типа ajax (ajax, get и post) или только на конкретные вызовы ajax?
Lumpy

6
@Lumpy, согласно документации jQuery.ajax () , cache: falseбудет корректно работать только с HEAD и GET-запросами. Кроме того, если вы установите cache: falseв $.ajaxSetupсоответствии с документацией jQuery.ajaxSetup () , он «установит значения по умолчанию для будущих запросов Ajax». Так что да, он отключит кеш для всех будущих запросов HEAD и GET AJAX.
Джон Уошам

11
Предупреждение: это добавляет «? _ = Somenumber» к вашему URL. Убедитесь, что ваш сервер может игнорировать "_" в параметрах запроса URL.

4
+1 за cache: false. Выключение кэширования в глобальном масштабе кажется излишним, но иметь контроль над запросом - это прекрасно. Спасибо
ушел кодирование

21

Если вы устанавливаете уникальные параметры, то кеш не работает, например:

$.ajax({
    url : "my_url",
    data : {
        'uniq_param' : (new Date()).getTime(),
        //other data
    }});

13
Это то, что cacheпараметр уже делает за кадром.
Хосе Руи Сантос

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

@bladefist вы, кажется, столкнулись с той же проблемой, что и я. Знаете ли вы, есть ли другие варианты, кроме изменения данных, чтобы IE прекратил кэширование? Причина, по которой я спрашиваю, состоит в том, что мои запросы на самом деле не используют «данные», и все данные идут вместе с URL.
Бадри

1
На самом деле, это именно то, что кеш должен делать за кулисами согласно этой информации из - api.jquery.com/jquery.ajax cache (по умолчанию: true, false для dataType 'script' и 'jsonp') Тип: Boolean Если установлено в false это заставит запрашиваемые страницы не кэшироваться браузером. Примечание. Установка для кэша значения false будет корректно работать только с запросами HEAD и GET. Это работает путем добавления "_ = {timestamp}" к параметрам GET.
Бадри

@bladefist Это ясно говорит, что он собирается добавить временную метку к параметрам GET. Вы удивляетесь, почему код, предоставленный Koss, работает для вас, а отключение локального или глобального кэша - нет?
Бадри

12
Cache-Control: no-cache, no-store

Эти два значения заголовка могут быть объединены, чтобы получить требуемый эффект как в IE, так и в Firefox.


12
Проблема в том, что IE не всегда слушает это, к сожалению :)
Ник Крейвер

1
@ Ник, это точно? я не проверял этот Cache-Control. Jquery Ajax chache работает на всех браузерах?

7
Это должно работать во всех браузерах, да ... но иногда IE просто любит кешировать вещи
Ник Крейвер

@Nick - Я установил для Ajax-кэша значение false. Но сообщение об успехе AJAX не попало в IE, а также в FF. Можете ли вы подтвердить мой код? мой код неверен? Спасибо var ajaxfile = base + "index.php / msc / popup_view /" + obj + "/" + id + "/" + no_tab; $ .ajax ({тип: "GET", url: ajaxfile, // contentType: "application / json; charset = utf-8", кеш: false, success: function (msg) {$ ("# popup"). html (msg);}});
САБУ

Я только что подтвердил, что IE11 игнорирует этот заголовок. Chrome также выдал ошибку CORS.
Ленин

5

Вот ответное предложение:

http://www.greenvilleweb.us/how-to-web-design/problem-with-ie-9-caching-ajax-get-request/

Идея состоит в том, чтобы добавить параметр в ваш ajax-запрос, содержащий, например, текущую дату и время, чтобы браузер не смог его кешировать.

Посмотрите на ссылку, это хорошо объяснено.


13
Это то, что cacheпараметр уже делает за кадром.
Хосе Руи Сантос

1

Вы можете определить это так:

let table = $('.datatable-sales').DataTable({
        processing: true,
        responsive: true,
        serverSide: true,
        ajax: {
            url: "<?php echo site_url("your url"); ?>",
            cache: false,
            type: "POST",
            data: {
                <?php echo your api; ?>,
            }
        }

или вот так:

$.get({url: <?php echo json_encode(site_url('your api'))?>, cache: false})

Надеюсь, поможет


-4

Это старый пост, но если IE доставляет вам неприятности. Измените ваши запросы GET на POST, и IE больше не будет их кешировать.

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


Я не думаю, что вы должны злоупотреблять действиями HTTP. Настройки cache:falseв каждом конкретном случае это путь.
Томмибонд
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.