readyState bleibt bei 4
AjaxDummy
- javascript
hallo leute,
suche jetzt schon seit stunden im internet, aber leider keine lösung.
ich habe ein html mit ajax-programmchen mit php geschrieben.
darin wähle ich in einem dropdownmenu ein element aus und erhalte die dazugehörigen daten. unter ff geht auch alles glatt nur bei ie erhalte ich die daten nur bei ersten mal.
wenn ich ein weiteres element auswähle tut sich garnichts.
<select onchange="wetter(this.value)">...usw.
die funktion wetter() wird beim jeden auswahl eines neuen elementes aus dem menu aufgerufen. das sehe ich, wenn ich ein alert() einfüge.
aber irgendwas stimmt mit dem onreadystatechange nicht.
kann es sein, dass es unter ie damit allg. probleme gibt?
danke schon mal jetzt für hilfe
ajaxDummy
aber irgendwas stimmt mit dem onreadystatechange nicht.
kann es sein, dass es unter ie damit allg. probleme gibt?
nein.
Struppi.
Ok, kannst Du mir dann sagen, wo ich denn Fehler mache??
die funktion wetter(day) sieht wie folgt aus:
function wetter(day){
anfrage.onreadystatechange = function(){
if(anfrage.readyState == 4){
if(anfrage.status == 200){
var wetterdaten = anfrage.responseText;
bearbWetterdaten(wetterdaten);
}
}
};
anfrage.open('GET', 'wetter.php?day='+day, true);
anfrage.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
anfrage.send(null);
}
Zuvor wird natürlich global "anfrage" erstellt. Das ist getrennt für IE und FF, Mozilla, Opera...usw.
Daran dürfte es auch nicht liegen, denn die daten werden beim ersten auswahl ja auch erstellt und übergeben. nur beim zweiten auswahl passiert unter ie absolut garnichts.
ich habe mal mit alert den readyState ausgeben lassen und mir fällt auf, dass unter ff beim zweiten aufruf der Wert wieder bei 1 anfängt, währen auf ie es bei 4 bleit. - vielleicht ist das ja wichtig.
danke schon vorab
Daran dürfte es auch nicht liegen, denn die daten werden beim ersten auswahl ja auch erstellt und übergeben. nur beim zweiten auswahl passiert unter ie absolut garnichts.
Da ist es natürlich schwierig eine Fehlerdiagnose zu machen. Es ist durchaus möglich mehrere Request hintereinander zu machen. Du weißt wo du die Fehlermeldungen im IE findest?
Struppi.
Du weißt wo du die Fehlermeldungen im IE findest?
Struppi.
Hm, ehrlich gesagt nicht! *bittenichtschlagen*
wie bekomm ich denn die fehlermeldungen raus?
Hm, ehrlich gesagt nicht! *bittenichtschlagen*
Naja, dann ist zumindest die aussage "es passiert nichts" entschuldbar.
wie bekomm ich denn die fehlermeldungen raus?
Bei einem Fehler im IE bekommst du ein gelbes Ausrufezeichen in der Statusleiste. Bei einem Doppelklick poppt ein Fenster mit den Fehlermeldungen auf
Struppi.
Bei einem Fehler im IE bekommst du ein gelbes Ausrufezeichen in der Statusleiste. Bei einem Doppelklick poppt ein Fenster mit den Fehlermeldungen auf
Struppi.
Achso, das hätte ich aber gewusst. Nur da ist keine Meldung. Da ist weiterhin das logo von ie und "Fertig".
Ich versuch mal mehr Code zu posten - versimpelt!
<select onchange="wetter(this.value)">
<option value="1">montag</option>
<option value="2">dienstag</option>
</select>
Die funktion wetter() habe ich bereits gepostet. Ich poste noch die erstellung der "anfrage"
var anfrage = false;
//für ie
try{
anfrage = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
anfrage = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){
anfrage = false;
}
}
//für ff, opera, safari...
if(!anfrage && typeof XMLHttRequest != "undefined"){
anfrage = new XMLHttpRequest();
anfrage.overrideMimeType("text/xml");
}
Ansonsten fällt mir nix mehr ein.
hoffe ihr könnt mir helfen, da ich sonst noch durchdrehe.
Jetzt fehlt nur noch der Part, in dem folgendes passiert:
anfrage.open('[GET|POST]','[URL]',[Async=true, false]);
anfrage.send(null);
Und was Du noch mit der Anfrage machst. Schicke doch einfach den ganzen JavaScript-Code (optimalerweise als URL auf die Datei), dann können wir Dir wesentlich besser helfen.
Gruß, LX
Leider habe ich nicht die möglihckeit etwas irgendwohin hoch zu laden, daher poste ich mal alles - hoffe es ist nicht zu viel
html-teil
<select onchange="wetter(this.value)">
<option value="1">montag</option>
<option value="2">dienstag</option>
</select>
der JS bereich:
var anfrage = false;
//für ie
try{
anfrage = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
anfrage = new ActiveXObject("Microsoft.XMLHTTP");
}catch(e){
anfrage = false;
}
}
//für ff, opera, safari...
if(!anfrage && typeof XMLHttRequest != "undefined"){
anfrage = new XMLHttpRequest();
anfrage.overrideMimeType("text/xml");
}
function wetter(day){
anfrage.onreadystatechange = function(){
if(anfrage.readyState == 4){
if(anfrage.status == 200){
var wetterdaten = anfrage.responseText;
bearbWetterdaten(wetterdaten);
}
}
};
anfrage.open('GET', 'wetter.php?day='+day, true);
anfrage.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
anfrage.send(null);
}
aber ehrlich gesagt könnte ich genauso anstatt:
var wetterdaten = anfrage.responseText;
bearbWetterdaten(wetterdaten);
einfach nur alert("hallo");
schreiben. Das Problem ist, das ich nicht in den block komme, wo der status==200 ist (aber nur beim zweiten mal - beim ersten mal geht alles glatt)
schreiben. Das Problem ist, das ich nicht in den block komme, wo der status==200 ist (aber nur beim zweiten mal - beim ersten mal geht alles glatt)
Immer? Oder nur manchmal?
Struppi.
Immer? Oder nur manchmal?
Struppi.
Also wenn ich das erste mal ein element ausähle z.b. montag,
dann komme ich in den bereich onreadystatechange rein.
wenn ich dann z.b. dienstag auswähle, ohne die html seite neu zu laden, dann geht er erst garnicht in den block mit onreadystatechange rein.
auch nicht, wenn ich dann wieder montag wähle oder eben was anderes.
Also nicht wie vermutet nur bei dem block, wo der status == 200 ist, sondern er verarbeitet garkeine statusänderung.
wenn ich dann z.b. dienstag auswähle, ohne die html seite neu zu laden, dann geht er erst garnicht in den block mit onreadystatechange rein.
auch nicht, wenn ich dann wieder montag wähle oder eben was anderes.
Das ist seltsam, aber so nicht erklärbar.
Struppi.
Das ist seltsam, aber so nicht erklärbar.
Struppi.
so wie ich das sehe, wird auf der js-datei nicht erkannt, dass der status des Requests sich ändern. Daher läuft er nicht ein zweites mal in den bereich von onreadystatechange rein.
Kann es sein, dass man den status dann manuell nochmal zurücksetzen muss?
Geht das überhaupt?
so wie ich das sehe, wird auf der js-datei nicht erkannt, dass der status des Requests sich ändern. Daher läuft er nicht ein zweites mal in den bereich von onreadystatechange rein.
Nein, da muss etwas anderes passieren, ich hab keine Probleme im IE mehrere Requests hintereinander zu verarbeiten.
Kann es sein, dass man den status dann manuell nochmal zurücksetzen muss?
Geht das überhaupt?
Nein, das passiert automatisch.
Struppi.
Hi,
function wetter(day){
anfrage.onreadystatechange = function(){
...
};anfrage.open('GET', 'wetter.php?day='+day, true);
anfrage.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
anfrage.send(null);
War da nicht irgendwas, dass der IE es nicht mag, wenn man den readyState-Handler vor dem Aufruf der open-Methode setzt ...?
MfG ChrisB
Sorry, meine Glaskugel ist gerade beschlagen, so dass ich die Ursache Deines Problems nicht erahnen kann. Poste doch bitte eine URL oder wenigstens den maßgeblichen Code.
Vorher: lese Deinen Code durch, teste ihn, indem Du alerts einfügst, etc, kommentiere einzelne Zeilen aus, bei denen Du nicht sicher bist, grenze das Problem so weit ein wie möglich - und komme dann wieder und stelle hoffentlich eine Frage, die wir auch beantworten können.
Gruß, LX
Hallo,
ich hatte dieses Problem auch schon mal mit dem IE.
Die Lösung war, die Erstellung des XMLHTTPRequest-Objekts in eine Funktion auszulagern (z.B. getXMLHTTPRequest()), welche dieses Objekt zurückgibt. In der eigentlichen Abfragefunktion wurde dann mit
if(var anfrage = getXMLHTTPRequest()){
...
}
das Objekt jedesmal neu erzeugt.
Grüße Basti
ich hatte dieses Problem auch schon mal mit dem IE.
Die Lösung war, die Erstellung des XMLHTTPRequest-Objekts in eine Funktion auszulagern (z.B. getXMLHTTPRequest()), welche dieses Objekt zurückgibt. In der eigentlichen Abfragefunktion wurde dann mit
Das ist keine Lösung eher eine Umgehung irgendeines anderen Problemes, da ich wie schon gesagt, ohne Problem im IE mehrere unterschiedliche Requests mit ein und demselben Objekt absetzen kann. Was in Anbetracht der Speicherproblem des IEs vermutlich auch besser ist.
Struppi.
Hallo,
da hast Du sicher recht - aber da ja immer alles schnell gehen muss, war ich damals froh, wenigstens diesen Weg gefunden zu haben.
Grüße Basti