2012-07-13 40 views
22

Tôi đã thiết lập một ứng dụng và nó hoạt động tuyệt vời trên Opera và Firefox, nhưng trên Google Chrome, nó lưu trữ yêu cầu AJAX và sẽ cung cấp dữ liệu cũ!Ngăn Chrome lưu trong bộ nhớ cache yêu cầu AJAX

http://gapps.qk.com.au là ứng dụng. Khi chạy trong Chrome, nó thậm chí không gửi các yêu cầu AJAX, nhưng khi được thử trong một trình duyệt khác, nó luôn yêu cầu AJAX và trả về dữ liệu.

Có phương pháp nào (Apache/PHP/HTML/JS) để ngăn Chrome thực hiện hành vi này không?

Cuộc gọi AJAX:

function sendAjax(action,domain,idelement) { 

        //Create the variables 
       var xmlhttp, 
        tmp, 
        params = "action=" + action 
          + "&domain=" + encodeURIComponent(domain) 

        xmlhttp = new XMLHttpRequest(); 
       //Check to see if AJAX request has been sent 
       xmlhttp.onreadystatechange = function() { 
        if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { 
         $('#'+idelement).html(xmlhttp.responseText); 
        } 
       }; 
       xmlhttp.open("GET", "ajax.php?"+params, true); 
       xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
       //console.log(params); 
       xmlhttp.send(params); 

      } 
sendAjax('gapps','example.com','gapps'); 
+0

Các tiêu đề được trả về bởi tập lệnh PHP của bạn là gì? Đảm bảo rằng chúng không cho phép lưu vào bộ nhớ đệm và trả về loại nội dung thích hợp. – mariusnn

Trả lời

26

Bộ nhớ cache của trình duyệt xử khác nhau trên các thiết lập khác nhau. Bạn không nên phụ thuộc vào cài đặt người dùng hoặc trình duyệt của người dùng. Có thể làm cho trình duyệt bỏ qua các tiêu đề.

Có hai cách để ngăn bộ nhớ đệm.

-> Thay đổi yêu cầu AJAX thành POST. Trình duyệt không lưu trữ các yêu cầu POST.

-> Better Way & cách tốt: thêm tham số bổ sung vào yêu cầu của bạn với dấu thời gian hiện tại hoặc bất kỳ số duy nhất nào khác.

params = "action=" + action 
     + "&domain=" + encodeURIComponent(domain) 
     + "&preventCache="+new Date(); 
+0

Tôi đã nghĩ về điều này như một giải pháp nhưng tôi nghĩ rằng nó là không phù hợp, ok cảm ơn! :) – Mattisdada

+1

Chỉ để biết thông tin và yên tâm. giải pháp này được sử dụng bởi các khung chính khi bạn nói preventCache để ajax gọi một ví dụ là DOJO. thêm một số thay vì ngày – gaurang171

+0

Thật sao? Điều này có vẻ như một phương pháp "hacky" đối với tôi, nó hoạt động (tuyệt vời), nhưng tôi đã nghĩ rằng sẽ có một phương pháp tốt hơn như là cách "chính thức" của việc thực hiện nó. Cảm ơn một lần nữa! :) – Mattisdada

11

Một thay thế cho các giải pháp Javascript là sử dụng tiêu đề tùy chỉnh: Trong PHP nó sẽ trông như thế này:

<?php 
    header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");//Dont cache 
    header("Pragma: no-cache");//Dont cache 
    header("Expires: Thu, 19 Nov 1981 08:52:00 GMT");//Make sure it expired in the past (this can be overkill) 
?> 
+0

Tính năng này có hoạt động với tất cả các trình duyệt không? Nếu vậy, điều này là ** nhiều ** thanh lịch hơn so với hack truy vấn hack ... – tjameson

+1

Có nó hoạt động với tất cả các trình duyệt :) – Mattisdada

0

Dưới dòng mã làm việc cho tôi.

$.ajaxSetup({ cache: false }); 
Các vấn đề liên quan