richiehabbie: AJAX in einer Funktion mit Rückgabewert Problem im Firefox

Nachdem ich google schon stundenlang bemühe und keine Lösung finden kann, hoffe ich, dass mir hier jemand helfen kann.
Ich habe eine Schnittstelle zu einer Eventdatenbank auf meiner Webseite gebastelt und brauche dafür aus verschiedenen Dokumenten im Netz Inhalte.
Deshalb dachte ich es ist am besten eine kleine Ajax-Funktion zu basteln, der ich die URL übergebe und die mir dann ganz einfach den responseText über eine Variable zurückgibt.
Im InternetExplorer läuft das auch wie geschmiert. Allerdings scheint der Firefox da entweder ein Problem zu haben oder ganz anders vorzugehen. Jedenfalls gibt er mir dann am Ende der Funktion eine leere Variable aus. Es sei denn ich gebe irgendwas in einem Alert-Fenster aus. Egal was und es muss nur nach dem Request aufgerufen werden. Dann funktioniert es komischerweise. Wenn ich in besagtem Alert-Fenster die variable response ausgebe ist sie trotzdem leer aber das return funktioniert. Kann mir mal jemand erklären was da schief läuft??
Irgendwie hab ich im Netz was dazu gefunden dass ich die ganze sache synchron ablaufen lassen müsste. Aber bisher bin ich da auch zu keinem andern Ergebnis gekommen.

Hier mal der Quelltext der Funktion:

  
function ajaxReqest( url)  
					{  
						var response = ""; // Variable für die zurückgelieferten Inhalte  
						  
						//Erstellen eines Requests  
                 		var req = null;  
  
               		 		try{  
                    				req = new XMLHttpRequest();  
                				}  
               		 		catch (ms){  
                  		  		try{  
                    		    		req = new ActiveXObject("Msxml2.XMLHTTP");  
                 		   		}  
                  		  		catch (nonms){  
                      		 		 try{  
                           		 		req = new ActiveXObject("Microsoft.XMLHTTP");  
                       		 		}  
                       		 		catch (failed){  
                           		 		req = null;  
                       		 		}  
                   		 		}  
                			}  
  
                			if (req == null)  
                     		 	alert("Error creating request object!");  
  
                 		 	//anfrage erstellen (GET, url ,  
                  			//request ist asynchron  
                  			req.open("GET", url, true);  
							//req.send(null);  
                			//Pseudofunktion zum auslesen der Daten  
               			 	req.onreadystatechange = function(){  
                    			switch(req.readyState) {  
                           		 	case 4:  
                            			if(req.status!=200) {  
                                			alert("Fehler: "+req.status);  
                           				}else{  
                               			//schreibe die antwort auf die variable  
                                		response = req.responseText;  
                                		//req.abort();  
                            			}  
                            			break;  
                    	  
                            		default:  
                                				return false;  
                           						break;  
                        			}  
                        			//writeFromAjax( response); //schreibt die daten nochmal auf eine globale variable  
                    		};  
							//req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");  
               			 	req.send(null);  
               			 	writeFromAjax( response); //schreibt die daten nochmal auf eine globale variable  
               			 	writeFromAjax( response); //schreibt die daten nochmal auf eine globale variable  
               			 	//return response;  
					}  

  1. hi,

    die ms-Geschichte ist ok:

    if(window.ActiveXObject){
      request = new ActiveXObject("Microsoft.XMLHTTP");
    }

    ansonsten musst Du das Objekt so erstellen:

    if(window.XMLHttpRequest){
     request = new XMLHttpRequest();
    }

    dann klappts auch mit den anderen Browsern.

    Hotte

    1. Erst mal Danke für die schnellen Antworten. Das mit dem asynchron weiß ich bereits und den XMLHttpRequest regelt ja die try-catch-Anweisung schon. Deswegen habe ichs ja auch schon mit einem synchronen Request versucht, aber damit hab ich wenig Erfahrung und man muss den Code bestimmt etwas umbauen. Komischerweise funktionierts ja im IE auch ohne Alert. Die Frage zielte ja darauf ab, wie ich allgemein über ein Request die Daten aus einem andern Dokument einlesen und in einer Funktion als Rückgabewert ausgeben kann. Weil im Request erst dann eine weitere Funktion aufzurufen, wenn der Request erfolgreich war, bringt mich ja auch nicht weiter. Oder kann ich darin irgendwie ein return für die Funktion einbauen?

      1. Für alle, die das hier gelesen haben und die gleiche Absicht haben oder die es interessieren sollte: Hab es mit einer synchronen Abfrage hinbekommen. Der Code sieht wie folgt aus:

          
        function synRequest( url)  
        					{  
        						var response = ""; // Variable für die zurückgelieferten Inhalte  
        						//alert( "aufruf");  
        						//Erstellen eines Requests  
                         		var req = null;  
          
                       		 		try{  
                            				req = new XMLHttpRequest();  
                        				}  
                       		 		catch (ms){  
                          		  		try{  
                            		    		req = new ActiveXObject("Msxml2.XMLHTTP");  
                         		   		}  
                          		  		catch (nonms){  
                              		 		 try{  
                                   		 		req = new ActiveXObject("Microsoft.XMLHTTP");  
                               		 		}  
                               		 		catch (failed){  
                                   		 		req = null;  
                               		 		}  
                           		 		}  
                        			}  
          
                        			if (req == null)  
                             		 	alert("Error creating request object!");  
          
                         		 	//anfrage erstellen (GET, url ,  
                          			//request ist synchron  
                          			req.open("GET", url, false);  
        							req.send(null);  
        							  
        							if (req.readyState == 4)         //  Status fertig = 4  
        							{  
        								response = req.responseText;  
        							}  
        							else  
        							{  
        								alert("Request fehlgeschlagen!");  
        							}  
        							  
        							return response;  
          
        					}  
        
        
      2. Hi,

        Die Frage zielte ja darauf ab, wie ich allgemein über ein Request die Daten aus einem andern Dokument einlesen und in einer Funktion als Rückgabewert ausgeben kann. Weil im Request erst dann eine weitere Funktion aufzurufen, wenn der Request erfolgreich war, bringt mich ja auch nicht weiter.

        Doch, das ist das absolut übliche Vorgehen. Ohne das kein AJAX, sondern höchstens SJAX. Und letzteres will man i.a.R. nicht, weil es so lange das UI lahmlegt, bis die Antwort auf den Request da ist - dann hätte man sich das ganze aber gleich sparen können, und statt JavaScript zu verwenden bei ganz normalen Links bleiben können.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
  2. Hi,

    Im InternetExplorer läuft das auch wie geschmiert. Allerdings scheint der Firefox da entweder ein Problem zu haben oder ganz anders vorzugehen. Jedenfalls gibt er mir dann am Ende der Funktion eine leere Variable aus. Es sei denn ich gebe irgendwas in einem Alert-Fenster aus. Egal was und es muss nur nach dem Request aufgerufen werden. Dann funktioniert es komischerweise. Wenn ich in besagtem Alert-Fenster die variable response ausgebe ist sie trotzdem leer aber das return funktioniert. Kann mir mal jemand erklären was da schief läuft??

    Du scheinst das "A" in AJAX nicht verstanden zu haben.

    Was du nach dem Absenden des Requests im Code stehen hast, wird *sofort* ausgeführt - da ist die Antwort auf den Request noch gar nicht da.

    Gerade deshalb nutzt man ja den Event readyStateChange, um dann auf das Ergebnis des Requests zu reagieren, wenn es eintrifft.

    Dein alert verzögert unterbricht die restliche Scriptverarbeitung lange genug, so dass das Ergebnis dann schon da ist, wenn der Rest deines Codes sequentiell abgearbeitet wird - deshalb "funktioniert" es damit dann zufällig.

    Informiere dich also, was es mit dem *asynchron* auf sich hat, und wie man damit vernünftig umgeht.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.