วิธีการป้องกันการร้องขอ jQuery Ajax จากการแคชใน Internet Explorer


275

ฉันจะป้องกันคำขอ jQuery Ajax ไม่ให้แคชใน Internet Explorer ได้อย่างไร


1
การใช้ POST แทน GET ป้องกันการแคช stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta

8
เครื่องมือ YSlow และ Chrome dev จะเตือนคุณหากคุณใช้คำขอ POST สำหรับ AJAX - โดยทั่วไป GET ควรเป็นวิธีที่ต้องการยกเว้นว่าคุณต้องการ POST จริงๆ
Pawel Krakowiak

นี่คือคำตอบของคุณ: ปิดการใช้งานแคชใน IE
S.Mohamed Mahdi Ahmadian zadeh

คำตอบ:


524

คุณสามารถปิดการใช้งานแคชทั่วโลกโดยใช้$.ajaxSetup()ตัวอย่างเช่น:

$.ajaxSetup({ cache: false });

การต่อท้ายนี้จะเพิ่มการประทับเวลาลงในการสอบถามเมื่อทำการร้องขอ หากต้องการปิดแคชสำหรับการ$.ajax()โทรเฉพาะให้ตั้งค่าไว้cache: falseในเครื่องแบบนี้:

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

2
หวังว่าฉันจะได้เห็นรายการการตั้งค่าระดับโลกนี้มาก่อน เพิ่งบันทึกฉันจากต้องอัปเดตการโทรแต่ละครั้งหลายสิบครั้ง
James Skemp

2
ฉันรู้ว่านี่เป็นคำตอบเก่าเพียงแค่สงสัยว่าสิ่งนี้มีผลกระทบต่ออาแจ็กซ์ทุกคนเช่นการโทร (อาแจ็กซ์รับและโพสต์) หรือเฉพาะการโทรอาแจ็กซ์ที่เฉพาะเจาะจง?
ก้อน

6
@Lumpy ตามjQuery.ajax เอกสาร () , cache: falseจะทำงานเฉพาะอย่างถูกต้องกับ HEAD และได้รับการร้องขอ นอกจากนี้ถ้าคุณตั้งcache: falseใน$.ajaxSetupตามjQuery.ajaxSetup (เอกสาร)มันจะ "เป็นค่าเริ่มต้นที่ตั้งไว้สำหรับการร้องขอในอนาคตอาแจ็กซ์." ใช่แล้วมันจะปิดการใช้งานแคชสำหรับคำขอ HEAD และ GET AJAX ในอนาคตทั้งหมด
จอห์น Washam

11
คำเตือน: สิ่งนี้จะเพิ่ม "? _ = somenumber" ใน URL ของคุณ ตรวจสอบให้แน่ใจว่าส่วนหลังของคุณสามารถละเว้น "_" ในพารามิเตอร์การค้นหาของ URL

4
+1 cache: falseสำหรับ การปิดการแคชทั่วโลกดูเหมือนเกินความจริง แต่การควบคุมตามคำขอนั้นสมบูรณ์แบบ ขอบคุณ
Gone Coding

21

หากคุณตั้งค่าพารามิเตอร์ที่ไม่ซ้ำกันแคชจะไม่ทำงานตัวอย่างเช่น:

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

13
นั่นคือสิ่งที่cacheพารามิเตอร์ทำอยู่เบื้องหลัง
Jose Rui Santos

รหัส ajaxSetup ด้านบนไม่ได้ผลสำหรับฉันไม่ได้ใช้เวลามากในการหาสาเหตุ ตัวแปรทั่วโลกไม่ดีและบางครั้งคุณต้องการแคช คำตอบนี้ดีที่สุดในความคิดของฉัน
bladefist

@bladefist คุณดูเหมือนจะมีปัญหาเช่นเดียวกับฉัน คุณรู้หรือไม่ว่ามีตัวเลือกอื่นนอกเหนือจากการเปลี่ยนข้อมูลเพื่อให้ IE หยุดการแคช? เหตุผลที่ฉันถามคือเพราะคำขอของฉันไม่ได้ใช้ 'data' และข้อมูลทั้งหมดไปพร้อมกับ URL
badri

1
ที่จริงแล้วนี่คือสิ่งที่แคชควรทำอยู่เบื้องหลังตามข้อมูลนี้จาก - api.jquery.com/jquery.ajax แคช (ค่าเริ่มต้น: จริง, เท็จสำหรับ dataType 'script' และ 'jsonp') ประเภท: Boolean ถ้าตั้งค่า เป็นเท็จมันจะบังคับให้หน้าเว็บที่ร้องขอไม่ให้ถูกเบราว์เซอร์ หมายเหตุ: การตั้งค่าแคชเป็นเท็จจะทำงานได้อย่างถูกต้องกับคำขอ HEAD และ GET เท่านั้น มันทำงานได้โดยการผนวก "_ = {timestamp}" กับพารามิเตอร์ GET
badri

@bladefist มันชัดเจนว่ามันกำลังจะผนวกเวลาที่กำหนดเข้ากับ GET params ดังนั้นสงสัยว่าทำไมโค้ดที่ Koss จัดเตรียมให้กับคุณและการปิดใช้งานแคชในตัวเครื่องหรือแคชทั่วโลกไม่ได้
badri

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

ค่าส่วนหัวทั้งสองนี้สามารถรวมกันเพื่อให้ได้ผลตามที่ต้องการทั้ง IE และ Firefox


12
ปัญหาคือว่า IE ไม่เคยฟังทางนี้โชคไม่ดี :)
นิค Craver

1
@Nick แน่ใจหรือไม่? ฉันไม่ได้ทดสอบ Cache-Control นี้ Jquery Ajax chache ทำงานบนเบราว์เซอร์ทั้งหมดหรือไม่

7
มันควรจะทำงานบนเบราว์เซอร์ทั้งหมดใช่ ... แต่บางครั้ง IE ชอบเพียงแค่การแคชนรกออกจากสิ่ง
นิค Craver

@Nick - ฉันตั้งค่า ajax cache เป็น false แต่ข้อความสำเร็จของ ajax ไม่ได้อยู่ใน IE และใน FF คุณช่วยยืนยันรหัสของฉันได้ไหม รหัสของฉันผิด ขอบคุณ var ajaxfile = base + "index.php / msc / popup_view /" + obj + "/" + id + "/" + "no_tab; $ .ajax ({type: "GET", url: ajaxfile, // contentType: "application / json; charset = utf-8", แคช: false, สำเร็จ: function (msg) {$ ("# popup") html (msg);}});
SABU

ฉันเพิ่งยืนยันว่า IE11 ละเว้นส่วนหัวนี้ Chrome โยนข้อผิดพลาด CORS เช่นกัน
เลนิน

5

นี่คือข้อเสนอคำตอบ:

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

แนวคิดคือการเพิ่มพารามิเตอร์ลงในแบบสอบถาม ajax ของคุณที่มีตัวอย่างเช่นวันที่ปัจจุบันเวลาดังนั้นเบราว์เซอร์จะไม่สามารถแคชได้

ลองดูที่ลิงค์ก็อธิบายได้ดี


13
นั่นคือสิ่งที่cacheพารามิเตอร์ทำอยู่เบื้องหลัง
Jose Rui Santos

1

คุณสามารถกำหนดได้ดังนี้:

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

หรือเช่นนี้

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

หวังว่ามันจะช่วย


-4

นี่คือโพสต์เก่า แต่ถ้า IE จะทำให้คุณมีปัญหา เปลี่ยนคำขอ GET ของคุณเป็น POST และ IE จะไม่แคชอีกต่อไป

ฉันใช้เวลามากเกินไปในการหาวิธีที่ยาก หวังว่ามันจะช่วย


ฉันไม่คิดว่าคุณควรใช้การกระทำ HTTP ในทางที่ผิด การตั้งค่าcache:falseเป็นกรณีไปคือวิธีที่จะไป
tommybond
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.