Làm cách nào để ngăn yêu cầu jQuery Ajax lưu vào bộ đệm trong Internet Explorer?


275

Làm cách nào để ngăn yêu cầu jQuery Ajax lưu vào bộ đệm trong Internet Explorer?


1
Sử dụng POST thay vì GET ngăn chặn bộ nhớ đệm. stackoverflow.com/questions/6216234/disable-ajax-caching
Prashant Gupta

8
Các công cụ dev của YSlow và Chrome sẽ cảnh báo bạn nếu bạn sử dụng các yêu cầu POST cho AJAX - nói chung GET nên là phương thức ưa thích trừ khi bạn thực sự cần POST.
Pawel Krakowiak 27/11/13

Đây là câu trả lời của bạn: tắt Cache trong IE
S.Mohamed Mahdi Ahmadian zadeh

Câu trả lời:


524

Bạn có thể vô hiệu hóa bộ đệm ẩn trên toàn cầu bằng cách sử dụng $.ajaxSetup(), ví dụ:

$.ajaxSetup({ cache: false });

Điều này sẽ thêm dấu thời gian vào chuỗi truy vấn khi thực hiện yêu cầu. Để tắt bộ nhớ cache cho một $.ajax()cuộc gọi cụ thể , hãy đặt cache: falsenó cục bộ, như thế này:

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

2
Ước gì tôi sẽ thấy mục thiết lập toàn cầu này trước đây. Chỉ cần cứu tôi khỏi phải cập nhật hàng chục cuộc gọi cá nhân.
James Skemp

2
Tôi biết đây là một câu trả lời cũ, chỉ tự hỏi liệu điều này có ảnh hưởng đến tất cả các ajax như các cuộc gọi (ajax, get và post) hoặc chỉ các cuộc gọi ajax cụ thể không?
sần

6
@Lumpy, theo tài liệu của jQuery.ajax () , cache: falsesẽ chỉ hoạt động chính xác với các yêu cầu CHÍNH và NHẬN. Ngoài ra, nếu bạn thiết lập cache: falsetrong $.ajaxSetup, theo jQuery.ajaxSetup () tài liệu , nó sẽ "giá trị mặc định thiết lập cho các yêu cầu trong tương lai Ajax." Vì vậy, có, nó sẽ vô hiệu hóa bộ đệm cho tất cả các yêu cầu CHÍNH và NHẬN AJAX trong tương lai.
John Washam

11
Một lời cảnh báo: điều này sẽ thêm "? _ = Somenumber" vào URL của bạn. Đảm bảo rằng mặt sau của bạn có thể bỏ qua "_" trong các tham số truy vấn của URL.

4
+1 cho cache: false. Tắt bộ nhớ đệm trên toàn cầu có vẻ như quá mức cần thiết, nhưng có quyền kiểm soát theo yêu cầu là hoàn hảo. Cảm ơn
Mã hóa

21

Nếu bạn đặt tham số duy nhất, thì bộ đệm không hoạt động, ví dụ:

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

13
Đó là những gì các cachetham số đã làm đằng sau hậu trường.
Jose Rui Santos

Mã ajaxSetup ở trên không hoạt động với tôi, đã không dành nhiều thời gian để tìm hiểu lý do tại sao. Biến toàn cục là xấu, và đôi khi bạn muốn lưu trữ. Câu trả lời này là tốt nhất theo ý kiến ​​của tôi.
bladefist

@bladefist bạn dường như đã gặp vấn đề tương tự như tôi. Bạn có biết nếu có các tùy chọn khác ngoài việc thay đổi dữ liệu để làm cho IE dừng bộ nhớ đệm không? Lý do tôi hỏi là vì các yêu cầu của tôi thực sự không sử dụng 'dữ liệu' và tất cả dữ liệu đều đi cùng với URL.
badri

1
Trên thực tế, đây chắc chắn là những gì bộ đệm nên thực hiện phía sau hậu trường theo thông tin này từ - api.jquery.com/jquery.ajax cache (mặc định: true, false cho dataType 'script' và 'jsonp') Loại: Boolean If set thành false, nó sẽ buộc các trang được yêu cầu không được lưu vào bộ nhớ cache của trình duyệt. Lưu ý: Đặt bộ đệm thành false sẽ chỉ hoạt động chính xác với các yêu cầu CHÍNH và NHẬN. Nó hoạt động bằng cách nối thêm "_ = {dấu thời gian}" vào tham số GET.
badri

@bladefist Nó nói rõ ràng rằng nó sẽ nối thêm dấu thời gian vào các thông số GET. Vì vậy, tự hỏi tại sao mã do Koss cung cấp hoạt động cho bạn và vô hiệu hóa bộ đệm cục bộ hoặc toàn cầu không?
badri

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

Hai giá trị tiêu đề này có thể được kết hợp để có được hiệu ứng cần thiết trên cả IE và Firefox


12
Vấn đề là IE không luôn luôn lắng nghe điều này, thật không may :)
Nick Craver

1
@Nick, có chắc không? tôi đã không kiểm tra Cache-Control này. Có phải Jquery Ajax chache hoạt động trên tất cả các trình duyệt?

7
nên hoạt động trên tất cả các trình duyệt, vâng ... nhưng đôi khi IE chỉ thích lưu trữ mọi thứ
Nick Craver

@Nick - Tôi đặt bộ đệm ajax thành false. Nhưng thông báo thành công ajax không có trong IE và cả trong FF. Bạn có thể vui lòng xác minh mã của tôi? mã của tôi là sai? Cảm ơn var ajaxfile = base + "index.php / msc / popup_view /" + obj + "/" + id + "/" + no_tab; $ .ajax ({type: "GET", url: ajaxfile, // contentType: "application / json; charset = utf-8", bộ đệm: false, thành công: function (Trình tự) html (tin nhắn);}});
SABU

Tôi vừa xác nhận rằng IE11 bỏ qua tiêu đề này. Chrome cũng đã gây ra lỗi CORS.
Lênin

5

Đây là một đề xuất câu trả lời:

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

Ý tưởng là thêm một tham số vào truy vấn ajax của bạn, ví dụ như ngày hiện tại một thời gian, do đó trình duyệt sẽ không thể lưu trữ nó.

Có một cái nhìn vào các liên kết, nó được giải thích tốt.


13
Đó là những gì các cachetham số đã làm đằng sau hậu trường.
Jose Rui Santos

1

bạn có thể định nghĩa nó như thế này:

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

hoặc như thế này:

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

hy vọng nó giúp


-4

Đây là một bài viết cũ, nhưng nếu IE gây rắc rối cho bạn. Thay đổi các yêu cầu GET của bạn thành POST và IE sẽ không còn lưu trữ chúng.

Tôi đã dành quá nhiều thời gian để tìm ra điều này một cách khó khăn. Hy vọng nó giúp.


Tôi không nghĩ bạn nên lạm dụng các hành động HTTP. Cài đặt cache:falsetrên cơ sở từng trường hợp là cách để đi.
tommybond
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.