Bagaimana mencegah permintaan jQuery Ajax dari caching di Internet Explorer?


275

Bagaimana cara mencegah permintaan jQuery Ajax dari caching di Internet Explorer?


1
Menggunakan POST bukannya GET mencegah caching. stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta

8
YSlow dan alat pengembang Chrome akan memperingatkan Anda jika Anda menggunakan permintaan POST untuk AJAX - umumnya GET harus menjadi metode yang disukai kecuali Anda benar-benar perlu POST.
Pawel Krakowiak

Jawaban:


524

Anda dapat menonaktifkan caching secara global $.ajaxSetup(), misalnya:

$.ajaxSetup({ cache: false });

Ini menambahkan stempel waktu ke querystring saat mengajukan permintaan. Untuk mematikan cache untuk $.ajax()panggilan tertentu , aktifkan cache: falsesecara lokal, seperti ini:

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

2
Seandainya saya akan melihat item pengaturan global ini sebelumnya. Baru saja menyelamatkan saya dari keharusan memperbarui puluhan panggilan individual.
James Skemp

2
Saya tahu ini adalah jawaban lama, hanya ingin tahu apakah ini memengaruhi semua panggilan ajax seperti (ajax, dapatkan dan kirim) atau hanya panggilan ajax tertentu?
Lumpy

6
@Lumpy, menurut dokumentasi jQuery.ajax () , cache: falsehanya akan berfungsi dengan benar dengan permintaan HEAD dan GET. Juga, jika Anda menetapkan cache: falsedi $.ajaxSetup, menurut jQuery.ajaxSetup () dokumentasi , itu akan "nilai-nilai default set untuk permintaan masa depan Ajax." Jadi ya, itu akan menonaktifkan cache untuk semua permintaan HEAD dan GET AJAX mendatang.
John Washam

11
Kata hati-hati: ini menambahkan "? _ = Somenumber" ke URL Anda. Pastikan ujung belakang Anda dapat mengabaikan "_" di parameter kueri URL.

4
+1 untuk cache: false. Menonaktifkan caching secara global sepertinya berlebihan, tetapi memiliki kontrol per permintaan adalah sempurna. Terima kasih
Lewat Coding

21

Jika Anda mengatur parameter unik, maka cache tidak berfungsi, misalnya:

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

13
Itulah yang cachesudah dilakukan parameter di belakang layar.
Jose Rui Santos

Kode ajaxSetup di atas tidak bekerja untuk saya, tidak menghabiskan banyak waktu untuk mencari tahu mengapa. Variabel global buruk, dan terkadang Anda ingin melakukan cache. Jawaban ini yang terbaik menurut saya.
bladefist

@bladefist Anda sepertinya telah mengenai masalah yang sama dengan saya. Apakah Anda tahu jika ada opsi lain selain mengubah data untuk membuat IE menghentikan caching? Alasan saya bertanya adalah karena permintaan saya sebenarnya tidak menggunakan 'data' dan semua data disertai dengan URL.
badri

1
Sebenarnya, inilah yang seharusnya dilakukan cache di belakang layar sesuai informasi ini dari - api.jquery.com/jquery.ajax cache (default: true, false untuk dataType 'script' dan 'jsonp') Jenis: Boolean Jika disetel ke false, itu akan memaksa halaman yang diminta untuk tidak di-cache oleh browser. Catatan: Mengatur cache ke false hanya akan berfungsi dengan benar dengan permintaan HEAD dan GET. Ini bekerja dengan menambahkan "_ = {timestamp}" ke parameter GET.
badri

@bladefist Jelas mengatakan bahwa itu akan menambahkan stempel waktu ke parade GET. jadi ingin tahu mengapa kode yang disediakan oleh Koss bekerja untuk Anda dan menonaktifkan cache lokal atau global tidak?
badri

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

Kedua nilai header ini dapat digabungkan untuk mendapatkan efek yang diperlukan baik pada IE maupun Firefox


12
Masalahnya adalah bahwa IE tidak selalu mendengarkan ini, sayangnya :)
Nick Craver

1
@Nick, apakah itu yakin? saya tidak menguji Kontrol Cache ini. Apakah Jquery Ajax chache berfungsi di semua browser?

7
Ini harus bekerja pada semua browser, ya ... tapi kadang-kadang IE hanya suka men-cache keluar dari segala sesuatu
Nick Craver

@Nick - Saya mengatur cache ajax ke false.Tapi pesan sukses ajax tidak masuk di IE dan juga di FF. Bisakah Anda memverifikasi kode saya? apakah kode saya salah? Terima kasih var ajaxfile = basis + "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

Saya baru saja mengkonfirmasi bahwa IE11 mengabaikan header ini. Chrome juga melempar kesalahan CORS.
Lenin


1

Anda dapat mendefinisikannya seperti ini:

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

atau seperti ini:

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

semoga membantu


-4

Ini adalah posting lama, tetapi jika IE memberi Anda masalah. Ubah permintaan GET Anda menjadi POST dan IE tidak akan lagi menyimpannya.

Saya menghabiskan terlalu banyak waktu untuk mencari tahu ini dengan cara yang sulit. Semoga ini bisa membantu.


Saya tidak berpikir Anda harus menyalahgunakan tindakan HTTP. Pengaturan cache:falseberdasarkan kasus per kasus adalah caranya.
tommybond
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.