AJAX: Problem mit Cache bei Aufruf eines Perl-Scripts
steckl
- javascript
Hallo,
ich habe ein Perlscript, das mir bestimmte Datensaetze aus einer Datenbank (mySql) ausliest und in HTML ausgibt. Auf der Seite ist auch noch eine Checkbox:
<input type="checkbox" id="showByUser" onchange="setShowByUser(4833);" />
das (vereinfachte) Javascript dazu schaut so aus:
function setShowByUser(pid)
{
var box = 0;
if(document.getElementById('showByUser').checked == true)
{
box = 1;
}
else
{
box = 0;
}
var rtc = getFileContent("changeListMode.pl?box=" + box);
location.reload();
}
function getFileContent(file)
{
/* creates a new XMLHTTP request */
var xhReq = new createXMLHttpRequest();
/* executes the XMLHTTP request */
xhReq.open("GET", file, false);
xhReq.send(null);
var serverResponse = xhReq.responseText;
return(serverResponse);
}
function createXMLHttpRequest()
{
try{ return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
try{ return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
try{ return new XMLHttpRequest(); } catch(e) {}
alert("XMLHttpRequest not supported");
return null;
}
In dem Perlscript changeListMode.pl wird dann ein Wert in einem Textfile geschrieben, je nachdem ob die Checkbox gesetzt ist oder nicht. Dieser wert ist dafuer verantwortlich, welche Daten aus der Datenbank ausgelesen werden, wenn die Seite neu geladen wird. Ausserdem wird dann beim naechsten laden der Haken in der checkbox gesetzt bzw. nicht gesetzt.
Jetzt habe ich ein Problem: wenn im Internetexplorer (6) bei "Einstellungen -> Temporary internet files -> settings... -> check for newer pages" never oder automatically auswaehle wird changeListMode.pl nichtmehr neu aufgerufen sondern nur der alte Wert aus dem Cache geholt. Somit wird auch der Wert in dem Textfile nicht neu geschrieben, was dazu fuehrt, das die Seite genauso aussieht wie vorher.
Kann ich dem Javascript oder dem Perlscript irgendwie sagen, dass es jedesmal ausgefuehrt werden soll, anstatt aus dem Cache geladen zu werden?
Ich habe es bis jetzt mal mit folgenden Metaangaben in changeListMode.pl versucht, jedoch ohne Erfolg:
<meta http-equiv="expires" content="0">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="pragma" content="no-cache">
Ich hoffe ich konnte mein Problem (einigermasen) verdeutlichen, da ich mich hier das erste mal mit AJAX befasst habe.
Die Loesung wuerde wohl auch mit einem einfachen submit() funktionieren, wenn ich das ganze ein wenig umbaue, aber ich wollte mal was neues ausprobieren.
mfG,
steckl
hi,
Jetzt habe ich ein Problem: wenn im Internetexplorer (6) bei "Einstellungen -> Temporary internet files -> settings... -> check for newer pages" never oder automatically auswaehle wird changeListMode.pl nichtmehr neu aufgerufen sondern nur der alte Wert aus dem Cache geholt.
Ja, der IE holt bei XMLHTTPRequest per GET die Daten gerne aus dem Cache, auch wenn er nicht sollte.
Kann ich dem Javascript oder dem Perlscript irgendwie sagen, dass es jedesmal ausgefuehrt werden soll, anstatt aus dem Cache geladen zu werden?
Nutze POST statt GET als Requestmethode.
gruß,
wahsaga
Kann ich dem Javascript oder dem Perlscript irgendwie sagen, dass es jedesmal ausgefuehrt werden soll, anstatt aus dem Cache geladen zu werden?
Nutze POST statt GET als Requestmethode.
Hab jetzt diese Zeile geaendert:
xhReq.open("POST", file, false);
jedoch hat sich am Verhalten nichts veraendert.
Muss ich das sonst noch wo aendern?
Lieber steckl,
Nutze POST statt GET als Requestmethode.
Hab jetzt diese Zeile geaendert:
xhReq.open("POST", file, false);
> jedoch hat sich am Verhalten nichts veraendert.
> Muss ich das sonst noch wo aendern?
vielleicht ist es sinnvoll, dem IE vorzugaukeln, dass der erneute Request eine völlig andere Resource laden soll, als das der vorherige getan haben könnte. Dazu klebst Du an den Request einfach noch einen Parameter, den Du den Browser aus der Systemzeit generieren lässt. Damit sieht es für den Browser nach einer neuen URL und somit nach einer neuen Resource aus -> nix wird aus dem Cache geholt.
Beispiel:
http://www.example.org/myscript.pl -> wird gecached und bei erneutem Aufruf aus dem Cache geholt
http://www.example.org/myscript.pl?time=153278826349623 -> wird gecached, hat aber bei einem neuen Aufruf einen anderen Parameter und kann somit nicht aus dem Cache geholt werden
Liebe Grüße aus [Ellwangen](http://www.ellwangen.de/),
Felix Riesterer.
Hi,
vielleicht ist es sinnvoll, dem IE vorzugaukeln, dass der erneute Request eine völlig andere Resource laden soll, als das der vorherige getan haben könnte. Dazu klebst Du an den Request einfach noch einen Parameter, den Du den Browser aus der Systemzeit generieren lässt. Damit sieht es für den Browser nach einer neuen URL und somit nach einer neuen Resource aus -> nix wird aus dem Cache geholt.
Beispiel:
http://www.example.org/myscript.pl -> wird gecached und bei erneutem Aufruf aus dem Cache geholt
http://www.example.org/myscript.pl?time=153278826349623 -> wird gecached, hat aber bei einem neuen Aufruf einen anderen Parameter und kann somit nicht aus dem Cache geholt werden
War ne super Idee. (Schade, dass sie nicht von mir kam ;)
Jetzt funktioniert es einwandfrei. :-)
mfG,
steckl
Hab ganz vergessen, mich fuer die Hilfe zu bedanken:
vielen dank an alle, die mir Tipps gaben.
schoenen Tag noch,
steckl
Hallo steckl,
Kann ich dem Javascript oder dem Perlscript irgendwie sagen, dass es jedesmal ausgefuehrt werden soll, anstatt aus dem Cache geladen zu werden?
Ich habe es bis jetzt mal mit folgenden Metaangaben in changeListMode.pl versucht, jedoch ohne Erfolg:
> <meta http-equiv="expires" content="0">
> <meta http-equiv="cache-control" content="no-cache">
> <meta http-equiv="pragma" content="no-cache">
Sende die zugehörigen Header-Informationen aus dem serverseitigen Script. Ansonsten mal noch diese Variante vor dem send()-Aufruf probieren:
xhReq.setRequestHeader("Cache-Control","no-cache, must-revalidate");
Man liest sich,
svg4you
Hi,
Sende die zugehörigen Header-Informationen aus dem serverseitigen Script. Ansonsten mal noch diese Variante vor dem send()-Aufruf probieren:
xhReq.setRequestHeader("Cache-Control","no-cache, must-revalidate");
Hab ich versucht, aber hat auch nix gebracht.
mfG,
steckl