Requestfunktion funktioniert im FireFox und Camino nicht

K

koli.bri

Hallo Ihr da draußen:

Untenstehende Funktion tut ihren Dienst zwar erstklassik in Safari und Opera, jedoch FireFox und Camino wehren sich wehement.

Anfangs gab mir FF noch eine Meldung aller "Syntax Error", den ich aber mit hilfe der angegebenen Seite ( diese hier ) weg bekommen habe.
(Das Script selbst hab ich auch von dieser seite, und wurde nur ein "wenig" modifiziert. Um das Switch-Case-Konstrukt braucht ihr euch eigentlich nicht kümmern, das kommt eh noch raus. Aber vorher soll das Script mit FF laufen, damit ich mit dem Debugger nen anderen Fehler rausprügeln kann.)

Ich nehme an, dass es etwas mit dem Mime-Type oder dem Header des Requests zu tun hat, den Safari und Opera sich selbst zurechtpflücken können, FireFox jedoch höhere Ansprüche hat.

Was mit der Funktion gemacht wird:
Es wird normaler Text (plain/text) zurückgegeben, größtenteils HTML-Bausätze, die mittels JavaScript in diverse DIVs eingefügt werden.
An anderer Stelle werden so Daten zwischen JavaScript und PHP ausgetauscht (quasi ein selbstgebasteltes JSON, aber nur ganz rudimäntär)
Daher schließt für mich die Verwendung eines MimeTypes für HTML-Blöcke erstmal aus :)

Der aktuelle Testfall, SOLL-Zustand
Es werden User und Passwort überprüft. durch das Formular wird ein Request gestartet, der im Idealfall
Code:
ok
zurückgibt. Das wird in der abarbeitenden Funktion überprüft, und etwas in eine globale Variable geschrieben. Im Idealfall.

IST-Zustand:
Nicht einmal das alert("Hier bin ich") klappt...

Ich hoffe, das waren genug informationen...
Falls nicht, fragen...

gruß
Lukas


PS.: die Funktion "dw()" ist nur eine Testfunktion, die mir das Parameter in ein Testausgabefeld schreibt, damit ich die ganzen Alerts nicht wegklicken muss.


Code:
/*
 * dat/js/request.js
 *	Requestfunktion fuer das gesamte Projekt
 *
 */
var request_funcs = new Array();
function macheRequest(url,funktion,vari) {
//	dw(url);	// DEBUG
	http_request = false;
	
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
		http_request = new XMLHttpRequest();
		if (http_request.overrideMimeType) {
//			http_request.overrideMimeType('text/xml');	//  http://developer.mozilla.org/de/docs/AJAX:Getting_Started#Schritt_3_.E2.80.93_.22Jetzt_alle_zusammen.21.22_-_Ein_einfaches_Beispiel
		}
	} 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('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
		return false;
	}
	http_request.onreadystatechange = function(){
	if (http_request.readyState == 4) {
		alert("Hier bin ich");
//		alert(http_request.status);
		if (http_request.status == 200) {
		//	dw(http_request.responseText);	// DEBUG
			switch(funktion){
				case "checklogin":
					handle_login(http_request.responseText);
				break;
//				case "":
//				break;
				case "menueitem":
				case "menueausr":
				case "menuezaub":
				case "menueskil":
				case "menuewaff":
				case "menuerust":
				case "menuezube":
				case "menuestat":
				case "menuegrup":
					handle_menue(http_request.responseText);
				break;
				case "menuegrupaktiv":
					handle_menuegrupaktiv(vari);
				break;
				case "menuegrupdeakt":
					handle_menuegrupdeakt(vari);
				break;
				case "menueausrwaffselect":
				case "menueausrrustselect":
				case "menueausrzubeselect":
					handle_menueausrselect(http_request.responseText);
				break;
				case "menueausrwaff":
				case "menueausrrust":
				case "menueausrzube":
					handle_menueausritem(http_request.responseText);
				break;
				case "menuewaffshow":
				case "menuerustshow":
				case "menuezubeshow":
					handle_menueshowausr(http_request.responseText);
				break;
				case "kampf_holedaten":
					handle_play_kampf_holedaten(http_request.responseText);
				break;
				case "":
					alert("Keine Funktion beim Request genannt\nABBRUCH");
				break;
				default:
//					dw("Funktion via Variable *Yeah*");
					var func = request_funcs[funktion];
					if(undefined != func){
						func(http_request.responseText);
					}else{
						dw("Diese Funktion " + funktion + " gibt es wohl nicht");
					}
//					alert("Ungueltige Funktion beim Request genannt\n" + funktion + "\nABBRUCH");
				break;
			
			}
		
//			handleevent(http_request.responseText,1);
			//alert(http_request.responseText);
		} else {
				alert('Bei dem Request ist ein Problem aufgetreten.');
		}
	}
}
//	http_request.setRequestHeader('Content-Type', 'text/plain');
	http_request.open('GET', url, false);
	http_request.send(null);
}
 
Ändere ich die Zeile

PHP:
http_request.open('GET', url, false);
in
PHP:
http_request.open('GET', url, true);
klappt es, zumindest der eigentliche Request...

aber dannn hält das Script nicht an, während der Request läuft. Aber genau das will ich.

Können Camino und FireFox vielleicht gar keine Synchronen Requests?
Langsam verzeifle ich...

gruß
Lukas
 
:faint:

Die Lösng des Problems ist denkbar einfach, aber für jemanden, der sich mit HttpRequests noch nicht zu intensiv außeinandergesetzt hat, leider nicht auf anhieb nachvollziehbar:

Das Problem ist, dass die Call-Back-Methode "onreadystatechange" NUR bei Asynchronen Requests benötigt, bzw. nur bei denen erlaubt ist. Bei meinen Synchronen bringt sie schlichtweg nichts.

Jetzt sind Safari und Opera aber so anwenderfreundlich, dass sie diese Methode dennoch aufrufen.

Nimmt man diese Methode jetzt raus, funktioniert es, FAST zumindest.
Denn jetzt kommt der Part, für den man "ganz einfach" denken muss.

Das
PHP:
	http_request.open('GET', url, false);
	http_request.send(null);

Muss natürlich ÜBER dem Part stehen, der den Request verabeitet. (Dafür hab ich etwa 2 Stunden grübeln und disskutieren mit wem anders gebraucht...)

Also, kurz gesagt: Das ist die fertige, funktionierende Requestfunktion für Synchrone Http-Requests, mit ein paar Kommentaren :)

PHP:
var request_funcs = new Array();
function macheRequest(url,funktion,vari) {
//	dw(url);	// DEBUG
	http_request = false;
	
	if (window.XMLHttpRequest) { // Mozilla, Safari,...
// Den Request selbst hab ich der einfacheit halber mal auf ein Minimum reduziert.
		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('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
		return false;
	}
// Dieser Part Muss bei einer Synchronen Requestierung VOR dem abarbeitenden Part stehen!!!!
	http_request.open('GET', url, false);
	http_request.send(null);

	if (http_request.readyState == 4) {
		if (http_request.status == 200) {
// Das Switch-Case Konstrukt sorgt dafür, dass man mit dem Parameter
// "funktion" eine bestimmte Funktion aussuchen kann, die den Request verarbeitet.

			switch(funktion){
				case "menueausrwaffselect":
				case "menueausrrustselect":
				case "menueausrzubeselect":
					handle_menueausrselect(http_request.responseText);
				break;
				case "menueausrwaff":
				case "menueausrrust":
				case "menueausrzube":
					handle_menueausritem(http_request.responseText);
				break;
				case "menuewaffshow":
				case "menuerustshow":
				case "menuezubeshow":
					handle_menueshowausr(http_request.responseText);
				break;
//				case "kampf_holedaten":
//					handle_play_kampf_holedaten(http_request.responseText);
//				break;
				case "":
					alert("Keine Funktion beim Request genannt\nABBRUCH");
				break;
				default:
// Um nicht für jeden möglichen Request einen CaseZweig anzulegen wird für die
// Requests, die NICHT direkt über einen JavaScript-Link aufgerufen werden
// mit Hilfe von Variablenfunktionen die entsprechende Funktion ausgesucht. Siehe auch den Link weiter unten
//					dw("Funktion via Variable *Yeah*");
					var func = request_funcs[funktion];
					if(undefined != func){
//dw(func);
						func(http_request.responseText,vari);
					}else{
						dw("Diese Funktion " + funktion + " gibt es wohl nicht");
					}
				break;
			
			}
		
		} else {
				alert('Bei dem Request ist ein Problem aufgetreten.');
		}
	}
}

Variablenfunktionen in JavaScript

So, jetzt kann ich mich endlich an das eigentliche Problem setzen (hab das ganze ja nur gemacht, damit mein Projekt auch im FF läuft, weil ich da einen Debugger habe... :D

gruß
Lukas
 
Ich würde dir ja ehrlich gesagt empfehlen, eine vorgefertigte Bibliothek zu verwenden, dass dir die ganzen Browser-Inkompatibilitäten abfängt. z.B. http://www.prototypejs.org/
 
Das sagen mir irgendwie alle :D
Aber dann würde ich das nicht lernen.
Und ich vertrete den Standpunkt, dass ich eine Technik beherschen will, wenn ich sie anwende.
Zudem, das Problem lag hier ja nicht bei den verschiedenen Browsern, sondern daran, dass Synchrone Requests anders ablaufen als Asynchrone.

Vielleicht sollte ich es in meine Signatur aufnehmen, dass ich alles selber machen will :D :D :D

gruß
Lukas
 
Das sagen mir irgendwie alle :D
Aber dann würde ich das nicht lernen.
Und ich vertrete den Standpunkt, dass ich eine Technik beherschen will, wenn ich sie anwende.
Lernen in allen Ehren, aber sich mit Browser-Inkompatibilitäten rumschlagen ist verschwendete Zeit. ;)
Zudem, das Problem lag hier ja nicht bei den verschiedenen Browsern, sondern daran, dass Synchrone Requests anders ablaufen als Asynchrone.
Na das hier klingt aber schon danach, dass es daran lag, dass die Browser das unterschiedlich handhaben.

Das Problem ist, dass die Call-Back-Methode "onreadystatechange" NUR bei Asynchronen Requests benötigt, bzw. nur bei denen erlaubt ist. Bei meinen Synchronen bringt sie schlichtweg nichts.

Jetzt sind Safari und Opera aber so anwenderfreundlich, dass sie diese Methode dennoch aufrufen.
 
Zurück
Oben Unten