Bir jQuery Ajax isteğinin Internet Explorer'da önbelleğe alınmasını nasıl önleyebilirim?


275

Bir jQuery Ajax isteğinin Internet Explorer'da önbelleğe alınmasını nasıl önleyebilirim?


1
GET yerine POST kullanılması önbelleğe almayı engeller. stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta

8
AJAX için POST isteklerini kullanırsanız YSlow ve Chrome geliştirici araçları sizi uyaracaktır - POST yapmanız gerekmedikçe genellikle GET tercih edilen yöntem olmalıdır.
Pawel Krakowiak

Yanıtlar:


524

Önbelleği global olarak aşağıdakileri kullanarak devre dışı bırakabilirsiniz $.ajaxSetup(), örneğin:

$.ajaxSetup({ cache: false });

Bu, istekte bulunurken querystring öğesine bir zaman damgası ekler. Belirli bir $.ajax()çağrı için önbelleği kapatmak için , cache: falseyerel olarak şu şekilde ayarlayın:

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

2
Keşke bu global kurulum öğesini daha önce görseydim. Beni düzinelerce bireysel aramayı güncellemekten kurtardı.
James Skemp

2
Bu eski bir cevap olduğunu biliyorum, sadece bu tüm aramalar (ajax, get ve post) veya sadece belirli ajax aramaları gibi etkiler mi merak?
Ocak'ta Lumpy

6
@Lumpy göre jQuery.ajax () belgelerine , cache: falsesadece HEAD ile düzgün çalışmayabilir ve isteklerini GET olacaktır. Ayrıca, ayarlarsanız cache: falseiçinde $.ajaxSetup, uygun jQuery.ajaxSetup () belgelerine , bu "gelecek Ajax istekleri için ayarlanan varsayılan değerler." Evet, gelecekteki tüm HEAD ve GET AJAX istekleri için önbelleği devre dışı bırakacaktır.
John Washam

11
Dikkatli bir kelime: URL'nize "? _ = Somenumber" ekler. Arka ucunuzun URL'nin sorgu parametrelerindeki "_" işaretini yok sayabileceğinden emin olun.

4
İçin +1 cache: false. Global olarak önbelleği kapatmak aşırıya kaçma gibi görünüyor, ancak istek başına kontrol sahibi olmak mükemmel. Teşekkürler
Kodlama Gitti

21

Benzersiz parametreler ayarlarsanız, önbellek çalışmaz, örneğin:

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

13
cacheParametrenin perde arkasında zaten yaptığı şey budur .
Jose Rui Santos

Yukarıdaki ajaxSetup kodu benim için çalışmadı, nedenini bulmak için fazla zaman harcamadım. Genel değişkenler kötüdür ve bazen önbelleklemek istersiniz. Bu cevap bence en iyisidir.
bladefist

@bladefist benimle aynı sorunu vurmuş gibisin. IE'nin önbelleğe almasını durdurmak için veri değiştirmenin dışında başka seçenekler olup olmadığını biliyor musunuz? Sormamın nedeni, taleplerimin aslında 'veri'yi kullanmaması ve tüm verilerin URL ile birlikte gitmesidir.
badri

1
Aslında, - api.jquery.com/jquery.ajax önbellek (varsayılan: true, dataType 'script' ve 'jsonp' için bu bilgilere göre perde arkasında mutlaka önbellek ne yapmalı ) Tür: Boolean If set false değerine ayarlandığında, istenen sayfaların tarayıcı tarafından önbelleğe alınmamasını sağlar. Not: Önbelleği false olarak ayarlamak, yalnızca HEAD ve GET istekleriyle doğru şekilde çalışır. GET parametrelerine "_ = {timestamp}" ekleyerek çalışır.
badri

@bladefist GET parametrelerine bir zaman aralığı ekleyeceğini açıkça söylüyor. Koss tarafından sağlanan kodun sizin için neden çalıştığını ve yerel veya global önbelleği devre dışı bırakmanın neden işe yaramadığını merak ediyor musunuz?
badri

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

Bu iki başlık değeri hem IE hem de Firefox üzerinde gerekli etkiyi elde etmek için birleştirilebilir


12
Sorun IE ne yazık ki her zaman bu dinlemek değil :)
Nick Craver

1
@Nick, emin misin? Bu Önbellek Denetimi'ni test etmedim. Jquery Ajax chache tüm tarayıcıda çalışıyor mu?

7
O gerektiğini , tüm tarayıcılarda çalışır evet ... ama bazen IE sadece şeylerin defolup önbelleğe sever
Nick Craver

@Nick - ajax önbelleğini false olarak ayarladım.Ancak ajax başarı mesajı IE'de ve ayrıca FF'de alamadı. Lütfen kodumu doğrulayabilir misiniz? kodum yanlış mı Teşekkürler var ajaxfile = base + "index.php / msc / popup_view /" + obj + "/" + id + "/" + no_tab; $ .ajax ({type: "GET", url: ajaxfile, // contentType: "application / json; charset = utf-8", önbellek: yanlış, başarı: işlev (msg) {$ ("# popup"). html (msg);}});
SABU

IE11'in bu başlığı yok saydığını doğruladım. Chrome da bir CORS hatası attı.
Lenin


1

şöyle tanımlayabilirsiniz:

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

ya da bunun gibi:

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

Umarım yardımcı olur


-4

Bu eski bir gönderi, ancak IE size sorun çıkarıyorsa. GET isteklerinizi POST olarak değiştirin; IE artık bunları önbelleğe almaz.

Bunu zor yoldan anlamak için çok fazla zaman harcadım. Umarım yardımcı olur.


HTTP işlemlerini kötüye kullanmanız gerektiğini düşünmüyorum. Durumlar cache:falseduruma göre ayarlar , gidilecek yoldur.
tommybond
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.