Як запобігти кеш-запиту jQuery Ajax в Internet Explorer?


275

Як запобігти кеш-запиту jQuery Ajax в Internet Explorer?


1
Використання POST замість GET запобігає кешування. stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta

8
Інструменти розробки YSlow та Chrome розробники попередить вас, якщо ви використовуєте POST-запити для AJAX - зазвичай GET повинен бути кращим методом, якщо вам дійсно не потрібно POST.
Pawel Krakowiak

Відповіді:


524

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

$.ajaxSetup({ cache: false });

Це додає часову позначку до рядка запиту під час оформлення запиту. Щоб вимкнути кеш-пам'ять для певного $.ajax()дзвінка, встановіть cache: falseйого локально, наприклад:

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

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

2
Я знаю, що це стара відповідь, просто цікаво, чи впливає це на всі програми Ajax, як дзвінки (ajax, отримати та відправити повідомлення) або лише на конкретні дзвінки ajax?
Грудкий

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

11
Слова застереження: це додасть "? _ = Дещо число" до вашої 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-адресою.
badri

1
Власне, це, безумовно, те, що кеш повинен робити за кадром, згідно з цією інформацією з - кеш api.jquery.com/jquery.ajax (за замовчуванням: true, false для dataType 'script' та 'jsonp') Тип: Boolean Якщо встановлено в помилковому значенні, це змусить браузер не кешувати запитувані сторінки. Примітка. Якщо встановити кеш на значення false, коректно працюватиме лише із запитами HEAD та GET. Він працює, додаючи "_ = {timestamp}" до параметрів GET.
badri

@bladefist Це чітко говорить про те, що він додає часові позначки до параметри GET. тож цікаво, чому код, наданий Коссом, працює для вас, а відключення локального чи глобального кешу не працює?
badri

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

Ці два значення заголовка можна комбінувати для отримання необхідного ефекту як для IE, так і для Firefox


12
Проблема полягає в тому, що IE не завжди це слухає, на жаль :)
Нік Крейвер

1
@Nick, це точно? я не перевіряв цей кеш-контроль. Чи працює програма Jquery Ajax на всіх браузерах?

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, успіх: функція (msg) {$ ("# спливаюче вікно"). html (msg);}});
SABU

Я щойно підтвердив, що 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в кожному конкретному випадку - це шлях.
tommybond
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.