Lukas: globale/lokale Variablen

Hallo
Ich habe das Problem das eine Variable die ich unbedingt global brauche
nur lokal zugänglich ist, "var" weglasen hat nichts gebracht und
export/import funktioniert ja leider nur mit Objekten, Methoden und
Eigenschaften. Vielen Dank für eure Hilfe!

Code:

<script type="text/javascript">

var request = null;

request = create("test.txt");
 request.onreadystatechange = complete;
 request.open("GET", "test.txt", true);
 request.send(null);

function create(file){
 try{
 request = new XMLHttpRequest();
 }catch(ex){
 try{
 request = new ActiveXObject("MSXML2.XMLHTTP");
 }catch(ex){
 request = new ActiveXObject("Microsoft.XMLHTTP");
 }
 }
 return request;
 }

function complete(){
 switch (request.readyState){
 case 0:
 case 1:
 case 2:
 case 3: return;
 case 4: out = request.responseText; break;

}
  alert(out);
 }

alert(out);

</script>

PS beim ersten alert wird der Text korrekt wiedergegeben, beim Zweiten wird
gar nichts angezeigt und die Variable zuvor mit "var out = null;" zu
deklarieren wirft "Null" zurück.

  1. Hi,

    PS beim ersten alert wird der Text korrekt wiedergegeben, beim Zweiten wird gar nichts angezeigt

    Im Kontext des Zweiten gibt's ja auch ein out.

    und die Variable zuvor mit "var out = null;" zu deklarieren

    Wo genau probiert?

    wirft "Null" zurück.

    Was bedeutet das, "wirft zurueck"?

    MfG ChrisB

    1. Hi,

      Im Kontext des Zweiten gibt's ja auch ein out.

      ^^^
      "kein out" natuerlich.

      MfG ChrisB

      1. "kein out" natuerlich.

        Ähm was heist im Kontext gibts kein out?
        -das "out" noch nicht deklariert wurde?
        Danke schonmal

    2. Im Kontext des Zweiten gibt's ja auch ein out

      Wenn ich das erste out rausnehme ändert sich auch nichts

      Wo genau probiert?

      Ganz oben!

      Was bedeutet das, "wirft zurueck"?

      In der alert-box steht "null"!

  2. Hi,

    eine Variable die ich unbedingt global brauche

    warum?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      eine Variable die ich unbedingt global brauche

      warum?

      Cheatah

      Hallo
      Weil ich diese variable als array in einer Schleife mehrmal ergänzen
      möchte und sie dann per document.write in einer liste anzeigen möchte,
      natürlich könnte ich das ganze Script auch in die HTML Datei ziehen
      wäre aber sehr unübersichtlich .
      Also möchte ich eine Funktion bauen die diese Variable ergänzt und auf
      die ich über ein sehr kurzes Script von der HTML Datei zugreifen kann.
      So kann ich das "große" Script extern auslagern.

      1. Hi,

        Weil ich diese variable als array in einer Schleife mehrmal ergänzen
        möchte und sie dann per document.write in einer liste anzeigen möchte,

        das erklärt nicht, warum es eine globale Variable sein muss. Übrigens steht ein asynchroner Prozess einem document.write() ziemlich im Weg.

        natürlich könnte ich das ganze Script auch in die HTML Datei ziehen
        wäre aber sehr unübersichtlich .

        Was das damit zu tun haben soll, ist mir ebenfalls nicht klar.

        Also möchte ich eine Funktion bauen die diese Variable ergänzt und auf
        die ich über ein sehr kurzes Script von der HTML Datei zugreifen kann.
        So kann ich das "große" Script extern auslagern.

        Gerne. Das hat aber nichts mit globalen Variablen zu tun.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo

          Ich versuche jetzt eine klare Antwort zu schreiben !
          Das Ziel ist das eine Liste aus einer XML Datei erzeugt wird
          zunächst habe ich die Punkte der Liste komplett mit Tags in einer
          XML-Datei und das ganze Script zwischen "<ul>" Tags:

          Code:

          <div style="width:85%; float:left;">

          <ul id="ToDo" type="none" id="ul">
          <script type="text/javascript">

          var out = null;
           var request = null;

          request = create("tododata.xml");
           request.onreadystatechange = complete;
           request.open("GET", "tododata.xml", true);
           request.send(null);

          function create(file){
           try{
           request = new XMLHttpRequest();
           }catch(ex){
           try{
           request = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
           }catch(ex){
           request = new ActiveXObject("MSXML2.XMLHTTP");
           }
           }
           return request;
           }

          function complete(){
           switch (request.readyState){
           case 0:
           case 1:
           case 2:
           case 3: return;
           case 4: var out = request.responseText; break ;

          }
           document.write(out);
           }

          </script>
          </ul>
          </div>

          So funktioniert das ganze, jetzt möchte ich aber das Script extern
          auslagern und zwischen den <ul> Tags nur noch etwas in der Art haben:

          <script type=text/javascript src="main.js"></script>
          <script type=text/javascript>
          document.write(Listeinträge);
          </script>

          Wobei Listeinträge in main.js definiert wird, indem aus einer XML-Datei
          die punkte ausgelesen werden und dann mit "Listeinträge =+" die Tags
          hinzugefügt werden, dafür muss ich die Variable doch global zugänglich
          machen, oder etwa nicht ?
          -Wann "funtion complete" aufgerufen wird weiss ich, ich hab sie schliesslich geschrieben :-)

  3. Ich habe das Problem das eine Variable die ich unbedingt global brauche

    Nein, du möchtest nur zum richtigen Zeitpunkt Zugriff auf eine Variabel haben.

    function complete(){
    switch (request.readyState){
    case 0:
    case 1:
    case 2:
    case 3: return;
    case 4: out = request.responseText; break;

    }
      alert(out);
    }

    complete wird ausgeführt wenn der Request erfolgt und nur dann wird der variabel out ein Wert zugewiesen.

    alert(out);

    Dieses alert() erfolgt viel früher, da ist out undefniert.

    PS beim ersten alert wird der Text korrekt wiedergegeben, beim Zweiten wird
    gar nichts angezeigt und die Variable zuvor mit "var out = null;" zu
    deklarieren wirft "Null" zurück.

    Es kommt nicht auf zuvor und danch an, sondern auf die Reihenfolge der Ausführung und der Code in der Funktion complete() kommt erst am Schluss.

    Du musst versuchen von einer linearen Denkweise wegzukommen, JS ist Eventstrukturiert, d.h. viele Dinge passieren nebenläufig und bei AJAX ist das ganz besonders der Fall.

    Wenn du also die Variabel out für irgendwas brauchst, musst du dies in der Funktion complete() tun an keiner anderen Stelle.

    Struppi.

    1. Ich habe das Problem das eine Variable die ich unbedingt global brauche

      Nein, du möchtest nur zum richtigen Zeitpunkt Zugriff auf eine Variabel haben.

      function complete(){
      switch (request.readyState){
      case 0:
      case 1:
      case 2:
      case 3: return;
      case 4: out = request.responseText; break;

      }
        alert(out);
      }

      complete wird ausgeführt wenn der Request erfolgt und nur dann wird der variabel out ein Wert zugewiesen.

      Genau das ist mein Problem, ich möchte das der Variablen !ab dann! auf
      unbestimmte Zeit ein Wert zugewiesen wird, wann Complete ausgeführt wird
      weiss ich, ist schließlich mein Script, ich halte nämlich nichts von
      script-copy-and-paste
      :-)

      alert(out);

      Dieses alert() erfolgt viel früher, da ist out undefniert.

      PS beim ersten alert wird der Text korrekt wiedergegeben, beim Zweiten wird
      gar nichts angezeigt und die Variable zuvor mit "var out = null;" zu
      deklarieren wirft "Null" zurück.

      Es kommt nicht auf zuvor und danch an, sondern auf die Reihenfolge der Ausführung und der Code in der Funktion complete() kommt erst am Schluss.

      Vergiss "zuvor" das war mehr als "zunächst" gedacht, also Hauptsache
      deklariert.

      Du musst versuchen von einer linearen Denkweise wegzukommen, JS ist Eventstrukturiert, d.h. viele Dinge passieren nebenläufig und bei AJAX ist das ganz besonders der Fall.

      Tut mir leid ich bin erst seit ein paar Tagen dabei mit JS zu arbeiten
      aber vieles schaff ich durch Probieren und nachdenken , dieses Problem
      allerdings erwischt mich ziemlich hart.

      Wenn du also die Variabel out für irgendwas brauchst, musst du dies in der Funktion complete() tun an keiner anderen Stelle.

      Das ist aber sehr ungünstig, wenn mann die Variable in einem ganz anderen
      Script-teil, in einer anderen Datei braucht!

  4. Hallo Lukas,

    vieleicht liege ich falsch, aber ich habe den Verdacht, das du das, was beim asynchronen http-Request passiert, noch nicht richtig verstanden hast. Speziell über die asynchrone Abarbeitung des Requests scheinst du noch nicht richtig nachgedacht zu haben.

    In Kurzform: das Script, das den http-Request ausgelöst hat, läuft danach weiter bis zum Ende. Gleichzeitig wird der http-Request abgearbeitet und stellt seine Informationen "irgendwann" zur Verfügung. Danach wird die per "onreadystatechange" angegebene Funktion aufgerufen. Diese kann auf die Informationen zugreifen, nicht aber der Scriptteil, der den Request ausgelöst hat.

    Daher kannst du die Informationen auch nicht mit document.write in die Seite schreiben, sondern musst auf die DOM-Methoden zurückgreifen. Eine mögliche Alternative wäre, den http_Request synchron laufen zu lassen.

    Gruß, Jürgen

    1. Hallo Lukas,

      vieleicht liege ich falsch, aber ich habe den Verdacht, das du das, was beim asynchronen http-Request passiert, noch nicht richtig verstanden hast. Speziell über die asynchrone Abarbeitung des Requests scheinst du noch nicht richtig nachgedacht zu haben.

      In Kurzform: das Script, das den http-Request ausgelöst hat, läuft danach weiter bis zum Ende. Gleichzeitig wird der http-Request abgearbeitet und stellt seine Informationen "irgendwann" zur Verfügung. Danach wird die per "onreadystatechange" angegebene Funktion aufgerufen. Diese kann auf die Informationen zugreifen, nicht aber der Scriptteil, der den Request ausgelöst hat.

      Daher kannst du die Informationen auch nicht mit document.write in die Seite schreiben, sondern musst auf die DOM-Methoden zurückgreifen. Eine mögliche Alternative wäre, den http_Request synchron laufen zu lassen.

      Gruß, Jürgen

      Hallo
      Es ist mir aber gelungen mit document.write() innerhalb der
      funktion Complete die Daten zu schrieben, bzw sie an eine andere Funktion
      weiterzugeben, wenn das möglich ist müsste ich diese Daten doch auch ausser-
      halb der Funktionen verfügbar machen können, oder ich bin gedanklich einfach
      hoffnungslos fest gefahren.
      Die DOM-Methoden werde ich mir in jedem Fall mal anschauen und damit etwas
      experimentieren !

      -- An alle Vielen Dank für eure Hilfe  !!!! Ihr seid spitze!!

      1. Nachtrag :

        Dom-Elemente sind doch z.B.

        document.getElementsByTagName("tagname");
        oder
        document.getElementById("ID");

        oder verdrehe ich da jetzt etwas ?

        1. Hallo Lukas,

          Dom-Elemente sind doch z.B.

          document.getElementsByTagName("tagname");
          oder
          document.getElementById("ID");

          oder verdrehe ich da jetzt etwas ?

          nein. Interessant könnten auch noch createElement und appendChild sein. Im Zusammenhang mit AJAX wird auch oft innerHTML verwendet. Du könntest damit alle <li>s, die du per http-Request gelesen hast, in das <ul> schreiben, z.B. über

          document.getElementById("ID_des_UL").innerHTML = request.responseText;

          Warum in deinem Beispiel document.write funktioniert hat, weiß mich auch nicht.

          Gruß, Jürgen

          1. Hallo Lukas,

            Dom-Elemente sind doch z.B.

            document.getElementsByTagName("tagname");
            oder
            document.getElementById("ID");

            oder verdrehe ich da jetzt etwas ?

            nein. Interessant könnten auch noch createElement und appendChild sein. Im Zusammenhang mit AJAX wird auch oft innerHTML verwendet. Du könntest damit alle <li>s, die du per http-Request gelesen hast, in das <ul> schreiben, z.B. über

            document.getElementById("ID_des_UL").innerHTML = request.responseText;

            Super vielen Dank ich werde das mal Probieren und einfach ein paar Versuche
            starten das irgendwie zum laufen zu bringen.

            Warum in deinem Beispiel document.write funktioniert hat, weiß mich auch nicht.

            FIREFOX 3 BETA 4, der magische Browser der alles kann ?? :-)

      2. Es ist mir aber gelungen mit document.write() innerhalb der
        funktion Complete die Daten zu schrieben, bzw sie an eine andere Funktion
        weiterzugeben, wenn das möglich ist müsste ich diese Daten doch auch ausser-
        halb der Funktionen verfügbar machen können, oder ich bin gedanklich einfach
        hoffnungslos fest gefahren.

        Scheint so.

        "Ausserhalb verfügbar machen" ist an sich kein Problem, du meinst damit aber zeitgleich verfügbar machen und das geht nicht. Du kannst erst in der complete Funktion auf out zugreifen und erst dann steht sie ausserhalb zu Verfügung, d.h. du rufst an dieser Stelle die von dir gewünschte Funktion auf. Das ist das Konzept von AJAX (oder allgemein der Eventbasierten Programmierung)

        Struppi.

  5. Hallo
    Problem halbschön gelöst:

    <div style="width:85%; float:left;">

    <ul id="ToDo" type="none" id="ul">
    <script type="text/javascript">

    var request = null;

    request = create("test.xml");
     request.onreadystatechange = complete;
     request.open("GET", "test.xml", true);
     request.send(null);

    function create(file){
     try{
     request = new XMLHttpRequest();
     }catch(ex){
     try{
     request = new ActiveXObject("MSXML2.XMLHTTP");
     }catch(ex){
     request = new ActiveXObject("Microsoft.XMLHTTP");
     }
     }
     return request;
     }

    function complete(){
     switch (request.readyState){
     case 0:
     case 1:
     case 2:
     case 3: return;
     case 4: list(request.responseXML); break;

    }
     list(out);
     }

    function list(dom){

    var liste = dom.getElementsByTagName("task");
     var prio = dom.getElementsByTagName("prio");
     var listen=null;

    for(i=0; i<liste.length; i++){
     listen = listen + "<li><div style='float:left; width:80%; vertical-align:bottom'>"
     listen = listen + liste[i].childNodes[0].nodeValue;
     listen = listen + "</div><div style='float:right; width:20%'><img src='png/"
     listen = listen + prio[i].childNodes[0].nodeValue;
     listen = listen + ".png' class='img'/></div></li>"

    }

    document.getElementById("ToDo").innerHTML = listen;
     }

    </script>
    </ul>
    </div>

    Schöner wäre es das ganze extern zu schreiben und dann einzubinden,
    scheint aber nicht so leicht zu funktionieren!

    Abschließend noch vielen Dank an ALLE