wahsaga: / AJAX: Problem Zugriff auf Requestobj. in Handler im IE/Firefox

hi,

ich habe gerade mal wieder ein Problem mit AJAX im IE 6 und Firefox.

Ich setze einen AJAX-Request ab, und definiere natürlich einen onreadystatechange-Handler, um die Serverantwort auszuwerten.

Jetzt wollte ich in der Handlerfunktion einfach mit this auf das benutzte Request-Objekt zugreifen, um dessen readyState und responseText auszuwerten:

Beispiel:

requestObjekt.onreadystatechange = handleAJAXResponse;

function handleAJAXResponse() {
   alert(this.readyState);
}

Opera 8 macht auch das, was ich mir gedacht hatte:
Er bezieht this auf requestObjekt, weil handleAJAXResponse ja dessen "Eventhandler" requestObjekt.onreadystatechange zugewiesen wurde.

IE 6 und Firefox sind aber uneinsichtig :-) - bei ihnen verweist this innerhalb von handleAJAXResponse() nur auf die Funktion selber.

Hm, ist Operas und meine Sichtweise korrekt - oder ich auf dem falschen Dampfer, und Firefox und IE im Recht?
(Das this auf die Funktion zeigt, ist ja bei Funktionen im allgemeinen normal. Aber analog zur dynamischen Zuweisung eines Eventhandler, wo this dann auf das aufrufende Objekt zeigt, hätte ich halt auch hier erwartet, das this weiterhin auf mein XMLHTTPRequest-Objekt zeigt.)

Dies kann ich natürlich einfach umgehen, in dem ich mein Request-Objekt global mache, und dann über seinen Namen in der Handlerfunktion darauf zugreife.

Genau das wollte ich aber eigentlich vermeiden, den Zugriff über den Namen - um auch ggf. mehrere AJAX-Requests parallel laufen haben zu können, deren immer gleiche Funktion dann aber auf den speziellen Request reagiert.

Wie lässt sich so etwas handeln?

Ich habe versucht, mit
requestObjekt.onreadystatechange = new function (requestObjekt) { ... }
mein requestObjekt auch gleich als parameter an die Funktion zu übergeben, aber das funktioniert auch nicht - requestObjekt.readyState ist darin dann auch wieder unbekannt ...

gruß,
wahsaga

--
/voodoo.css:
#GeorgeWBush { position:absolute; bottom:-6ft; }
  1. Hallo,

    Beispiel:

    requestObjekt.onreadystatechange = handleAJAXResponse;

    Probiere es an dieser Stelle so:

      
    requestObjekt.onreadystatechange = function(){handleAJAXResponse(requestObjekt);};
    

    function handleAJAXResponse() {
       alert(this.readyState);
    }

    MfG, Thomas

    1. [Nachtrag:]

      Probiere es an dieser Stelle so:

      requestObjekt.onreadystatechange = function(){handleAJAXResponse(requestObjekt);};

      
      >   
      > >   
      > > function handleAJAXResponse() {  
      > >    alert(this.readyState);  
      > > }  
        
      Hier bietet sich an:  
        
      ~~~javascript
        
      function handleAJAXResponse(reqobj) {  
          alert(reqobj.readyState);  
      }
      

      MfG, Thomas

    2. hi,

      Probiere es an dieser Stelle so:

      requestObjekt.onreadystatechange = function(){handleAJAXResponse(requestObjekt);};

        
      Danke, that's it!  
        
      Damit erzeuge ich also eine neue Funktion, \_deren\_ Inhalt aus dem Aufruf von handleAJAXResponse() mit dem Parameter requestObjekt besteht, richtig?  
        
      gruß,  
      wahsaga  
        
      
      -- 
      /voodoo.css:  
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      
      1. Hallo,

        Damit erzeuge ich also eine neue Funktion, _deren_ Inhalt aus dem Aufruf von handleAJAXResponse() mit dem Parameter requestObjekt besteht, richtig?

        Ja, ein anonymes Funktionsobjekt kapselt den Zugriff auf handleAJAXResponse() und uebergibt dieser den Parameter.

        MfG, Thomas

    3. requestObjekt.onreadystatechange = function(){handleAJAXResponse(requestObjekt);};

        
      Eine anonyme Funktion wäre auch mein Ansatz gewesen :-)