it-swarm.com.de

Stoppen Sie den Cache der jQuery .load-Antwort

Ich habe den folgenden Code, der eine GET-Anfrage an eine URL sendet:

$('#searchButton').click(function() {
    $('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val());            
});

Das zurückgegebene Ergebnis wird jedoch nicht immer wiedergegeben. Zum Beispiel habe ich eine Änderung an der Antwort vorgenommen, die einen Stapel-Trace ausspuckt, aber der Stapel-Trace wurde nicht angezeigt, als ich auf die Suchschaltfläche geklickt habe. Ich habe mir den zugrunde liegenden PHP Code angesehen, der die Ajax-Antwort steuert, und er hatte den richtigen Code. Beim direkten Aufrufen der Seite wurde das richtige Ergebnis angezeigt, aber die von .load zurückgegebene Ausgabe war alt.

Wenn ich den Browser schließe und wieder öffne, funktioniert er einmal und gibt dann die veralteten Informationen zurück. Kann ich dies mit jQuery steuern oder muss ich meine PHP Skript-Ausgabeheader haben, um das Caching zu steuern?

240
dragonmantank

Sie müssen eine komplexere Funktion wie $.ajax() verwenden, wenn Sie das Caching auf Anforderungsbasis steuern möchten. Oder, wenn Sie es nur für alles deaktivieren möchten, setzen Sie dies oben in Ihr Skript:

$.ajaxSetup ({
    // Disable caching of AJAX responses
    cache: false
});
413
John Millikin

Im Folgenden finden Sie ein Beispiel für die Steuerung des Cachings auf Anforderungsbasis

$.ajax({
    url: "/YourController",
    cache: false,
    dataType: "html",
    success: function(data) {
        $("#content").html(data);
    }
});
106
Marshall

Eine Möglichkeit ist das Hinzufügen einer eindeutigen Nummer am Ende der URL:

$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&uid='+uniqueId());

Wobei Sie uniqueId () schreiben, um bei jedem Aufruf etwas anderes zurückzugeben.

35
Lou Franco

Eine andere Möglichkeit, die folgende Zeile nur einzufügen, wenn Daten vom Server abgerufen werden müssen: Fügen Sie die folgende Zeile zusammen mit Ihrer Ajax-URL hinzu.

'? _ =' + Math.round (Math.random () * 10000)

8
Gomes
/**
 * Use this function as jQuery "load" to disable request caching in IE
 * Example: $('selector').loadWithoutCache('url', function(){ //success function callback... });
 **/
$.fn.loadWithoutCache = function (){
 var elem = $(this);
 var func = arguments[1];
 $.ajax({
     url: arguments[0],
     cache: false,
     dataType: "html",
     success: function(data, textStatus, XMLHttpRequest) {
   elem.html(data);
   if(func != undefined){
    func(data, textStatus, XMLHttpRequest);
   }
     }
 });
 return elem;
}
6
Sasha

Sasha ist eine gute Idee, ich benutze eine Mischung.

Ich erstelle eine Funktion

LoadWithoutCache: function (url, source) {
    $.ajax({
        url: url,
        cache: false,
        dataType: "html",
        success: function (data) {
            $("#" + source).html(data);
            return false;
        }
    });
}

Und rufe für verschiedene Teile meiner Seite auf, zum Beispiel auf init:

Init: function (actionUrl1, actionUrl2, actionUrl3) {

var ExampleJS = {

Init: function (actionUrl1, actionUrl2, actionUrl3)           ExampleJS.LoadWithoutCache(actionUrl1, "div1");

ExampleJS.LoadWithoutCache (actionUrl2, "div2"); ExampleJS.LoadWithoutCache (actionUrl3, "div3"); }},

5
NGRAUPEN

Dies ist insbesondere im IE ärgerlich. Grundsätzlich müssen Sie HTTP-Header ohne Cache mit Ihrer Antwort vom Server zurücksenden.

4
Xian

Fügen Sie für PHP diese Zeile zu Ihrem Skript hinzu, die die gewünschten Informationen enthält:

header("cache-control: no-cache");

oder fügen Sie der Abfragezeichenfolge eine eindeutige Variable hinzu:

"/portal/?f=searchBilling&x=" + (new Date()).getTime()
3
nickf

Verwenden Sie den Zeitstempel NICHT, um eine eindeutige URL zu erstellen, da jede von Ihnen besuchte Seite von jquery mobile im DOM zwischengespeichert wird und Sie bald Schwierigkeiten haben, auf Mobiltelefonen nicht mehr genügend Arbeitsspeicher zu haben.

$jqm(document).bind('pagebeforeload', function(event, data) {
    var url = data.url;
    var savePageInDOM = true;

    if (url.toLowerCase().indexOf("vacancies") >= 0) {
        savePageInDOM = false;
    }

    $jqm.mobile.cache =  savePageInDOM;
})

Dieser Code wird aktiviert, bevor die Seite geladen wird. Mit url.indexOf () können Sie bestimmen, ob die URL diejenige ist, die Sie zwischenspeichern möchten, oder nicht, und den Cache-Parameter entsprechend festlegen.

Verwenden Sie nicht window.location = ""; Wenn Sie die URL ändern möchten, navigieren Sie zu der Adresse und pagebeforeload wird nicht ausgelöst. Um dieses Problem zu umgehen, verwenden Sie einfach window.location.hash = "";

2
user1545320

Sie können die Funktion jquery load durch eine Version ersetzen, deren Cache auf false festgelegt ist.

(function($) {
  var _load = jQuery.fn.load;
  $.fn.load = function(url, params, callback) {
  if ( typeof url !== "string" && _load ) {
        return _load.apply( this, arguments );
  }
    var selector, type, response,
      self = this,
      off = url.indexOf(" ");

    if (off > -1) {
      selector = stripAndCollapse(url.slice(off));
      url = url.slice(0, off);
    }

    // If it's a function
    if (jQuery.isFunction(params)) {

      // We assume that it's the callback
      callback = params;
      params = undefined;

      // Otherwise, build a param string
    } else if (params && typeof params === "object") {
      type = "POST";
    }

    // If we have elements to modify, make the request
    if (self.length > 0) {
      jQuery.ajax({
        url: url,

        // If "type" variable is undefined, then "GET" method will be used.
        // Make value of this field explicit since
        // user can override it through ajaxSetup method
        type: type || "GET",
        dataType: "html",
        cache: false,
        data: params
      }).done(function(responseText) {

        // Save response for use in complete callback
        response = arguments;

        self.html(selector ?

          // If a selector was specified, locate the right elements in a dummy div
          // Exclude scripts to avoid IE 'Permission Denied' errors
          jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :

          // Otherwise use the full result
          responseText);

        // If the request succeeds, this function gets "data", "status", "jqXHR"
        // but they are ignored because response was set above.
        // If it fails, this function gets "jqXHR", "status", "error"
      }).always(callback && function(jqXHR, status) {
        self.each(function() {
          callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
        });
      });
    }

    return this;
  }
})(jQuery);

Platzieren Sie dies an einem globalen Ort, an dem es nach dem Laden von jquery ausgeführt wird, und Sie sollten bereit sein. Ihr vorhandener Ladecode wird nicht mehr zwischengespeichert.

1
Adam Bell

Versuche dies:

$("#Search_Result").load("AJAX-Search.aspx?q=" + $("#q").val() + "&rnd=" + String((new Date()).getTime()).replace(/\D/gi, ''));

Es funktioniert gut, wenn ich es benutzt habe.

0
user208444

Ich habe festgestellt, dass der Server standardmäßig eine "zwischengespeicherte" Antwort sendet, wenn einige Server (z. B. Apache2) nicht so konfiguriert sind, dass sie das "Cachen" ausdrücklich zulassen oder verweigern, auch wenn Sie die HTTP-Header auf "no-cache" setzen. Stellen Sie also sicher, dass Ihr Server nichts "zwischenspeichert", bevor er eine Antwort sendet:

Im Falle von Apache2 musst du

1) Bearbeiten Sie die Datei "disk_cache.conf". Um den Cache zu deaktivieren, fügen Sie die Direktive "CacheDisable/local_files" hinzu

2) Lade mod_cache Module (Unter Ubuntu "Sudo a2enmod cache" und "Sudo a2enmod disk_cache")

3) starte den Apache2 neu (Ubuntu "Sudo service Apache2 restart");

Dies sollte der Trick sein, der den Cache auf der Serverseite deaktiviert. Prost! :)

0
techexpert

Wenn Sie sich an die .load () - Methode von Jquery halten möchten, fügen Sie der URL etwas Einzigartiges hinzu, z. B. einen JavaScript-Zeitstempel. msgstr "+ neues Datum (). getTime ()". Beachten Sie, dass ich ein "& time =" hinzufügen musste, damit Ihre pid-Variable nicht geändert wird.

$('#searchButton').click(function() {
$('#inquiry').load('/portal/?f=searchBilling&pid=' + $('#query').val()+'&time='+new Date().getTime());            
});
0
NickStees

Dieser Code kann Ihnen helfen

var sr = $("#Search Result");
sr.load("AJAX-Search.aspx?q=" + $("#q")
.val() + "&rnd=" + String((new Date).getTime())
.replace(/\D/gi, ""));
0
user3586251