Làm thế nào để đặt bộ nhớ cache false cho getJSON trong jQuery?


80

Tôi đang sử dụng getJSONđể tìm nạp kết quả từ phía máy chủ nhưng gặp phải sự cố bộ nhớ cache của trình duyệt. Tôi muốn bộ nhớ cache là sai. Tôi đã thử sử dụng cái này ngay trước getJSONcuộc gọi của mình .

 $.ajaxSetup({
                cache: false
            })

Nhưng tôi không nhận được kết quả như mong đợi. Nó vẫn hiển thị kết quả cũ.

Tôi cũng xác định một số giải pháp khác như sử dụng .ajaxnhưng tôi thực sự không muốn sử dụng.


Câu trả lời:


128

Mã của bạn chỉ cần một trình kích hoạt để nó được kích hoạt.

Điều này sẽ cho phép bạn tắt bộ nhớ cache trong tất cả các ajax trong tương lai

$(document).ready(function() {
  $.ajaxSetup({ cache: false });
});

Hy vọng nó giúp :)


7
Đây bộ nó trên toàn cầu, đó là xấu và có thể ảnh hưởng đến cuộc gọi ajax khác trong chương trình của bạn mà làm nhu cầu bộ nhớ đệm
vsync

@helloChris - đây là lời giải thích hay từ jQuery "Không thể thao tác trang một cách an toàn cho đến khi tài liệu" sẵn sàng ". jQuery phát hiện trạng thái sẵn sàng này cho bạn. Mã bao gồm trong $ (document) .ready () sẽ chỉ chạy một lần trang Mô hình Đối tượng Tài liệu (DOM) đã sẵn sàng để mã JavaScript thực thi. " Tìm hiểu thêm về API
bonesnatch

7
@bonenatch Hầu hết mã jQuery sẽ cần điều đó, đúng, nhưng cài đặt đó không liên quan gì đến DOM. Tài liệu có thể ở bất kỳ trạng thái nào khi bạn thực hiện cài đặt đó và nó sẽ không tạo ra sự khác biệt, theo như tôi có thể nói. Không có thao tác trang.
chris

Tại sao nó cần một bộ kích hoạt? Vui lòng giải thích tại sao nó không hoạt động theo cách mà người đăng ban đầu đã sử dụng?
Rune Jeppesen

2
Cách sử dụng thẩm mỹ hơn; $ .ajaxSettings.cache = false;
Mustafa Çakıroğlu

83

Bạn có thể sử dụng một trong hai điều này, điều này sẽ tắt bộ nhớ cache trên toàn cầu:

$(document).ready(function() {
  $.ajaxSetup({ cache: false });
});

hoặc thay vì $.getJSONvô hiệu bộ đệm chỉ cho yêu cầu như vậy:

$.ajax({
    cache: false,
    url: "/path/to.json",
    dataType: "json",
    success: function(data) {
        ...
    }
});

50

Câu trả lời của semente và bonenatch là đúng, nhưng nếu bạn muốn sử dụng $ .getJSON và các nơi khác, hãy tận dụng lợi thế của nó vào bộ nhớ đệm (bạn không muốn đặt bộ nhớ cache thành false cho tất cả các cuộc gọi), nhưng bạn muốn phá vỡ bộ nhớ cache chỉ cho một một lần gọi, bạn có thể đưa dấu thời gian vào thuộc tính dữ liệu của $ .getJSON (). Bằng cách thêm một giá trị duy nhất vào chuỗi truy vấn của yêu cầu, yêu cầu sẽ luôn là duy nhất và không được trình duyệt lưu vào bộ nhớ cache - bạn sẽ luôn nhận được dữ liệu mới nhất.

Phiên bản dài:

var ts = new Date().getTime();
var data = {_: ts};
var url = '/some/path.json';

$.getJSON(url, data);

Tất cả trong một phiên bản:

$.getJSON('/some/path', {_: new Date().getTime()});

Cả hai đều dẫn đến yêu cầu sau:

/some/path.json?_=1439315011130 

trong đó số ở cuối là dấu thời gian cho thời điểm mã được gọi và do đó sẽ luôn là duy nhất.


2
Tôi muốn nói rất xa và xa giải pháp tốt nhất cho vấn đề được hỏi. Bạn không cần phải thay đổi javascript của mình, không cần thay đổi cấu hình chung, chỉ cần một tham số bổ sung đơn giản để truyền vào hàm.
Chris

Nó không phải là một giải pháp nếu bạn đang sử dụng Azure CDN. Lợi nhuận Azure cache đối tượng nếu bạn gửi thêm tham số
levye
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.