Linuchs: requestObject mit variablem Namen erzeugen

Moin,

ich brauche zahlreiche requestObjecte für Ajax. Damit sie sich nicht gegenseitig stören, sollen sie verschiedene Namwen haben, aber mit einer zentralen Funktion erzeugt werden.

Wie übergebe ich der Funktion den gewünschten Namen? So geht's nicht, das Object ist anschließend undefined:

function makeRequestObject( requestName ) {
  alert( "hier makeRequestObject (" +requestName +") in standard.js" );
  if (window.XMLHttpRequest) {
    requestName = new XMLHttpRequest(); // Mozilla, Safari, Opera
  } else if (window.ActiveXObject) {
    try {
      requestName = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
    }
    catch (e) {
      try {
        requestName = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
      }
      catch (e) {}
    }
  }
  // überprüfen, ob Request erzeugt wurde
  if (!requestName) {
    alert("Kann keine XMLHTTP-Instanz fuer " +requestName +" erzeugen");
  }
}
...
var p510_request; makeRequestObject( p510_request ); // makeRequestObject => in standard.js

Mache ich es so:

var p510_request = new Object();
makeRequestObject( p510_request ); // makeRequestObject => in standard.js
var TID = 0;
function holeVeranstaltung() {
  // TID ist vorhandene Veranstaltung, nicht erneut senden
  var url = "500/p510lm.php?TID=" +TID +"&lg=[lg]";
  alert( url );
  p510_request.open('post', url, true);            // Request öffnen
  p510_request.send(null);                         // Request senden
  p510_request.onreadystatechange = zeigeVeranstaltung; // Request auswerten
}

kommt die Meldung "TypeError: p510_request.open is not a function"

Linuchs

  1. Tach!

    ich brauche zahlreiche requestObjecte für Ajax. Damit sie sich nicht gegenseitig stören, sollen sie verschiedene Namwen haben, aber mit einer zentralen Funktion erzeugt werden.

    Nein, das möchtest du eigentlich nicht. Stattdessen möchtest du sie in individuellen Variablen ablegen.

    Wie übergebe ich der Funktion den gewünschten Namen?

    Gar nicht. Eine Funktion kann aber ein Ergebnis haben, das man mit return zurückgibt. Und das kann durchaus auch ein erzeugtes Objekt sein, das der Aufrufer einer Variable zuweisen kann.

    dedlfix.

    1. Hallo dedlfix,

      deine Idee mit return habe ich verstanden, aber mit der Ausführung gibt's Probleme:

      function makeRequestObject( requestName ) {
        // requestName wird fuer Fehlermeldung benoetigt
        alert( "hier makeRequestObject (" +requestName +") in standard.js" );
        if (window.XMLHttpRequest) {
          request = new XMLHttpRequest(); // Mozilla, Safari, Opera
        } else if (window.ActiveXObject) {
          try {
            request = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
          }
          catch (e) {
            try {
              request = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
            }
            catch (e) {}
          }
        }
        if ( request ) {
          return request;
        } else {
          alert("Kann keine XMLHTTP-Instanz fuer [" +requestName +"] erzeugen");
          return FALSE;
        }
      }
      ...
      var p510_request = makeRequestObject( "p510_request" ); // makeRequestObject => in standard.js
      

      Fehlermeldung: "TypeError: p510_request is undefined ... remso.eu:239:2"

      /* **************************************
       *
       * per Ajax neue Veranstaltung holen
       *
       * ************************************** */
      var p510_request = makeRequestObject( "p510_request" ); // makeRequestObject => in standard.js
      var TID = 0;
      function holeVeranstaltung() {
        // TID ist vorhandene Veranstaltung, nicht erneut senden
        var url = "500/p510lm.php?TID=" +TID +"&lg=de";
        alert( url );
        p510_request.open('post', url, true);            // Request öffnen   ** line 239 **
        p510_request.send(null);                         // Request senden
        p510_request.onreadystatechange = zeigeVeranstaltung; // Request auswerten
      }
      

      Linuchs

      1. Moment ... es scheint doch zu funktionieren, vielleicht war die alte standard.js noch im cache, obwohl ich immer auf [strg][F5] achte ...

        1. Tach!

          Moment ... es scheint doch zu funktionieren, vielleicht war die alte standard.js noch im cache, obwohl ich immer auf [strg][F5] achte ...

          Das würde man im Debugger sehen, wenn da alter Code rumliegt.

          dedlfix.

  2. @@Linuchs

    Du gehörst der Generation copy and paste an? Kopierst aber von deinen Urahnen?

      if (window.XMLHttpRequest) {
        requestName = new XMLHttpRequest(); // Mozilla, Safari, Opera
    

    Chrome gab’s damals wohl noch nicht. Dafür aber:

      } else if (window.ActiveXObject) {
        try {
          requestName = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
        }
        catch (e) {
          try {
            requestName = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
          }
          catch (e) {}
        }
      }
    

    Meinst du nicht auch, es wäre an der Zeit, den else-Zweig auf den Müllhaufen der Geschichte zu werfen?

    LLAP 🖖

    --
    “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
    Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
    1. Hallo Gunnar,

        } else if (window.ActiveXObject) {
          try {
            requestName = new ActiveXObject('Msxml2.XMLHTTP'); // IE 5
          }
          catch (e) {
            try {
              requestName = new ActiveXObject('Microsoft.XMLHTTP'); // IE 6
            }
            catch (e) {}
          }
        }
      

      Meinst du nicht auch, es wäre an der Zeit, den else-Zweig auf den Müllhaufen der Geschichte zu werfen?

      leider stimmen die Kommentare nicht und man würde den IE 8 auch ohne Not aussperren. Ich habe mir vor einigen Tagen eines meiner Scripte kritisch angesehen und mich entschlossen, das ActiveXObject-Zeugs erst mal noch drin zu lassen.

      Gruß
      Jürgen