Jak zapobiec buforowaniu żądań Ajax jQuery w Internet Explorerze?


275

Jak zapobiec buforowaniu żądania Ajax jQuery w Internet Explorerze?


1
Użycie POST zamiast GET zapobiega buforowaniu. stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta

8
Narzędzia deweloperskie YSlow i Chrome ostrzegą cię, jeśli używasz żądań POST dla AJAX - ogólnie GET powinna być preferowaną metodą, chyba że naprawdę potrzebujesz POST.
Paweł Krakowiak

Odpowiedzi:


524

Możesz wyłączyć buforowanie globalnie $.ajaxSetup(), na przykład:

$.ajaxSetup({ cache: false });

To dodaje znacznik czasu do kwerendy podczas wysyłania żądania. Aby wyłączyć pamięć podręczną dla określonego $.ajax()połączenia, ustaw cache: falseją lokalnie, w następujący sposób:

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

2
Szkoda, że ​​nie widziałem wcześniej tego elementu konfiguracji globalnej. Właśnie uratowałem mnie przed aktualizacją dziesiątek indywidualnych połączeń.
James Skemp

2
Wiem, że to stara odpowiedź. Zastanawiam się, czy to dotyczy wszystkich wywołań typu ajax (ajax, get i post), czy tylko określonych wywołań ajax?
Lumpy

6
@Lumpy, zgodnie z dokumentacją jQuery.ajax () , cache: falsebędzie działał poprawnie tylko z żądaniami HEAD i GET. Ponadto, jeśli ustawisz cache: falsew $.ajaxSetupwedług jQuery.ajaxSetup () dokumentację , to będzie „ustawione wartości domyślne dla przyszłych żądań Ajax”. Tak więc, wyłączy pamięć podręczną dla wszystkich przyszłych żądań HEAD i GET AJAX.
John Washam,

11
Uwaga: dodaje to „? _ = Somenumber” do twojego adresu URL. Upewnij się, że zaplecze może zignorować „_” w parametrach zapytania adresu URL.

4
+1 dla cache: false. Globalne wyłączenie buforowania wydaje się przesadą, ale kontrola nad żądaniem jest idealna. Dzięki
kodowania

21

Jeśli ustawisz unikalne parametry, pamięć podręczna nie będzie działać, na przykład:

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

13
To właśnie robi cacheparametr już za kulisami.
Jose Rui Santos

Powyższy kod ajaxSetup nie działał dla mnie, nie spędziłem dużo czasu na zastanawianiu się, dlaczego. Zmienne globalne są złe i czasami chcesz buforować. Ta odpowiedź jest moim zdaniem najlepsza.
bladefist

@bladefist, masz chyba ten sam problem co ja. Czy wiesz, czy oprócz zmiany danych istnieją inne opcje, które powodują, że IE przestaje buforować? Pytam, ponieważ moje żądania w rzeczywistości nie wykorzystują „danych”, a wszystkie dane są zgodne z adresem URL.
badri

1
Właściwie to z pewnością jest to, co powinna robić pamięć podręczna za kulisami, zgodnie z tymi informacjami z - api.jquery.com/jquery.ajax cache (domyślnie: true, false dla dataType „script” i „jsonp”) Typ: Boolean Jeśli ustawiony w przypadku wartości false wymusi to, że żądane strony nie będą buforowane przez przeglądarkę. Uwaga: Ustawienie wartości false w pamięci podręcznej będzie działać poprawnie tylko z żądaniami HEAD i GET. Działa poprzez dołączenie „_ = {timestamp}” do parametrów GET.
badri,

@bladefist Wyraźnie mówi, że dołącza znacznik czasu do parametrów GET. więc zastanawiam się, dlaczego kod dostarczony przez Kossa działa dla Ciebie, a wyłączenie lokalnego lub globalnego bufora nie?
badri

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

Te dwie wartości nagłówka można łączyć, aby uzyskać wymagany efekt zarówno w przeglądarce IE, jak i Firefox


12
Problem polega na tym, że IE nie zawsze tego słucha, niestety :)
Nick Craver

1
@Nick, czy to pewne? nie testowałem tego Cache-Control. Czy pamięć podręczna Jquery Ajax działa we wszystkich przeglądarkach?

7
To powinno działać na wszystkich przeglądarkach, tak ... ale czasami po prostu lubi IE buforować piekło rzeczy
Nick Craver

@Nick - ustawiłem pamięć podręczną ajax na false, ale komunikat o sukcesie ajax nie dostał się w IE, a także w FF. Czy możesz zweryfikować mój kod? czy mój kod jest nieprawidłowy? Dzięki var ajaxfile = base + "index.php / msc / popup_view /" + obj + "/" + id + "/" + no_tab; $ .ajax ({type: "GET", url: ajaxfile, // contentType: "application / json; charset = utf-8", pamięć podręczna: false, sukces: funkcja (msg) {$ ("# popup"). html (msg);}});
SABU

Właśnie potwierdziłem, że IE11 ignoruje ten nagłówek. Chrome zgłosił również błąd CORS.
Lenin,


1

możesz to zdefiniować w następujący sposób:

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; ?>,
            }
        }

lub tak:

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

mam nadzieję, że to pomoże


-4

To jest stary post, ale jeśli IE sprawia ci problemy. Zmień swoje żądania GET na POST, a IE nie będzie ich już buforować.

Spędziłem zdecydowanie za dużo czasu, zastanawiając się nad tym na własnej skórze. Mam nadzieję, że to pomoże.


Nie sądzę, że powinieneś niewłaściwie wykorzystywać akcje HTTP. Najlepszym rozwiązaniem są ustawienia cache:falsedla poszczególnych przypadków.
tommybond
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.