Ajax [onreadystatechange] wird nicht aufgerufen! Warum nur?
Hans Wurst
- javascript
0 Hans Wurst0 Micha
Tach zusammen,
ich baue gerade einen Währungsrecher in unser Warenkorbsystem ein, der mit Hilfe von Ajax den jeweiligen aktuellen Währungskurs holt.
Für diese 6 Länder hole ich die Währungskurse ein, alle einzeln (asynchron).
LKZ_Arr = new Array(
new Array('HK', 'pic_hongkong', 'Hong Kong', 'HKD', 0),
new Array('SG', 'pic_singapore', 'Singapore', 'SGD', 0),
new Array('MY', 'pic_malaysia', 'Malaysia', 'MYR', 0),
new Array('TW', 'pic_taiwan', 'Taiwan', 'TWD', 0),
new Array('AU', 'pic_australia', 'Australia', 'AUD', 0),
new Array('NZ', 'pic_newzealand', 'New Zealand', 'NZD', 0)
);
onload der Seite wird diese Schleife gestartet, die 6 Ajax-Requests absendet
for(i=0; i < LKZ_Arr.length; i++) {
getAjax(LKZ_Arr[i][0], "from=EUR&to="+ LKZ_Arr[i][3]);
}
Hier meine Ajax-Funktion
http_request = false;
function getAjax(country, param) {
if(window.XMLHttpRequest) { // Mozilla, Safari
http_request = new XMLHttpRequest();
}
else if(window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e) {}
}
}
if(!http_request) {
alert("Error!\nRequest could not be done!");
return false;
}
http_request.onreadystatechange = function() { getAjaxData(country); }
http_request.open("POST", "https://www.example.com/cgi-bin/currencyconverter.pl", false);
http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
http_request.send(encodeURI(param));
}
// Hier die Auswertung
function getAjaxData(country) {
if(http_request.readyState == 4 && http_request.status == 200) {
var resXML = http_request.responseText.substring(http_request.responseText.indexOf("<double")+44, http_request.responseText.indexOf("</"));
for(i=0; i < LKZ_Arr.length; i++) {
if(LKZ_Arr[i][0] == county) { LKZ_Arr[i][4] = resXML; }
}
}
}
Das Problem ist jetzt, dass wenn ich asynchron die Ergebnise hole, wird die Funktion "onreadystatechange" niemals aufgerufen, also findet keine Verarbeitung statt. Wenn ich es synchron mache, habe ich zusammengewürfelte Ergebnise da es Überschneidungen gibt.
Warum wird beim asynchronen Senden die Funktion nicht aufgerufen?
Ok, ich habe es umgangen, indem ich einfach in der getAjax() Funktion die Daten auswerte, dann gehts.
Aber mich würde es trotzdem interessieren warum das so ist wie im ersten Post beschrieben...
Hallo Hans Wurst,
zunächst: Eine Antwort auf Dein eigentliches Problem habe ich nicht bzw. ich bin mir nicht sicher. Möglicherweise überschreibst Du in der Schleife den Aufruf bzw. Dein Objekt immer wieder. Das würde zumindest erklären, warum beim asynchronen Aufruf alles "durcheinander" ankommt. Ich wäre daher anders an die Sache gegangen.
http_request = false;
Zum einen würde ich die Variable http_request nicht global deklarieren sondern in der Funktion getAjax. Somit wird bei jedem Aufruf ein eigenes Objekt erzeugt, die dann auch parallel abgearbeitet werden können.
http_request.onreadystatechange = function() { getAjaxData(country); }
Ich würde an dieser Stelle den String aus http_request.responseText an die Funktion zur Weiterverarbeitung übergeben:
http_request.onreadystatechange = function() { if (http_request.readyState == 4) getAjaxData(http_request.responseText); }
Die Variable country wird scheinbar nicht benötigt, wenn doch, einfach wieder hinzufügen. Ansonsten kannst Du nun mit dem String in getAjaxData das machen, was Du damit vorhattest...
Mit freundlichem Gruß
Micha