a5cl3p1o5: AJAX/SJAX - Warten bis XMLhttp-Request Antwort liefert

Hallo Forenaktive,

ich hoffe, ihr könnt mir helfen:

Ich habe vor, einen XMLhttp-Request absetzen und zuvor einen Preloader einzublenden und nach Erhalt der Antwort wieder auszublenden.

Mit folgendem Code setze ich einen SYNCHRONEN Request ab, d.h. der Programmcode soll bewusst warten bis eine Antwort geliefert wurde.

	function getdatafunc(fileUrl) {  
		var req;  
		var fileContent;  
		// Firefox etc.  
		if (window.XMLHttpRequest) {  
			req = new XMLHttpRequest();  
			req.open("GET", fileUrl, false);  
			req.send(null);  
			fileContent = req.responseText;  
		}  
		// Internet Explorer  
		else if (window.ActiveXObject) {  
			req = new ActiveXObject("Microsoft.XMLHTTP");  
			req.open("GET", fileUrl, false);  
			req.onreadystatechange=function() {  
				if (req.readyState == 4) {  
					fileContent = req.responseText;  
				}  
			}  
			req.send(null);  
		}  
		return fileContent;  
	}  

Von der Idee her, soll der Preloader angezeigt werden, die Daten geladen und anschließend der Preloader ausgeblendet werden:

document.getElementById('preloader').style.visibility = 'visible'; //Preloader anzeigen  
data = eval(getdatafunc(fileUrl)); //SJAX-Request absetzen  
document.getElementById('preloader').style.visibility = 'hidden'; //Preloader ausblenden

Im Firefox funktioniert dieser Ansatz. Im Internet Explorer wird der Request wie ein AJAX-Request behandelt und der Code weiter ausgeführt. Der Preloader wird daher sofort wieder ausgeblendet.

Hat jemand eine Idee, wie ich auch im Internet Explorer das gewünschte Ergebnis erziele?

Viele Dank im Voraus!
a5cl3p1o5

  1. Moin!

    Mit folgendem Code setze ich einen SYNCHRONEN Request ab, d.h. der Programmcode soll bewusst warten bis eine Antwort geliefert wurde.

    Aber warum?

    Gib dem AJAX eine Callback-Funktion mit, die nach dem abgearbeiten Request den Preloader ausblendet. Das ist die übliche Vorgehensweise für das Problem.

    - Sven Rautenberg

  2. Hallo a5c... ach ich sag einfach ScriptKiddy*

      // Firefox etc.  
      [..]  
      // Internet Explorer  
      [..]  
      	req.onreadystatechange=function() {  
      [..]  
    

    Wieso fängst du das onreadystatechange-Event nur beim IE ab?
    Eventuell interessiert dich ja besonders readyState "1".
    Ich vermisse auch die Abfrage des Request-Status.

    Von der Idee her, soll der Preloader angezeigt werden, die Daten geladen und anschließend der Preloader ausgeblendet werden:

    Keine schlechte Idee, fang readyState entsprechend ab.

    document.getElementById('preloader').style.visibility = 'visible'; //Preloader anzeigen

    document.getElementById('preloader').style.visibility = 'hidden'; //Preloader ausblenden

      
    Schöner wäre es, den Preloader per JS zu erstellen, ins DOM einzuhängen und abschließend wieder zu entfernen.  
      
    
    > Hat jemand eine Idee, wie ich auch im Internet Explorer das gewünschte Ergebnis erziele?  
      
    Ich bin mir nicht sicher ob ich dein Problem verstanden habe.  
    Was sagt denn die Fehlerkonsole?  
      
      
    Grüße, Matze  
      
    \* SCNR - der Name ist aber auch...