Requestfunktion funktioniert im FireFox und Camino nicht

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von koli.bri, 28.02.2007.

  1. koli.bri

    koli.bri Thread Starter Gast

    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);
    }
     
  2. koli.bri

    koli.bri Thread Starter Gast

    Ändere ich die Zeile

    PHP:
    http_request.open('GET'urlfalse);

    in
    PHP:
    http_request.open('GET'urltrue);

    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
     
  3. koli.bri

    koli.bri Thread Starter Gast

    :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'urlfalse);
        
    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'urlfalse);
        
    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
     
  4. Darii

    Darii MacUser Mitglied

    Beiträge:
    2.066
    Zustimmungen:
    110
    MacUser seit:
    24.02.2004
    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/
     
  5. koli.bri

    koli.bri Thread Starter Gast

    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
     
  6. Darii

    Darii MacUser Mitglied

    Beiträge:
    2.066
    Zustimmungen:
    110
    MacUser seit:
    24.02.2004
    Lernen in allen Ehren, aber sich mit Browser-Inkompatibilitäten rumschlagen ist verschwendete Zeit. ;)
    Na das hier klingt aber schon danach, dass es daran lag, dass die Browser das unterschiedlich handhaben.

     
Die Seite wird geladen...

Diese Seite empfehlen