Ajax / Verzögerung

Geflügel

Erfahrenes Mitglied
Mein Problem: "Zeile B" wird aufgerufen, bevor der Ajax-Aufruf ("Zeile A") überhaupt fertig ist. Woran liegt das und wie kann man das verhindern? Denke mal dass das ein allgemeines Ajax-Problem ist..

Code:
function AjaxTest( ... )
{
  this.Result = new Array();
  this.Go = function GetAjaxResponse()
  {
    mkAjaxRequest( 'foo.xml' ); // Zeile A
    alert( 'hund' ); // Zeile B
  }
}


  function mkAjaxRequest( uri )
  {
    ...
   HTTPRequest = new XMLHttpRequest();
   ...
    HTTPRequest.onreadystatechange =
      function()
      {
        alertContents( HTTPRequest );
      };
    ...
  }

  function alertContents( HTTPRequest )
  {
    ...
    ...
  }
 
Hi,

das von dir beschriebene Phänomen ist das asynchrone Verhalten, das durch das erste A in AJAX
bezeichnet wird. Es ist also gewollt, dass die Anwendung so reagiert.

Es besteht allerdings auch die Möglichkeit, den Request synchron laufen zu lassen. In diesem Fall muss
der dritte Parameter der open-Methode auf false gesetzt werden. Weiterhin wird die callback-Funktion
in onreadystate durch einen "normalen" Funktionsaufruf ersetzt.
Code:
  function mkAjaxRequest( uri )
  {
    ...
   HTTPRequest = new XMLHttpRequest();
   ...
   HTTPRequest.open("GET", uri, false);
   HTTPRequest.send(null);
   new function(){
      alertContents(HTTPRequest);
   }
    ...
  }

  function alertContents( HTTPRequest )
  {
    ...
    ...
  }
Ciao
Quaese
 
Also "onreadystate" kann man komplett entfernen?

Mein Code sieht jetzt so aus:

Code:
....

  function mkAjaxRequest( uri )
  {
    var HTTPRequest;
    HTTPRequest = new XMLHttpRequest();
    HTTPRequest.open( 'GET', 'ajax.php?q=1', false );
    HTTPRequest.send( null );
   	new function()
   	{
      alertContents( HTTPRequest );
   	}
  }

...

  function alertContents( HTTPRequest )
  {
   ....
    if( HTTPRequest.readyState == 4 )
    {
      alert ( HTTPRequest.responseText); // ZEILE A
   }
  ....

So... jetzt enthält "HTTPRequest.responseText" den QUELLTEXT von ajax.php (mein Uri-Parameter) und nicht die XML Datei, die ajax.php eigentlich generiert. Woran kann das liegen? Wenn ich ajax.php im Browser aufrufe, dann wird mir die XML-Datei angezeigt, die eigentlich auch in HTTPRequest.responseText, bzw. HTTPRequest.responseXML stehen sollte. Ich bitte um eure Hilfe. (!):)
 
Hi,

bei mir scheint es problemlos zu funktionieren. Mit folgenden Dateien habe ich es getestet:

HTML:
Code:
<html>
<head>
<title>www.tutorials.de</title>
<meta name="author" content="Quaese">
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">

<script type="text/javascript">
<!--
var xmlHttp = false;

function instanceRequest(){
  if(window.XMLHttpRequest){ // Mozilla, Safari,...
    xmlHttp = new XMLHttpRequest();
    if(xmlHttp.overrideMimeType){
      xmlHttp.overrideMimeType('text/xml');
    }
  }else if(window.ActiveXObject){ // IE
    try{
      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    }catch(e){
      try{
      	xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
      }catch(e){}
    }
  }

  if(!xmlHttp){
    alert('Kann keine XMLHTTP-Instanz erzeugen!');
    return false;
  }
}

function reqFunc() {
  // Falls noch ein Request-Objekt existiert -> zunächst beenden
  if(xmlHttp && xmlHttp.readyState){
    xmlHttp.abort( );
    xmlHttp = false;
  }

  if(!xmlHttp){
    instanceRequest();
  }

  xmlHttp.open('GET', 'xmlhttp_request_dummy.php?id=1', false); 
  xmlHttp.send(null);
  alertContents(xmlHttp);
}

function alertContents(objRequest){
  alert(objRequest.responseText);
  //alert(objRequest.responseXML);
}

//-->
</script>

</head>
<body>
<a href="#" onclick="reqFunc(); return false;">ajax</a>
</body>
</html>
xmlhttp_request_dummy.php
Code:
<?php
if($_GET['id']=="1"){
  echo("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
  echo("<verzeichnis>\n");
  for($i=1; $i<11; $i++){
    echo("<datei>\n");
    echo("<name>".$i.".jpg</name>\n");
    echo("<groesse>".rand(50, 150)."</groesse>\n");
    echo("</datei>\n");
  }
  echo("</verzeichnis>");
}else{
  echo('Dumm gelaufen!');
}
?>
Vielleicht kannst du etwas damit anfangen.

Ciao
Quaese
 

Neue Beiträge

Zurück