Thomas: Ajax-Post-Request

Hallo,

Ich bin gerade dabei Ajax zu lernen und versuche hierbei einen Post request auszusenden und wieder auszuwerten. Dazu habe ich eine Funktion geschrieben:

  
<scriptlanguage="javascript" type="text/javascript">  
function postrequest(url,data) {  
  
function auswerten() {  
  if(httpObject.readyState == 4)  <------ Zeile 16!  
  {  
   if(httpObject.status == 200)  
   {  
   result = httpObject.responseText;  
   document.getElementById("ausgabe").innerHTML = result;  
   }  
  }  
}  
  
var httpObject = null;  
try  
{  
 httpObject = new XMLHttpRequest();  
}  
catch (ms)  
{  
 try  
 {  
        httpObject = new ActiveXObject("Msxml2.XMLHTTP");  
    }  
 catch (nonms)  
 {  
     try  
  {  
         httpObject = new ActiveXObject("Microsoft.XMLHTTP");  
     }  
  catch (failed)  
  {  
   httpObject = null;  
  }  
 }  
}  
if (httpObject != null)  
{  
 httpObject.onreadystatechange = auswerten;  
 httpObject.open('POST', url, true);  
 httpObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");  
 httpObject.setRequestHeader("Content-length", data.length);  
 httpObject.setRequestHeader("Connection", "close");  
 httpObject.send(data);  
}  
var httpObject = null;  
  
  
}  
</script>  

Leider geschiet keine Ausgabe. Das komische ist, dass wenn ich zum beispiel ein alert(""); in die Funktion auswerten setzte klappt alles wie geplant.

  
function auswerten() {  
alert("WENN ICH DAS MACHE KLAPPT ES!");  
  if(httpObject.readyState == 4)  
  {  
   if(httpObject.status == 200)  
   {  
   result = httpObject.responseText;  
   document.getElementById("ausgabe").innerHTML = result;  
   }  
  }  
}  

Ach ja, die Fehlerkonsole sagt:

Fehler: httpObject is null
Quelldatei: http://www.example.com/ajax/test.php
Zeile: 16

Hat jemand eine Idee wie ich dieses Problem lösen kann?

Vielen Dank im Vorraus

Thomas

  1. Hi,

    try
    {
    httpObject = new XMLHttpRequest();
    }
    catch (ms)

    wer sagt Dir, das hier ein Fehler aufläuft, so dass der catch Block ausgeführt wird?

    Teste doch mal sowas:

    if (window.XMLHttpRequest) { // Mozilla, Safari,...
                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) {}
                }
            }

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
    1. 你好 Thomas,

      <scriptlanguage="javascript" type="text/javascript">
      function postrequest(url,data) {

      function auswerten() {
        if(httpObject.readyState == 4)  <------ Zeile 16!
        {
         if(httpObject.status == 200)
         {
         result = httpObject.responseText;
         document.getElementById("ausgabe").innerHTML = result;
         }
        }
      }

      var httpObject = null;
      try
      {
      httpObject = new XMLHttpRequest();
      }
      catch (ms)
      {
      try
      {
              httpObject = new ActiveXObject("Msxml2.XMLHTTP");
          }
      catch (nonms)
      {
           try
        {
               httpObject = new ActiveXObject("Microsoft.XMLHTTP");
           }
        catch (failed)
        {
         httpObject = null;
        }
      }
      }
      if (httpObject != null)
      {
      httpObject.onreadystatechange = auswerten;
      httpObject.open('POST', url, true);
      httpObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      httpObject.setRequestHeader("Content-length", data.length);
      httpObject.setRequestHeader("Connection", "close");
      httpObject.send(data);
      }
      var httpObject = null;

      }
      </script>

      
      > [...]  
      > Ach ja, die Fehlerkonsole sagt:  
      >   
      > Fehler: httpObject is null  
      > Quelldatei: http://www.example.com/ajax/test.php  
      > Zeile: 16  
      >   
      > Hat jemand eine Idee wie ich dieses Problem lösen kann?  
        
      Nimm das doch mal das letzte `var httpObject = null;`{:.language-javascript} raus :) Du hast ein Race-Condition-Problem, dass durch das alert() "umgangen" wird. Du kannst ja den ganzen Block, der dir dein XMLHTTP-Objekt erstellt, in ein `if(httpObject != null)`{:.language-javascript} packen und httpObj global lassen - halte ich eh für eine bessere Lösung.  
        
      Übrigens: Funktionen in Funktionen sind ziemlich übel ;)  
        
      再见,  
       克里斯蒂安  
      
      -- 
      <http://wwwtech.de/>  
      [WWWTech.de](http://ck.kennt-wayne.de/wwwtech-de) | [Wayne Revived](http://ck.kennt-wayne.de/wayne-revived)  
      Swen Wacker: Denn wer 'ne Blacklist hat, muss halt daran denken, dass er manches nicht sieht... und vor dem posten die Realitaet einschalten  
      
      
      1. Hallo,

        Nimm das doch mal das letzte var httpObject = null; raus :) Du hast ein Race-Condition-Problem, dass durch das alert() "umgangen" wird. Du kannst ja den ganzen Block, der dir dein XMLHTTP-Objekt erstellt, in ein if(httpObject != null) packen und httpObj global lassen - halte ich eh für eine bessere Lösung.

        Vielen Dank, es funktioniert nun reibungslos.

        Übrigens: Funktionen in Funktionen sind ziemlich übel ;)

        Habe ich mir auch gedacht als ich es geschrieben habe, aber wie könnte ich es anders lösen?

        httpObject.onreadystatechange = auswerten;

        erwartet soweit ich weiss eine Funktion und darum habe ich das ganze in eine Funktion in der Funktion getan. Wie könnte ich das anders lösen?

        Thomas

        1. 你好 Thomas,

          Übrigens: Funktionen in Funktionen sind ziemlich übel ;)

          Habe ich mir auch gedacht als ich es geschrieben habe, aber wie könnte ich es anders lösen?

          httpObject.onreadystatechange = auswerten;

          erwartet soweit ich weiss eine Funktion und darum habe ich das ganze in eine Funktion in der Funktion getan. Wie könnte ich das anders lösen?

          Nun, mach doch eine ganz normale Funktion daraus, außerhalb deiner Post-Request-Funktion.

          Wie ist eigentlich mein Beitrag unter den von Joachim gekommen? Ich glaub, ich bin heutzutage etwas verwirrt.

          再见,
           克里斯蒂安

          --
          http://wwwtech.de/
          WWWTech.de | Wayne Revived
          Microsoft: Where do you want to go today?
          Linux: Where do you want to go tomorrow?
          FreeBSD: Are you guys coming, or what?
          1. Hi,

            Wie ist eigentlich mein Beitrag unter den von Joachim gekommen? Ich glaub, ich bin heutzutage etwas verwirrt.

            und ich erst, wusste gar nicht, wie mir geschah ;-)

            Gruesse, Joachim

            --
            Am Ende wird alles gut.
  2. Hi,

    try
    {
    httpObject = new XMLHttpRequest();
    }
    catch (ms)
    {
    try
    {
            httpObject = new ActiveXObject("Msxml2.XMLHTTP");
        }
    catch (nonms)
    {
         try
      {
             httpObject = new ActiveXObject("Microsoft.XMLHTTP");
         }

    Den ganzen try-catch-Kaese wuerde ich mir sparen - zu Gunsten dieser simplen 3-Zeilen-Loesung: http://design-noir.de/webdev/JS/XMLHttpRequest-IE/

    (M.W. nutzt der IE sowieso immer die aktuellse verfuegbare XMLHTTP-Version, wenn man einfach ein neues ActiveX-Objekt vom Typ Microsoft.XMLHTTP erzeugt. Und selbst wenn dem nicht so waere, moechte mir bitte erst mal jemand erklaeren, wo die Nachteile laegen, wenn er's nicht taete.)

    Ach ja, die Fehlerkonsole sagt:

    Fehler: httpObject is null
    Quelldatei: http://www.example.com/ajax/test.php
    Zeile: 16

    Das wird wohl daran liegen, dass du die Variable selbst nach dem oeffnen und absenden des Request wieder auf null gesetzt hast:

    var httpObject = null;

    Du setzt einen *asynchronen* Request ab, also "wartet" der JS-Interpreter mit der Ausfuehrung des restlichen Codes nicht, bis ein Ergebnis des Requests da ist.

    Du schickst ab, du nullst das Objekt - und irgendwann spaeter feuert der readystatechange-Event, und will auf httpObject zugreifen - das hast du aber vorher bereits umweltgerecht entsorgen lassen.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. (M.W. nutzt der IE sowieso immer die aktuellse verfuegbare XMLHTTP-Version, wenn man einfach ein neues ActiveX-Objekt vom Typ Microsoft.XMLHTTP erzeugt. Und selbst wenn dem nicht so waere, moechte mir bitte erst mal jemand erklaeren, wo die Nachteile laegen, wenn er's nicht taete.)

      http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx

      Mathias

      1. Hi Mathias,

        http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx

        Oh, Danke.

        Mir ist zwar noch kein Fall untergenommen, wo das bei "ueblicher" AJAX-Verwendung (Formularinhalte im Hintergrund POSTen, bisschen XML vom Server nachladen, etc.) relevant gewesen waere - aber ich moechte natuerlich nicht ausschliessen, dass das bei komplexeren Applikationen durchaus der Fall sein kann.

        Weist du zufaellig, wie es sich damit verhaelt, dass wenn man nur ein Microsoft.XMLHTTP-Objekt erzeugt, immer die aktuellste MSXML-Version herangezogen werden soll?

        Auch noch interessant waere mal, ob man damit in der MSDN dokumentierte Methoden wie nodeFromID nutzen kann - mit dem nativen XMLHttpRequest-Objekt im IE 7 hatte ich damit naemlich keinen Erfolg, der wollte sie einfach nicht kennen. (Aber andererseits moechte ich eigentlich auch nicht fuer den IE 7 dann wieder auf die weniger verlaessliche ActiveX-Schiene umsteigen, wo doch XMLHttpRequest dort "native" verfuegbar ist, und damit weniger Probleme mit den Sicherheitseinstellungen macht.)

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Moin.

          Weist du zufaellig, wie es sich damit verhaelt, dass wenn man nur ein Microsoft.XMLHTTP-Objekt erzeugt, immer die aktuellste MSXML-Version herangezogen werden soll?

          Gute Frage. Wie würdest du folgendes Zitat interpretieren:

          MSXML2 vs. Microsoft namespace – I’ve also seen a lot of code that instantiates the “Microsoft.XMLHTTP” ActiveX object rather than the MSXML2.XMLHTTP.3.0 or MSXML2.XMLHTTP.6.0 if you’re using 6.0.  The “Microsoft” namespace is actually older and is only implemented in MSXML3 for legacy support.  It’s unfortunate we used the “better” name on the older version, but stick to the “msxml2” namespace when instantiating objects.

          Wenn MSXML2.XMLHTTP.3.0 verfügbar ist, sind dann Microsoft.XMLHTTP, MSXML2.XMLHTTP und MSXML2.XMLHTTP.3.0 äquivalent, unabhängig davon, ob MSXML2.XMLHTTP.6.0 verfügbar ist? Das wäre meine Interpretation...

          Christoph

          PS: Microsoft empfiehlt im MSDN-Artikel zu XMLHttpRequest

          For clients prior to Internet Explorer 7, use the following syntax to create the object:

            
          var oReq = new ActiveXObject("MSXML2.XMLHTTP.3.0");  
          
          
          1. Moin.

            Dann antworte ich mir mal selbst  ;)

            Wenn MSXML2.XMLHTTP.3.0 verfügbar ist, sind dann Microsoft.XMLHTTP, MSXML2.XMLHTTP und MSXML2.XMLHTTP.3.0 äquivalent, unabhängig davon, ob MSXML2.XMLHTTP.6.0 verfügbar ist? Das wäre meine Interpretation...

            Das scheint tatsächlich so zu sein, denn hier ist folgendes zu lesen:

            After you install MSXML 4.0 or later, applications that use version-independent ProgIDs continue to run using the most recent version of MSXML prior to version 4.0. Typically, for most current Windows systems, this will be MSXML 3.0. To use version 4.0 or later, however, applications must be written to use the appropriate version-dependent class IDs (CLSIDs) and ProgIDs that reference the appropriate DLL (Msxml4.dll, Msxml5.dll, and so on).

            Ich habe das hier umgesetzt. Ist zwar nicht die kürzest mögliche Version (auf den 'Msxml2.XMLHTTP.3.0' könnte man verzichten), aber meiner Meinung nach ist das so verständlicher...

            Christoph

      2. Hi,

        http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx

        var progIDs = ['Msxml2.DOMDocument.6.0', 'Msxml2.DOMDocument.3.0']
        leider funktioniert das nicht mit ie6. Der returnt Msxml2.DOMDocument.3.0, kann aber wohl nix damit anfangen... zumindestens meine Version ;-)

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
  3. Hallo,
    Fehler: httpObject is null

    [...]

    Hat jemand eine Idee wie ich dieses Problem lösen kann?

    httpObject nicht null setzen