2012-01-12 9 views
63

jQuery.get() è una scorciatoia per jQuery.ajax() con una chiamata get. Ma quando ho impostato cache:false nei dati della chiamata .get(), ciò che viene inviato al server è un parametro chiamato cache con valore falso. Mentre la mia intenzione è quella di inviare un timestamp con i dati al server per evitare il caching che è ciò che accade se uso cache: false in dati jQuery.ajax. Come faccio a realizzare questo senza dover riscrivere il mio jQuery.get chiama a jQuery.ajax telefonate o utilizzandoCome impostare la cache: false nella chiamata jQuery.get

$.ajaxSetup({ 
    // Disable caching of AJAX responses 
    cache: false 
}); 

aggiornamento: Grazie a tutti per le risposte. Siete tutti corretti Tuttavia, speravo che esistesse un modo per consentire alla chiamata get di sapere che non si desidera memorizzare nella cache o inviare quel valore al sottostante .ajax() in modo che possa sapere cosa fare con esso.

I a. alla ricerca di un quarto modo diverso i tre modi che sono stati identificati finora:

  1. Farlo a livello globale tramite ajaxSetup

  2. Utilizzando una chiamata Ajax invece di una chiamata .get

  3. Eseguendolo manualmente aggiungendo un nuovo parametro contenente un timestamp alla tua chiamata .get.

Ho solo pensato che questa funzionalità dovrebbe essere incorporata nella chiamata .get.

+1

Mostra completamente ottenere) '' esempio (? – Jivings

+0

Mi piace passare la data/ora di un file con la pagina (supponendo che io stia usando un linguaggio di scripting sul lato server), e poi lo passo con la richiesta per la pagina come parametro querystring. Il motivo per cui lo faccio è perché consente la memorizzazione nella cache, a meno che la pagina non sia effettivamente cambiata. – Archer

+1

Uso della cache: false accoda un timestamp alla richiesta ajax/json, ad es. {"get": "modified"} & _ = 1394836303603 che ha interrotto le mie richieste API. Ci sono volute troppe ore per capire cosa stava aggiungendo il timestamp, dato che è sepolto un jQuery docs. Invece di usare cache: false, basta aggiungere il proprio timestamp, assumendo che l'API non si preoccupi se si aggiunge un parametro sconosciuto. In questo modo: {"get": "modified", "timestamp": "1394836303603"} Ciò consente anche di avere un controllo più preciso su quali elementi sono memorizzati nella cache e quali no. –

risposta

34

Per me, il modo corretto di farlo sarebbe quello elencato. O ajax o ajaxSetup. Se si desidera veramente utilizzare get e non utilizzare ajaxSetup, è possibile creare il proprio parametro e assegnargli il valore della data/ora corrente.

Vorrei tuttavia mettere in dubbio le tue motivazioni nel non utilizzare uno degli altri metodi.

+1

Vale la pena notare che nella mia app particolare, io uso la cache: false in ajaxSetup (la maggior parte delle mie chiamate sono agli endpoint json per i payload) e poi uso $ .ajax (..., cache: true) per qualsiasi modello o elemento specifico che desidero memorizzare nella cache. Lo preferisco comunque, in quanto rende le cose abbastanza esplicite, e sto chiamando più delle chiamate payload rispetto ai dati statici. – David

80

Aggiungere autonomamente il parametro.

$.get(url,{ "_": $.now() }, function(rdata){ 
    console.log(rdata); 
}); 

Come di jQuery 3.0, è ora possibile fare questo:

$.get({ 
    url: url, 
    cache: false 
}).then(function(rdata){ 
    console.log(rdata); 
}); 
+5

grazie $ .now() è la scorciatoia per il nuovo Date(). GetTime(). http://api.jquery.com/jQuery.now/ – Barka

+0

Bello, funziona! :) – wooncherk

+0

Ora puoi anche fare 'Date.now()'. – Jivings

62

io penso che si debba utilizzare il metodo di AJAX, invece, che consente di attivare il caching off:

$.ajax({ 
    url: "test.html", 
    data: 'foo', 
    success: function(){ 
    alert('bar'); 
    }, 
    cache: false 
}); 
+2

IE9 cache e sembra davvero non come .get – Ross

+4

@Ross Non dovrebbe fare se si imposta 'cache' su' false' come da mia risposta. – Jivings

+2

3 anni dopo e ho appena perso mezza giornata allo stesso identico problema – Joel

7

Per la documentazione JQuery, .get() prende solo il url, data (contenuto), dataType e success come parametri. Quello che stai davvero cercando di fare qui è modificare l'oggetto jqXHR prima che venga inviato. Con .ajax(), questo viene fatto con il metodo beforeSend(). Ma dal momento che .get() è una scorciatoia, non lo consente.

Dovrebbe essere relativamente semplice passare le chiamate .ajax() alle chiamate .get(). Dopo tutto, .get() è solo un sottoinsieme di .ajax(), quindi puoi probabilmente utilizzare tutti i valori predefiniti per .ajax() (eccetto, ovviamente, per beforeSend()).

Edit:

:: Esamina Jivings' risposta ::

Oh sì, dimenticato sul parametro cache! Mentre beforeSend() è utile per aggiungere altre intestazioni, il parametro integrato cache è molto più semplice qui.

+0

Aumentare lo sforzo e trovare un modo diverso! :) – Jivings

1

Sono molto in ritardo nel gioco, ma questo potrebbe aiutare gli altri. Ho riscontrato lo stesso problema con $ .get e non volevo disattivare ciecamente il caching e non mi piaceva la patch timestamp. Quindi dopo una piccola ricerca ho scoperto che puoi semplicemente usare $ .post invece di $ .get che NON usa la cache. Semplice come quella. :)

+0

Sono in ritardo anch'io :) grazie per il tuo contributo, funziona perfettamente –

+0

Questo è un cattivo consiglio dato che GET e POST sono verbi diversi e dovrebbero essere usati per cose diverse. Lo stesso URL del server può essere filtrato da un verbo, per esempio un POST non funzionerà se il server si aspetta solo un GET. O peggio ancora, il server potrebbe avere comportamenti diversi per GET e POST (che in realtà è molto comune). – Andrew

2

Set di cache: false in jQuery.get chiamata utilizzando Sotto Metodo

utilizzare le nuove Date().getTime(), che sarà evitare collisioni a meno che non si dispone di più le richieste che accadono all'interno della stessa millisecondo.

O

Di seguito impedirà tutte le future richieste AJAX vada in cache, indipendentemente dal metodo di jQuery si utilizza ($ .get, $ .ajax, ecc)

$.ajaxSetup({ cache: false }); 
1

Nota che la sintassi di callback è deprecated:

Deprecation Avviso

I metodi di callback jqXHR.success(), jqXHR.error() e jqXHR.complete() introdotti in jQuery 1.5 sono obsoleti a partire da jQuery 1.8. Per preparare il codice per la loro eventuale rimozione, utilizzare jqXHR.done(), jqXHR.fail() e jqXHR.always().

Ecco una soluzione modernizzato utilizzando l'interfaccia di promise

$.ajax({url: "...", cache: false}).done(function(data) { 
    // data contains result 
}).fail(function(err){ 
    // error 
}); 
Problemi correlati