Comment empêcher la mise en cache d'une requête jQuery Ajax dans Internet Explorer?


275

Comment empêcher la mise en cache d'une demande jQuery Ajax dans Internet Explorer?


1
L'utilisation de POST au lieu de GET empêche la mise en cache. stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta

8
Les outils de développement YSlow et Chrome vous avertiront si vous utilisez des requêtes POST pour AJAX - généralement GET devrait être la méthode préférée, sauf si vous avez vraiment besoin de POST.
Pawel Krakowiak

Réponses:


524

Vous pouvez désactiver la mise en cache globalement en utilisant $.ajaxSetup(), par exemple:

$.ajaxSetup({ cache: false });

Cela ajoute un horodatage à la chaîne de requête lors de la demande. Pour désactiver le cache pour un $.ajax()appel particulier , définissez- cache: falsele localement, comme ceci:

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

2
J'aimerais avoir déjà vu cet élément de configuration globale. Cela m'a juste évité d'avoir à mettre à jour des dizaines d'appels individuels.
James Skemp

2
Je sais que c'est une vieille réponse, je me demande simplement si cela affecte tous les appels comme ajax (ajax, get et post) ou seulement des appels ajax spécifiques?
Lumpy

6
@Lumpy, selon la documentation de jQuery.ajax () , cache: falsene fonctionnera correctement qu'avec les requêtes HEAD et GET. En outre, si vous définissez cache: falsedans $.ajaxSetup, selon la documentation jQuery.ajaxSetup () , il sera « définir des valeurs par défaut pour les futures demandes Ajax. » Alors oui, cela désactivera le cache pour toutes les futures requêtes HEAD et GET AJAX.
John Washam

11
Un mot d'avertissement: cela ajoute "? _ = Somenumber" à votre URL. Assurez-vous que votre serveur principal peut ignorer le "_" dans les paramètres de requête de l'URL.

4
+1 pour cache: false. Désactiver la mise en cache à l'échelle mondiale semble exagéré, mais avoir un contrôle par demande est parfait. Merci
Gone Coding

21

Si vous définissez des paramètres uniques, le cache ne fonctionne pas, par exemple:

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

13
C'est ce que cachefait déjà le paramètre dans les coulisses.
Jose Rui Santos

Le code ajaxSetup ci-dessus n'a pas fonctionné pour moi, n'a pas passé beaucoup de temps à comprendre pourquoi. Les variables globales sont mauvaises et parfois vous voulez mettre en cache. Cette réponse est la meilleure à mon avis.
bladefist

@bladefist, vous semblez avoir rencontré le même problème que moi. Savez-vous s'il existe d'autres options que la modification des données pour empêcher IE de mettre en cache? La raison pour laquelle je demande, c'est parce que mes demandes n'utilisent pas réellement les «données» et toutes les données vont de pair avec l'URL.
badri

1
En fait, c'est sûrement ce que le cache devrait faire en arrière-plan selon ces informations de - api.jquery.com/jquery.ajax cache (par défaut: true, false pour dataType 'script' et 'jsonp') Type: Boolean Si défini à faux, cela forcera les pages demandées à ne pas être mises en cache par le navigateur. Remarque: La définition du cache sur false ne fonctionnera correctement qu'avec les requêtes HEAD et GET. Il fonctionne en ajoutant "_ = {timestamp}" aux paramètres GET.
badri

@bladefist Il indique clairement qu'il va ajouter un horodatage aux paramètres GET. alors demandez-vous pourquoi le code fourni par Koss fonctionne pour vous et que la désactivation du cache local ou global ne fonctionne pas?
badri

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

Ces deux valeurs d'en-tête peuvent être combinées pour obtenir l'effet requis sur IE et Firefox


12
Le problème est qu'IE n'écoute pas toujours ça, malheureusement :)
Nick Craver

1
@ Nick, c'est sûr? je n'ai pas testé ce Cache-Control. Est-ce que Jquery Ajax chache fonctionne sur tous les navigateurs?

7
Cela devrait fonctionner sur tous les navigateurs, oui ... mais parfois IE aime juste mettre l'enfer hors des choses
Nick Craver

@Nick - J'ai défini le cache ajax sur false, mais le message de succès ajax n'a pas été obtenu dans IE et également dans FF. Pouvez-vous s'il vous plaît vérifier mon code? mon code est-il faux? Merci var ajaxfile = base + "index.php / msc / popup_view /" + obj + "/" + id + "/" + no_tab; $ .ajax ({type: "GET", url: ajaxfile, // contentType: "application / json; charset = utf-8", cache: false, success: function (msg) {$ ("# popup"). html (msg);}});
SABU

Je viens de confirmer qu'IE11 ignore cet en-tête. Chrome a également lancé une erreur CORS.
Lénine


1

vous pouvez le définir comme ceci:

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

ou comme ça:

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

J'espère que ça aide


-4

Il s'agit d'un ancien message, mais si IE vous pose problème. Modifiez vos demandes GET en POST et IE ne les mettra plus en cache.

J'ai passé beaucoup trop de temps à comprendre cela à la dure. J'espère que ça aide.


Je ne pense pas que vous devriez abuser des actions HTTP. Les réglages cache:falseau cas par cas est la voie à suivre.
tommybond
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.