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?

SABU
la source
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
Voici votre réponse: désactiver le cache dans IE
S.Mohamed Mahdi Ahmadian zadeh

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...
});
Nick Craver
la source
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
    }});
Koss
la source
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

Zoltan Toth
la source
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
5

Voici une proposition de réponse:

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

L'idée est d'ajouter un paramètre à votre requête ajax contenant par exemple la date du jour une heure, afin que le navigateur ne puisse pas le mettre en cache.

Jetez un oeil sur le lien, il est bien expliqué.

DRK
la source
13
C'est ce que cachefait déjà le paramètre dans les coulisses.
Jose Rui Santos
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

Fajar A. R
la source
-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.

Un gars
la source
Je ne pense pas que vous devriez abuser des actions HTTP. Les réglages cache:falseau cas par cas est la voie à suivre.
tommybond