[AJAX] Fehler des "nsIXMLHttpRequest.status"

Da Hacker

Erfahrenes Mitglied
Hallo liebe Community,

ich sitze jetzt schon mehrere Tage an einer Exception die mir von der XMLHTTPRequest-Komponente geworfen wird. Ziemlich dubios das Ganze. Die Fehlermeldung sieht laut FireBug (Firefox-Extension zum Debuggen von Skripts) so aus:

uncaught exception: [Exception... "Component returned failure code: 0x80040111 (NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://lwtv.de/projects/lwlife/js/javascript.js :: interpretRequest :: line 40" data: no]

Ich habe keine Ahnung was das heißen soll. Yahoo bietet mir auch nur unzufriedenstellende Ergebnisse, die nicht auf mein Problem anwendbar sind.

Ich poste jetzt mal der Reihe nach meine Codeblöcke mit Beschreibung.

1. Ich habe eine Auswahlliste. Jedes Mal wenn der User hier Änderungen vornimmt, frage ich die entsprechenden Werte mittels Ajax ab:
HTML:
<select name="Select1" name="D1" onchange="javascript:load_streetinfo( document.streets.Select1.value, 'streetinfo' );">

2. Die Javascript-Funktion "load_streetinfo()" erwartet zwei Parameter. Den aktuell ausgewählten Index der Auswahlliste und den Container in den die Informationen reingeschrieben werden sollen. Hier mal Javascript.js:
Javascript:
function ajaxRequest()
{
	// Request erzeugen
	if (window.XMLHttpRequest) {
		request = new XMLHttpRequest(); // Mozilla, Safari, Opera
	} else if (window.ActiveXObject) {
		try {
			request = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
		} catch (e) {
			try {
				request = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
			} catch (e) {}
		}
	}
	return request;
}

function interpretRequest(request, container_id)
{
	switch (request.readyState) {
		// wenn der readyState 4 und der request.status 200 ist, dann ist alles korrekt gelaufen
		case 4:
			if (request.status != 200) {
				document.getElementById(container_id).innerHTML = "Es ist ein Fehler aufgetreten: " + request.status;
			} else {
				var content = request.responseText;
				// den Inhalt des Requests in das <div> schreiben
				if(content == '')
				{
					document.getElementById(container_id).innerHTML = 'Es gibt keine Daten';
				}
				else
				{
					document.getElementById(container_id).innerHTML = content;
				}
			}
		break;
		
		default:
			document.getElementById(container_id).innerHTML = "Es ist ein Fehler aufgetreten: " + request.status;
		break;
	}
}

function load_streetinfo( street_id, container_id )
{
	var request = ajaxRequest();
	
	// überprüfen, ob Request erzeugt wurde
	if (!request) {
		document.getElementById(container_id).innerHTML = "Fehler beim Abruf der Informationen!";
		return false;
	} else {
		var url = './game.php?action=streetinfo';
		// Request öffnen
		request.open('GET', url, true);
		// Requestheader senden
		request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		// Request senden
		request.send( 'street='+street_id );
		// Request auswerten
		request.onreadystatechange = interpretRequest(request, container_id);
	}
}

Ich denke das ist soweit noch nachvollziehbar. Oder?

3. Im obigen Javascript-Code rufe ich also game.php(mit der action streetinfo) auf und übergebe als GET-Parameter die Variable "street" - das ist einfach der ausgewählte Index der Auswahlliste.
Javascript:
		var url = './game.php?action=streetinfo';
		// PER GET die PHP-Datei aufrufen, die sich um die Verarbeitung des Auswahllisten-Index und um Bereitstellung der vom Index abhängigen Daten kümmert.
		request.open('GET', url, true);
		// HIER NOCH DEN AUSWAHLINDEX MITSCHICKEN:
		request.send( 'street='+street_id );

4. Aber genau hier scheint sich schon irgendwo ein Fehler zu verstecken, den die Javascriptfunktion "interpretRequest()" zu verursachen scheint! Ich habe aber schon meine erstes - erfolgreiches - Ajaxscript in dieser Art geschrieben und es gab keine Probleme. Diesmal habe ich nur versucht das ganze etwas logischer in drei Funktionen aufzusplitten und anfangs hat es auch geklappt. Bis ich dann irgendwann weitere Variablen ins Spiel gebracht habe und alles aus dem Ruder gelaufen ist.


Ich hoffe, dass ich alles verständlich ausdrücken konnte und dass mir hier jemand einen Weg aus meiner Ausweglosigkeit zeigen kann.

Möchtet ihr euch den Fehler am aktuellen Beispiel ansehen, dann habe ich hier einen Login für euch bereitgestellt:
http://lwtv.de/projects/lwlife/?username=tutorials&password=tutorials

Einfach "Weiterspielen!" anklicken und der erste Screen, der erscheint ist schon das Sorgenkind. Hier einfach den Wert in der Auswahlliste(mit den Straßennamen) ändern und ihr solltet - zumindest in der FireBug-Extension - einen Fehler sehen.
Das wirklich seltsame ist ja, dass mir FireBug dennoch eine Antwort anzeigt, die auch halbrichtig ist:
"Ich bin Ajax Datum: XYZ<br />Und ganz wichtig auch die Strasse: ".
Genau das liefert eigentlich die PHP-Datei zurück. Nur es fehlt halt leider die Straße, was aber wie ich vermute an dieser dämlichen Exception liegt.

Wenn ihr irgendwas nicht versteht, fragt einfach. Ich werde versuchen es euch möglichst genau zu erklären.

Riesigen Dank im Voraus

Adam
 
Moin Adam,

du willst per GET senden, da musst du die zu Übermittelnden Daten in der URL unterbringen, und nicht send() als Parameter übergeben.

send() musst du bei GET mit dem Parameter null aufrufen

Also so:
Code:
var url = './game.php?action=streetinfo';
request.open('GET', url+'&street='+street_id, true);
request.send(null);
 
Hi,

weiterhin muss die callback-Funktion für den onreadystatechange-Handler anders zugewiesen werden:
Code:
request.onreadystatechange = function(){
  interpretRequest(request, container_id);
}

Ciao
Quaese
 
Schönen Guten Abend ihr Beiden

Entschudligt, dass ich so lange mit meiner Antwort auf mich warten ließ. Wollte euch schon aus der Schule antworten, aber die Pausen sind immer so kurz -.-

Auf jeden Fall möchte ich mich SEHR bei euch bedanken. Ihr habt mir die Welt für bessere interaktive Websiten weiter geöffnet! Es funktioniert dank euch wunderbar(ihr könnt euch noch eine bestimmte Zeit das Ergebnis anschauen)

Ich hatte Bedenken, dass meine Frage zu kompliziert formuliert ist, aber ihr wart so schlau und habt mich gleich verstanden und die richtige Lösung genannt.

Also wirklich DANKE vielmals! Mit eurer Hilfe kann ich meine Odysee fortsetzen.

Habt noch eine schöne Zeit!

Adam
 

Neue Beiträge

Zurück