Gustl: & AJAX - request in externer .js

kann ich in einer externen .js datei keinen ajax aufruf machen? ich wollte es nur mal probieren aber responseText bleibt undefiniert.

genau gleicher code in einer html-datei geht aber.

  • Gustl
  1. kann ich in einer externen .js datei keinen ajax aufruf machen? ich wollte es nur mal probieren aber responseText bleibt undefiniert.

    Doch, kann man.

    genau gleicher code in einer html-datei geht aber.

    Na dann zeig mal besagten Code.

    MfG
    bubble

    1. hi

      bubble

      ich wollte eigentlich nur wissen, gibts unterschiede wenn der normale XMLHttpRequest über eine externe js-datei eingebunden wird.

      // test.js  
        
      function MACHDAS() {  
        var jetzt   =    new Date();  
        jetzt       =    jetzt.getTime();  
        var blubb   =    "was geht ab";  
        
        AJAX        =    new XMLHttpRequest();  
        
        AJAX.open('GET','123.cgi?do='+jetzt,true);  
        
        AJAX.onreadystatechange   =    function () {  
          if (AJAX.readyState     ==   4) {  
      	  blubb             =    AJAX.responseText;  
      	}  
        }  
        
      AJAX.send(null);  
      return blubb;  
      }
      

      in return bleibt stehen "was geht ab".

      123.cgi liefert korrekt. wenn ich den selben request also direkt in die html zwischen <script></script> schreibe, dann wird mir der richtige wert geliefert.

      ich wollts einfach nur mal ausprobieren.

      • Gustl
      1. Hallo,

        // test.js

        function MACHDAS() {
          var jetzt   =    new Date();
          jetzt       =    jetzt.getTime();
          var blubb   =    "was geht ab";

        AJAX        =    new XMLHttpRequest();

        AJAX.open('GET','123.cgi?do='+jetzt,true);

        AJAX.onreadystatechange   =    function () {
            if (AJAX.readyState     ==   4) {
          blubb             =    AJAX.responseText;
        }
          }

        AJAX.send(null);
        return blubb;
        }

        
        >   
        > in return bleibt stehen "was geht ab".  
          
        ja sicher, du wartest die Antwort des AJAX-Requests ja auch gar nicht erst ab. Du gibst den Request mit AJAX.send() sozusagen in Auftrag, drehst dich dann auf dem Absatz um und gehst (return). Die anonyme Eventhandler-Funktion, die du vorher noch korrekt registriert hast (AJAX.onreadystatechange) wird zwar irgendwann aufgerufen, wenn die Antwort kommt, und ändert noch den Wert der lokalen Variablen blubb innerhal von MACHDAS(). Aber das bekommst du gar nicht mehr mit.  
          
        
        > 123.cgi liefert korrekt.  
          
        Das glaube ich gern, spricht auch nichts dagegen.  
          
        
        > wenn ich den selben request also direkt in die html zwischen <script></script> schreibe, dann wird mir der richtige wert geliefert.  
          
        Das ist wiederum erstaunlich - wenn das so ist, hat das aber mit Sicherheit andere Gründe, die wir aus dem bisher Gesagten noch nicht erkennen können. Theoretisch kann es nämlich nicht funktionieren, weil die Ablauflogik nicht stimmt.  
          
        Ciao,  
         Martin  
          
          
        PS: Ich spiel gern 'ne Runde Pool mit. :-)
        
        -- 
        Die Zeit, die man zur Fertigstellung eines Projekts wirklich braucht, ist immer mindestens doppelt so lang wie geplant.  
        Wurde dieser Umstand bei der Planung bereits berücksichtigt, gilt das Prinzip der Rekursion.  
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        
        1. Ciao, Martin PS: Ich spiel gern 'ne Runde Pool mit. :-)

          danke :-) war nix mit pool, keiner bringt seinen schinken von der couch hoch.

          das heisst dass ich in meiner html-datei den selben fehler haben muss. das einzige was ich anders mache, ich gebe responseText an eine function und nicht direkt an return.

          also

          { ... POOL(AJAX.responseText); ... }

          function POOL(val) { schreib val in ein div }

          aber egal, dann dürfte es so auch nicht funzen. tut es auch nicht in meiner test.js.

          ich checks noch nicht. ich dachte innerhalb MACH() müsste das script auf state == 4 warten, bevor es weitermacht. bin ich perl-versaut? wie muss ich das schreiben, JS ist sooo anders ... jedenfalls für mich.

          wenn schon keiner mit mir poolt dann geh ich jetzt ins ebany und kauf mir ein zippo.

          • Gustl
          1. Hallo,

            Ciao, Martin PS: Ich spiel gern 'ne Runde Pool mit. :-)
            danke :-) war nix mit pool, keiner bringt seinen schinken von der couch hoch.

            faule Bande. Ja, ich gehe auch ab und zu - das heißt im Klartext: so alle zwei bis drei Wochen mal - mit Freunden zum Billardspielen. Wir sind alle keine wirklich guten Spieler, eher so Kneipendurchschnitt, aber es macht Spaß. Und das ist die Hauptsache.

            das heisst dass ich in meiner html-datei den selben fehler haben muss. das einzige was ich anders mache, ich gebe responseText an eine function und nicht direkt an return.

            also

            { ... POOL(AJAX.responseText); ... }

            function POOL(val) { schreib val in ein div }

            Das könnte der entscheidende Punkt sein. Dann greifst du eventuell einen Moment später auf responseText zu, wenn die Antwort schon eingetroffen ist.

            ich checks noch nicht. ich dachte innerhalb MACH() müsste das script auf state == 4 warten, bevor es weitermacht.

            Nein, das ist eine falsche Vorstellung.
            Du registrierst eine Funktion auf den onreadystatechange-Handler. Das heißt: Deine Funktion wird automatisch aufgerufen, sobald sich der Status des AJAX-Objekts ändert. _Wenn_ das der Fall ist, prüfst du nach, ob der Status jetzt 4 ist (fertig), und fllas ja, legst du das empfangene Ergebnis ab. Das alles geschieht aber "im Hintergrund", asynchron eben, während der Rest des Scripts nach dem send()-Aufruf normal weiterläuft.
            Du solltest also im Idealfall die Verarbeitung des Ergebnisses _in_ der Eventhandler-Funktion machen, denn nur dort weißt du genau, was das Stündchen geschlagen hat.

            wenn schon keiner mit mir poolt dann geh ich jetzt ins ebany und kauf mir ein zippo.

            Hä? Da kann ich jatzt nicht folgen.

            Ciao,
             Martin

            --
            Zwei Politiker auf dem Weg zum Sitzungssaal: "Was sagten Sie in ihrer Rede neulich noch zur Rentenreform?" - "Nichts." - "Ja, schon klar. Aber wie haben Sie es formuliert?"
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Hallo,

              jojo:-)

              Du solltest also im Idealfall die Verarbeitung des Ergebnisses _in_ der Eventhandler-Funktion machen, denn nur dort weißt du genau, was das Stündchen geschlagen hat.

              im klartext: wenn state == 4 dann ergebnis an funktion. das mach ich doch. steh ich irgendwie aufm schlauch oder reden wir aneinander vorbei. in meiner test.js machte ich das vorher nicht, aber jetzt hab ichs umgeschrieben. aber klappert nicht.

              if (readystate == 4) { responseText an function }

              ich steh aufm schlauch. oder meinst du, ich soll alles komplett ...

              if (readystate == 4) {
                der komplette mist, keine übergabe an irgendwelche funktionen sondern alles hier ..
                return fertiges_ergebnis;
                ???
              }

              _wenn_ der programmablauf nicht auf state == 4 wartet, wie du sagst, dann kann das doch keinen unterschied machen.

              mein einfach gestricktes hirn kann irgendwie nicht anders denken, glaube ich.
              programm, mach function 1 > wenn function  1 fertig dann mach function  2 > dann function  3 > .. von oben nach unten.

              ich hab mit JS ein generelles logik-problem, fürchte ich. liege ich dann mit meiner vermutung richtig, dass das ganze genau anders rum läuft? function 1 steht im quelltext ganz unten?

              ich denke halt so: affe sieht banane. affe steigt auf baum, pflückt banane, schält, isst und geht dann faulenzen weil satt.

              javascript fängt also mit dem faulenzen an, packt die banane wieder ein, hängt sie auf den baum und schaut sich das ganze hungrig an ...?

              kann mir den mist jemand erklären?

              ich bin der affe ...

              ########

              wenn schon keiner mit mir poolt dann geh ich jetzt ins ebany und kauf mir ein zippo.
              Hä? Da kann ich jatzt nicht folgen.

              meinte: wenn ich sonntags schon nichts mit freunden unternehmen kann dann geh ich halt einkaufen :-) ebay, zippo kaufen(feuerzeug) :-) egal, aber so scherzchen lockern die sache etwas auf, finde ich.

              • Gustl
              1. ich denke halt so: affe sieht banane. affe steigt auf baum, pflückt banane, schält, isst und geht dann faulenzen weil satt.

                Deine Funktion die das Ajax-Request schickt ist "Mensch A", der blubb ist "Kiste", das Ajax-Request ist "Mensch B", "Apfel" ist der Antworttext.

                Mensch A befiehlt Mensch B, dass er  einen Apfel in die Kiste packen soll. Mensch B geht los.
                Mensch A nimmt die Kiste und macht etwas mit dem Inhalt. Da sie leer ist, passiert nichts.
                Nun kommt Mensch B mit dem Apfel wieder und legt ihn in die Kiste.
                Da Mensch A aber schon fertig ist, - richtig - passiert nichts.

                Die onreadystatechange-Funktion ist sowas wie die To-Do-Liste für Mensch B.
                Wenn der Status dann 4 ist, hat Mensch B den Apfel und kann damit irgendetwas anstellen.
                Jetzt noch eine Funktion zu deklarieren, die dann in der onreadystatechange-Funktion aufgerufen wird, ist in diesem Fall sinnlos, da die onreadystatechange-Funktion genauso gut selbst den Antworttext ausgeben kann.

                Asynchron bedeutet in dem Fall halt, dass die Funktion die das Ajax-Request schickt, danach sofort weiter arbeitet.
                Wenn du das nicht willst, musst du das Ajax-Request synchron schicken. Dann wartet Mensch A auch auf Mensch B ;)

                MfG
                bubble

                1. Moin,

                  Mensch A befiehlt Mensch B, dass er  einen Apfel in die Kiste packen soll. Mensch B geht los.
                  Mensch A nimmt die Kiste und macht etwas mit dem Inhalt. Da sie leer ist, passiert nichts.
                  Nun kommt Mensch B mit dem Apfel wieder und legt ihn in die Kiste.
                  Da Mensch A aber schon fertig ist, - richtig - passiert nichts.

                  Ich hätte es gerne "fachlich hilfreich" bewertet, aber leider scheint es da noch einen Bug zu geben, denn es kommt die Meldung ich dürfe nur einmal abstimmen -.-

                  Grüße Marco

                  1. Ich hätte es gerne "fachlich hilfreich" bewertet, aber leider scheint es da noch einen Bug zu geben, denn es kommt die Meldung ich dürfe nur einmal abstimmen -.-

                    Danke :) Der Wille zählt ;)

                    Erst wollte ich es auch anhand von Affen erklären, da konnt ich aber irgendwie das Zusammenspiel von Affe A und B nicht wirklich erklären.
                    (Alternativ lässt sich vielleicht Mensch B als Affe bezeichnen - situationsbedingt)

                    MfG
                    bubble

                    1. Moin,

                      Erst wollte ich es auch anhand von Affen erklären, da konnt ich aber irgendwie das Zusammenspiel von Affe A und B nicht wirklich erklären.
                      (Alternativ lässt sich vielleicht Mensch B als Affe bezeichnen - situationsbedingt)

                      Das wäre eigentlich ein typischer Fall für die Zitatesammlung. Leider gibts dort seit geraumer Zeit keine Möglichkeit zum Hinzufügen mehr :(

                      Grüße Marco

                      1. Das wäre eigentlich ein typischer Fall für die Zitatesammlung. Leider gibts dort seit geraumer Zeit keine Möglichkeit zum Hinzufügen mehr :(

                        Und ich dachte immer, wenn ich was poste kommt eh nur Kot bei raus >.<

                        MfG
                        bubble

                      2. Hi,

                        Das wäre eigentlich ein typischer Fall für die Zitatesammlung. Leider gibts dort seit geraumer Zeit keine Möglichkeit zum Hinzufügen mehr :(

                        siehe https://forum.selfhtml.org/?t=212568&m=1452081

                        cu,
                        Andreas

                        --
                        Warum nennt sich Andreas hier MudGuard?
                        O o ostern ...
                        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                        1. Moin,

                          siehe https://forum.selfhtml.org/?t=212568&m=1452081

                          War schon wieder in Vergessenheit geraten, ist nachgeholt (allerdings sehe ich das Zitat dort selbst nicht, scheinbar, weil ich es vorgeschlagen habe).

                          Grüße Marco

                          --
                          Ich spreche Spaghetticode - fließend.
                          1. Hallo,

                            War schon wieder in Vergessenheit geraten, ist nachgeholt (allerdings sehe ich das Zitat dort selbst nicht, scheinbar, weil ich es vorgeschlagen habe).

                            nein, nicht deshalb, der Grund ist ein anderer. Nämlich dass das vorgeschlagene Zitat erst ein paar Tage in der Abstimmung bleibt, bevor es endgültig in die Sammlung rutscht oder -seltener- endgültig abgelehnt wird. Da du es selbst vorgeschlagen hast, hat es von dir auch implizit eine "Dafür"-Stimme bekommen (klick mal auf "Stimme ändern", dann siehst du es wieder).

                            Ciao,
                             Martin

                            --
                            why the heck do you jerk think, that wir ein doppelposting nicht bemerken, wenn you zwischendurch the sprache wechselst?
                              (wahsaga)
                            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                            1. Moin,

                              nein, nicht deshalb, der Grund ist ein anderer. Nämlich dass das vorgeschlagene Zitat erst ein paar Tage in der Abstimmung bleibt, bevor es endgültig in die Sammlung rutscht oder -seltener- endgültig abgelehnt wird.

                              Ja, das wusste ich, daher der Link direkt auf /abstimmen.

                              Da du es selbst vorgeschlagen hast, hat es von dir auch implizit eine "Dafür"-Stimme bekommen (klick mal auf "Stimme ändern", dann siehst du es wieder).

                              Das wiederum nicht. Ja, jetzt konnte ich es sehen ;) Danke.

                              Grüße Marco

                              --
                              Ich spreche Spaghetticode - fließend.
                  2. Hallo,

                    Ich hätte es gerne "fachlich hilfreich" bewertet, aber leider scheint es da noch einen Bug zu geben, denn es kommt die Meldung ich dürfe nur einmal abstimmen -.-

                    aber deine Stimme wurde anscheinend trotzdem gezählt - zumindest hat das entsprechende Posting jetzt wirklich eine Hilfreich-Stimme. Spielt bei dir vielleicht noch irgendein Javascript mit, das "aus Versehen" einen zweiten Request verursacht? Hast du vielleicht im Eifer des Gefechts zweimal geklickt? Häuptling Flinker Finger? ;-)

                    Ich hab's bei diesem Posting hier gerade auch versucht, bei mir hat's einwandfrei funktioniert. Ohne Fehler.

                    So long,
                     Martin

                    --
                    F: Wer waren die ersten modernen Politiker?
                    A: Die Heiligen drei Könige. Sie legten die Arbeit nieder, zogen teure Klamotten an und gingen auf Reisen.
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                    1. Moin,

                      aber deine Stimme wurde anscheinend trotzdem gezählt - zumindest hat das entsprechende Posting jetzt wirklich eine Hilfreich-Stimme. Spielt bei dir vielleicht noch irgendein Javascript mit, das "aus Versehen" einen zweiten Request verursacht? Hast du vielleicht im Eifer des Gefechts zweimal geklickt? Häuptling Flinker Finger? ;-)

                      Hm, ich hätte wetten können, dass ich nur einmal geklickt hab, zumal mir das schonmal passiert ist. Jetzt geht es aber wieder :)

                      Grüße Marco

                2. hi bubble,

                  Mensch A befiehlt Mensch B ...

                  ok, LOL. wenn ich den apfel an mensch B übergebe, nur wenn er geliefert wurde (nur wenn state == 4) dann müsste return doch den apfel haben und woanders hin liefern können.

                  wieso wird der apfel innerhalb der html-datei geliefert, innerhalb der ausgelagerten js aber nicht. (siehe oben, wir haben anscheinend ziemlich gleichzeitig gepostet).

                  ihr macht mich ganz kirre.

                  • Gustl
                  --
                  Ich pflege mit mir selbst den modernen Führungsstil: Ich nehme mir was vor und verrate mir mit keinem Wort wie ich das erreichen will :-)
                  1. Hallo Gustl,

                    teste bitte mal, ob die erwartete Antwort überhaupt kommt. Das machst du am Besten mit alert( blubb ) an der Stelle, wo die Nachricht ankommt;

                      
                      AJAX.onreadystatechange   =    function () {  
                        if (AJAX.readyState     ==   4) {  
                              blubb             =    AJAX.responseText;  
                              alert( blubb );  
                            }  
                      }
                    

                    Klappt das in beiden Fällen (also interne und externe .js)?

                    Gruß, Gast

                    1. AJAX.onreadystatechange   =    function () {
                          if (AJAX.readyState     ==   4) {
                                blubb             =    AJAX.responseText;
                                alert( blubb );
                              }
                        }

                      Warum hier die Variable umkopieren? Das ist unnötig, und das Closure (wenn man von der Ausgangsfunktion ausgeht), dass du "erzeugst" ist genauso unnötig. Genau das gleiche Problem, in dem du AJAX.function innerhalb der anonymen Funktion benutzt. Das erzeugte Closure ist wieder unnötig, da man einfach this verwenden kann.  
                        
                       ~~~javascript
                        
                         AJAX.onreadystatechange   =    function () {  
                           if (this.readyState     ==   4) {  
                                 alert(this.responseText);  
                               }  
                         }
                      

                      this bezieht sich auf das aufrufende Objekt, das ist ja AJAX, desweiteren brauchst du die Variable blubb garnicht. Und zusätzlich sparst du dir das Closure.

                      MfG
                      bubble

                      1. AJAX.onreadystatechange   =    function () {
                             if (this.readyState     ==   4) {
                                   alert(this.responseText);
                                 }
                           }

                        
                        > this bezieht sich auf das aufrufende Objekt  
                          
                        klar, also sollte das endergebnis das gleiche sein. if AJAX ... if this (this == AJAX)  
                          
                        ich hab mir die sache nochmal angeschaut. ich meine - der einzige unterschied zwichen der html-datei und des externen js ist doch - dass der aufruf des xmlHTTP objekts in der externen js ohne http-header erfolgt.  
                          
                        ich hab das immer so verstanden: wenn ein script ausgelagert wird, dann importiert (oder so) der aufruf srcipt src=extern.js den quellcode so in die html-datei, als würde das externe script tatsächlich unter dem header der html-datei ausgeführt. das kann aber so nicht sein.  
                          
                        in der externen js bewegt sich  
                          
                        `AJAX.onreadystatechange   =    function () { _ab hier_`{:.language-javascript}  
                          
                        gar nichts mehr. die anonyme function wird erst gar nicht ausgeführt. vielleicht wird schon das xmlHTTP objekt nicht angelegt, aber ich weiss nicht wie ich das rausfinden soll.  
                          
                        dem xml-objekt unterhalb open einen header zu setzen hat keine wirkung. war so ne fixe idee von mir.  
                          
                        WER von euch hat denn schon mal eine datei in einem externen js mit ajax eingelesen? kann jemand bestätigen, dass das ganz sicher möglich ist? im netz find ich nur beispiele in html-dateien.  
                          
                          
                        - Gustl  
                          
                        
                        -- 
                        Ich pflege mit mir selbst den modernen Führungsstil: Ich nehme mir was vor und verrate mir mit keinem Wort wie ich das erreichen will :-)
                        
                        1. AJAX.onreadystatechange = function () { _ab hier_

                          gar nichts mehr. die anonyme function wird erst gar nicht ausgeführt. vielleicht wird schon das xmlHTTP objekt nicht angelegt, aber ich weiss nicht wie ich das rausfinden soll.

                          Dann zeig mal deinen exakten Code. Quasi den Inhalt deiner JS-Datei, das Script-Element mit der du sie auf der HTML-Seite "verlinkst" und den Teil, wie du deine Funktion aufrufst.

                          WER von euch hat denn schon mal eine datei in einem externen js mit ajax eingelesen? kann jemand bestätigen, dass das ganz sicher möglich ist? im netz find ich nur beispiele in html-dateien.

                          *aufgeregt meld und mit Arm wedel* Ich. Des öfteren. Ja, es geht.

                          Sagt denn die Fehlerkonsole deines Browsers irgendwas? Ansonsten, wie gesagt, Code zeigen ;)

                          MfG
                          bubble

                        2. Hallo,

                          WER von euch hat denn schon mal eine datei in einem externen js mit ajax eingelesen? kann jemand bestätigen, dass das ganz sicher möglich ist?

                          Ja, kann ich:

                           function xyz() {  
                          	  
                          	var checkResponse = null;  
                          	  
                          	try {  
                          		var http = null;  
                          		  
                          		if (window.XMLHttpRequest) {  
                          			http = new XMLHttpRequest();  
                          		} else if (window.ActiveXObject) {  
                          			http = new ActiveXObject("Microsoft.XMLHTTP");  
                          		}  
                            
                          		if (http != null) {  
                          			http.open("GET", "example.html", true);  
                          			http.onreadystatechange = function () {  
                          				if (http.readyState == 4) {					  
                          					checkResponse = http.responseText ;						  
                          				}  
                          			}  
                          			http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  
                          			http.send();  
                          		}  
                          		  
                          	} catch(e) {  
                            
                          	}  
                          	  
                          	return checkResponse;			  
                          }
                          

                          Viele Grüße
                          Siri

                          1. Hallo,

                            WER von euch hat denn schon mal eine datei in einem externen js mit ajax eingelesen? kann jemand bestätigen, dass das ganz sicher möglich ist?

                            Ja, kann ich: Siri

                            hi siri, ich hab jetzt einfach mal dein beispiel 1:1 übernommen und aufgerufen (natürlich mit meiner test.txt im GET)

                            ich bekomme ganz klar den wert von checkResponse geliefert. dieser ist

                            null.

                            null! also den wert, den du checkResponse ganz oben zugewiesen hast.

                            ich heul jetzt gleich.

                            • Gustl
                            --
                            Ich pflege mit mir selbst den modernen Führungsstil: Ich nehme mir was vor und verrate mir mit keinem Wort wie ich das erreichen will :-)
                            1. ich bekomme ganz klar den wert von checkResponse geliefert. dieser ist

                              null.

                              null! also den wert, den du checkResponse ganz oben zugewiesen hast.

                              Ist doch klar, weil wieder asynchron gearbeitet wird.

                              MfG
                              bubble

                              1. Ist doch klar, weil wieder asynchron gearbeitet wird.

                                Ja, hast Recht! In dem Fall:

                                function xyz() {  
                                  
                                  
                                        try {  
                                                var http = null;  
                                  
                                                if (window.XMLHttpRequest) {  
                                                        http = new XMLHttpRequest();  
                                                } else if (window.ActiveXObject) {  
                                                        http = new ActiveXObject("Microsoft.XMLHTTP");  
                                                }  
                                  
                                                if (http != null) {  
                                                        http.open("GET", "example.html", true);  
                                                        http.onreadystatechange = function () {  
                                                                if (http.readyState == 4) {  
                                                                        callBack(http.responseText)  
                                ;  
                                  
                                                                }  
                                                        }  
                                                        http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  
                                                        http.send();  
                                                }  
                                  
                                        } catch(e) {  
                                  
                                        }  
                                  
                                       ;  
                                }  
                                  
                                function callBack(text) {  
                                   alert(text);  
                                }  
                                
                                
                                1. alert(text);

                                  eine alert - ausgabe im externen script? dachte alert gibt am bildschirm aus.

                                  und die übergabe an eine functon in readystate oder der aufruf in get mit false, das hatten wir doch schon alles.

                                  reden wir hier wirklich von der selben sache? dein beispiel, siri, läuft im externen script? bitte nicht böse sein, aber ich kapier jetzt echt gar nix mehr. in welchem film bin ich grade? ich glaube an dieser stelle sollte ich aufgeben.

                                  • Gustl
                                  --
                                  Ich pflege mit mir selbst den modernen Führungsstil: Ich nehme mir was vor und verrate mir mit keinem Wort wie ich das erreichen will :-)
                                  1. Hallo Gustl,

                                    alert(text);

                                    eine alert - ausgabe im externen script? dachte alert gibt am bildschirm aus.

                                    das macht keinen Unterschied. Du kannst alles zwischen <script> und </script> in eine Javascriptdatei auslagern. Dem Browser ist es egal, wo das Script herkommt. Probleme kann es geben, wenn die html-Datei "UTF-8 ohne BOM" kodiert ist, dein Editor aber default eine andere Kodierung wählt.

                                    Zu deinem Problem: du machst "irgendetwas falsch". Wenn du weitere Hilfe möchtest, zeig deinen auf das wesentliche reduzierten Code, am besten als Onlinebeispiel.

                                    Gruß, Jürgen

                                2. natürlich mit return text; versehen und test.txt im get

                                  liefert mir undefined

                                  jungs, lassen wirs.

                                  • Gustl
                                  --
                                  Ich pflege mit mir selbst den modernen Führungsstil: Ich nehme mir was vor und verrate mir mit keinem Wort wie ich das erreichen will :-)
                                  1. jungs, lassen wirs.

                                    Aufgeben ist keine Option! O:

                                    Hier mal das "Komplettpaket".

                                    MfG
                                    bubble

                            2. Wann?

                              Was macht:

                              function xyz() {  
                                
                                      var checkResponse = null;  
                                
                                      try {  
                                              var http = null;  
                                
                                              if (window.XMLHttpRequest) {  
                                                      http = new XMLHttpRequest();  
                                              } else if (window.ActiveXObject) {  
                                                      http = new ActiveXObject("Microsoft.XMLHTTP");  
                                              }  
                                
                                              if (http != null) {  
                                                      http.open("GET", "example.html", true);  
                                                      http.onreadystatechange = function () {  
                                                              if (http.readyState == 4) {  
                                                                      checkResponse = http.responseText  
                              ;  
                                                                      alert(checkResponse);  
                                                              }  
                                                      }  
                                                      http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');  
                                                      http.send();  
                                              }  
                                
                                      } catch(e) {  
                                
                                      }  
                                
                                      return checkResponse;  
                              }
                              

                              ?

                              1. Sorry, bei dieser Verwemdung:

                                http.open("GET", "example.html", false);

                                Dann "wartet der return"

                                Wenn's asynchron sein soll: hier.

              2. wo hab ich (schlimmer fluch *nur FSK18) nur den fehler ...

                ich habs jetzt nochmal! getestet. EXAKT DIE SELBE function läuft in der html-datei, aber nicht in der externen .js .

                es ist zum mäusemelken. vermutlich ist es wie meistens ganz was anderes, irgend eine kleinigkeit. vor lauter testen weiss ich schon gar nicht mehr, was ich schon alles versucht hab.

                hier nochmal, lese zum testen jetzt eine .txt ein

                html-datei: (in perl gedruckt, also wegen der \ nicht wundern)
                <script type=\"text/javascript\">  
                  
                function MACH() {  
                  AJAX = new XMLHttpRequest();  
                  AJAX.open('GET','test.txt',true);  
                  AJAX.onreadystatechange = function () {  
                    if (AJAX.readyState == 4) {  
                	  doChallengeResponse(AJAX.responseText);  
                	}  
                  }  
                  AJAX.send(null);  
                }  
                  
                function doChallengeResponse() {  
                	 document.form1.ich.value = MACH();  
                }  
                </script>
                
                <form name=\"form1\">  
                  <input type=\"text\" name=\"ich\" size=100>  
                  <input onClick=\"MACH(); return false;\" type=\"submit\" value=\"GO\">  
                </form>
                

                ####### jetzt ausgelagert, die function MACH() in externe.js ist exakt die selbe wie oben, nur anstatt doChallengeResponse(AJAX.responseText); schreibe ich return AJAX.responseText;

                hab aber auch schon versucht responseText an eine function zu übergeben die widerum den return liefert, und rufe dann halt die andere func auf. geht alles nicht.

                .. <script src=\"externe.js\"></script> ..  
                  
                <script type=\"text/javascript\">  
                  
                function doChallengeResponse() {  
                	 document.form1.ich.value = MACH();  
                }  
                </script>
                
                <form name=\"form1\">  
                  <input type=\"text\" name=\"ich\" size=100>  
                  <input onClick=\"doChallengeResponse(); return false;\" type=\"submit\" value=\"GO\">  
                </form>
                

                wenn ich mir einen test-paramter in MACH() zurückgeben lasse wird er einwandfrei geliefert, das heisst doch dass MACH() in externe.js angesprochen wird. aber der eingelesene wert aus der textdatei bleibt undefined.

                what the fu*k is this?

                • Gustl
                --
                Ich pflege mit mir selbst den modernen Führungsstil: Ich nehme mir was vor und verrate mir mit keinem Wort wie ich das erreichen will :-)
                1. <script type="text/javascript">

                  function MACH() {
                    AJAX = new XMLHttpRequest();
                    AJAX.open('GET','test.txt',true);
                    AJAX.onreadystatechange = function () {
                      if (AJAX.readyState == 4) {
                    doChallengeResponse(AJAX.responseText);
                  }
                    }
                    AJAX.send(null);
                  }

                  function doChallengeResponse() {
                  document.form1.ich.value = MACH();
                  }
                  </script>

                  Das dürfte sich tot rennen.  
                  Jedes mal wenn Mensch B fertig ist, schickt ihn Mensch A wieder los. Desweiteren übergibst du zwar den Antworttext, benutzt ihn aber in doChallengeResponse garnicht, statt dessen startest du wieder ein neues Ajax-Request, wo wieder, wenn es fertig ist, doChallengeResponse aufruft, welches wieder nicht den Parameter verwendet und statt dessen ...  
                    
                  Der Fehler scheint nicht zu sein, dass es mit externer JS-Datei NICHT geht, sondern vielmehr, dass es inline funktioniert.  
                    
                  ~~~javascript
                    
                  function fireRequest(){  
                      var ajax = new XMLHttpRequest();  
                      ajax.onreadystatechange = function () {  
                          if (this.readyState == 4) {  
                              document.form1.ich.value = this.responseText;  
                          }  
                      }  
                      ajax.send(null);  
                  }  
                  
                  

                  Et voilà, das sollte sowohl inline als auch in externer Datei funktionieren.
                  Nebenbei solltest du deine ajax-Objekt-Instanzierung genauer angucken. AFAIK wird der IE da streiken, weil es beim IE anders instanziert wird.

                  MfG
                  bubble

                  1. Das dürfte sich tot rennen.
                    bubble

                    da hast du recht. vor lauter rumprobieren entsteht auch noch ne trabrennbahn. ne, das war nur nach 382 mal testen so zusammengebraten.

                    ich muss jetzt von der sache weg sonst kann ich gar nicht mehr denken. 1 tag pause. basta.

                    • Gustl
                    --
                    Ich pflege mit mir selbst den modernen Führungsstil: Ich nehme mir was vor und verrate mir mit keinem Wort wie ich das erreichen will :-)
                    1. Übersichtshalber mal alle Dokumente:

                      script.js

                      function fireRequest(){  
                           var ajax = null;  
                           if(window.XMLHttpRequest){  
                                ajax = new XMLHttpRequest();  
                           }  
                           else if(window.ActiveXObject){  
                                http = new ActiveXObject("Microsoft.XMLHTTP");  
                           }  
                        
                           if(ajax){  
                                ajax.open('GET','test.txt',true);  
                                ajax.onreadystatechange = function () {  
                                    if (this.readyState == 4) {  
                                        alert(this.responseText);  
                                    }  
                           }  
                           ajax.send(null);  
                      }
                      

                      test.txt:

                        
                      Das ist der Testinhalt.  
                      
                      

                      index.htm

                        
                      <!DOCTYPE html>  
                      <html>  
                          <head>  
                              <script type="text/javascript" src="script.js"></script>  
                          </head>  
                          <body>  
                              <button onclick="fireRequest();">  
                          </body>  
                      </html>  
                      
                      

                      MfG
                      bubble

                      1. Hallo,

                        ajax.open('GET','test.txt',true);

                        Du willst wirklich auf die test.txt losgehen?

                        Viele Grüße
                        Siri

                        1. ajax.open('GET','test.txt',true);
                          Du willst wirklich auf die test.txt losgehen?

                          Warum nicht? Geht ja bei dem Script erstmal nur darum, den Inhalt irgendeiner Datei zu erhalten und auszugeben.
                          Da reicht das als Beispiel doch aus.

                          MfG
                          bubble

                  2. function fireRequest(){
                        var ajax = new XMLHttpRequest();
                        ajax.onreadystatechange = function () {
                            if (this.readyState == 4) {
                                document.form1.ich.value = this.responseText;
                            }
                        }
                        ajax.send(null);
                    }

                    Ups. Das ist falsch, zu wenig c&p ;p  
                      
                     ~~~javascript
                      
                     function fireRequest(){  
                         var ajax = new XMLHttpRequest();  
                         ajax.open('GET','test.txt',true);  
                         ajax.onreadystatechange = function () {  
                             if (this.readyState == 4) {  
                                 document.form1.ich.value = this.responseText;  
                             }  
                         }  
                         ajax.send(null);  
                     }  
                    
                    

                    So muss es natürlich da stehen.

                    MfG
                    bubble

      2. Hallo,

        123.cgi liefert korrekt. wenn ich den selben request also direkt in die html zwischen <script></script> schreibe, dann wird mir der richtige wert geliefert.

        ich wollts einfach nur mal ausprobieren.

        Kann es sein, dass 123.cgi nach der Auslagerung nicht mehr die richtige Adresse ist, weil sich mit dem ausgelagerten Script auch der Pfad geändert hat?

        Viele Grüße
        Siri

        1. hi siri,

          Kann es sein, dass 123.cgi nach der Auslagerung nicht mehr die richtige Adresse ist, weil sich mit dem ausgelagerten Script auch der Pfad geändert hat?

          nene, selbes verzeichnis.

          • Gustl
          --
          Ich pflege mit mir selbst den modernen Führungsstil: Ich nehme mir was vor und verrate mir mit keinem Wort wie ich das erreichen will :-)