frankx: js nachladen per script_element.src

Hellihello,

im Forum (http://forum.de.selfhtml.org/archiv/2007/8/t157898/#m1027242) gab es hier schonmal Versuche.

Meine Frage, wäre, was gegen folgendes spräche (statt XHTTPRequest incl. Alternativen für die IE-Verionen ("AJ"a[x|t])):

  
  window.onload=function() {couter=0};  
  
  getJSON=function() {  
   if(!script) {  
    my_script=document.createElement("script");  
    document.getElementsByTagName("head")[0].appendChild(my_script);  
    my_script.type="text/javascript";  
   }  
   my_script.src='json_out.php?count='+counter;  
   counter++;  
  }  

Den Counter habe ich sicherheitshalber erstmal hintenan gehangen, um welchem Browser auch immer vorzugaukeln, es wäre eine neue Script-src einzubinden.

Im json_out.php steht dann sowas wie:

  
$arr["name"]="KurtFriedrich!".time();  
$arr["gemeines"]=htmlentities("'::'\".kkßüä'\\\\\"");  
echo "person=".json_encode($arr);  

was dann direkt nach dem Laden aus dem javscript zB. mit

  
alert(person.name);  
alert(person.gemeines);  

angesprochen werden kann (ohne evil eval).

Ist bei größeren Datenmengen das _Asynchronous_ J a [t|x] von Vorteil bzw. in obigem ein Wurm drin?

Dank und Gruß,

frankx

  1. Hellihello,

    ist das kein Thema, weils unnötig ist oder schon jenseits aller Fragerei um IE-Bugs liegt oder weil sich _niemand_ auf JS verlassen will?

    Seisdrum, Ende 2005 steht in diesem (http://www.devarticles.com/c/a/JavaScript/JavaScript-Remote-Scripting-Fetching-Server-Data-with-the-DOM/1/)
    Artikel eine analoge Variante, abgesehen davon, dass hier von Serverseite nicht json rückgemeldet wird, aber das steht ja eigentlich auf einem anderen Blatt.

    Ich schlussfolgere also erstmal, dass die o.g. Einbindung über die Neuzuweisung der script-Quelles so funktional ist und
    die Unterscheidung zwischen den drei Objekttypen ActiveXObject("Msxml2.XMLHTTP"), ActiveXObject("Microsoft.XMLHTTP")und XMLHttpRequest vermeidet - sowie die Abfrage des readyStates erspart.

    Dank und Gruß,

    frankx

    1. Hi,

      Ich schlussfolgere also erstmal, dass die o.g. Einbindung über die Neuzuweisung der script-Quelles so funktional ist

      Sie ist auch die, die - aus gutem Grund - immer hier im Forum genannt wird. :-)

      die Unterscheidung zwischen den drei Objekttypen ActiveXObject("Msxml2.XMLHTTP"), ActiveXObject("Microsoft.XMLHTTP")

      Diese Unterscheidung ist ohnehin überflüssig. Letztere Variante ist vollkommen ausreichend.

      Gruß, Cybaer

      --
      Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
      1. Hellihello,

        und donp's Einwände scheints Du nicht zu teilen? Ich konnte sie jetzt erstmal auch nicht nachvollziehen, aber vielleicht fehlt mir ja noch ein technisches Tü an irgendeiner Stelle im Verständnis.
        Dank und Gruß,

        frankx

        1. Hi,

          und donp's Einwände scheints Du nicht zu teilen?

          Nein. Wenn ich Skripte nachladen muß, dann sollen sie sofort starten, oder ich packe es in eine Funktion. Das Skript "weiß" auch, wenn es "durch" ist, und kann amn Ende machen, was ich will. ;-)

          Gruß, Cybaer

          --
          Hinweis an Fragesteller: Fremde haben ihre Freizeit geopfert, um Dir zu helfen. Helfe Du auch im Archiv Suchenden: Beende deinen Thread mit einem "Hat geholfen" oder "Hat nicht geholfen"!
  2. Hi,

    [...] von Vorteil bzw. in obigem ein Wurm drin?

    Es sind mehrere mehrere Würmer drin:

    1. Ohne "evil eval" geht es nicht wirklich, denn das nachgeladene Script wird sofort automatisch ausgeführt, und zwar mit eval. Das lässt sich nicht verhindern.

    2. Es ist Zeitkritisch, denn man kann nicht ohne weiteres feststellen, wann das Script fertig ausgeführt ist.

    Gruß, Don P

    1. Hellihello

      Hi,

      [...] von Vorteil bzw. in obigem ein Wurm drin?

      Es sind mehrere mehrere Würmer drin:

      1. Ohne "evil eval" geht es nicht wirklich, denn das nachgeladene Script wird sofort automatisch ausgeführt, und zwar mit eval. Das lässt sich nicht verhindern.

      Auch wenn im json_out.php steht:

      ~~~php

      $arr["name"]="KurtFriedrich!".time();
       $arr["gemeines"]=htmlentities("'::'".kkßüä'\\"");
       echo "person=".json_encode($arr);
       echo "alert(person.name)";
       echo "alert(person.gemeines)";

        
      muss doch nicht ge-evalt werden sonden gibt doch direkt js-code zurück, in dem Fall das Objekt "person" mit zwei Eigenschaften (in Javascripts Object Notation) zurück (statt des alertes natürlich dann die einbindung in den Dokumentenbaum).  
        
      
      >   
      > 2. Es ist Zeitkritisch, denn man kann nicht ohne weiteres feststellen, wann das Script fertig ausgeführt ist.  
        
      Bei o.g. Variante doch dann, wenn der Inhalt im Dokumentenbaum einghängt ist.  
        
      Dank und Gruß,  
        
      frankx
      
      1. Hallo,

        Auch wenn im json_out.php steht [...]
        muss doch nicht ge-evalt werden sonden gibt doch direkt js-code zurück

        Ach so, ich dachte erst, JSON wird zurückgegeben. Wieso nennst du es dann überhaupt "json_out.php", ist ja wirklich verwirrend.

        1. Es ist zeitkritisch, denn man kann nicht ohne weiteres feststellen, wann das Script fertig ausgeführt ist.

        Bei o.g. Variante doch dann, wenn der Inhalt im Dokumentenbaum einghängt ist.

        Ja, aber das muss dann nachträglich noch abgefragt werden. Ich meinte das ganz allgemein: Wenn das nachgeladene js eine Weile braucht, und inzwischen andere js-Rotinen angestoßen werden, die auf Ergebnisse des neuen js angewiesen wären, kann es Probleme geben, wenn das nachgeladene Script nicht irgendwie signalisiert "ich habe fertig" ;). So ein Signal muss dann natürlich auch noch abgefragt werden.

        Gruß, Don P

        1. Hellihello donp,

          Auch wenn im json_out.php steht [...]
          muss doch nicht ge-evalt werden sonden gibt doch direkt js-code zurück

          Ach so, ich dachte erst, JSON wird zurückgegeben. Wieso nennst du es dann überhaupt "json_out.php", ist ja wirklich verwirrend.

          Mh, ich dachte JSON steht für JavascriptObjectNotation. Ich dachte jetzt ich gebe zurück in der json_out.php sowas wie:

            
          user={"name":"Hans","mail":"mail@example.com"}  
          
          

          und bastel das dann ein (das wäre doch JSON), oder aber eben geleich

            
          html_code=<ul><li>name:Hans</li><li>mail:mail@example.com</li><ul>;  
          document.getElementById("code_div").innerHTML=html_code;  
          
          

          (besser natürlich durch Einhängen in den Baum).

          Ja, aber das muss dann nachträglich noch abgefragt werden. Ich meinte das ganz allgemein: Wenn das nachgeladene js eine Weile braucht, und inzwischen andere js-Rotinen angestoßen werden, die auf Ergebnisse des neuen js angewiesen wären,

          Also wenn ich die userdaten im nachgeladen Script definiere mit Javascript Objectnotation (Bspl. 1) und diese dann mittels einer bereits geladenen Funktion in den Dokumentenbaum einhängen will, das Object user aber nocht nicht vollständige geladen ist? So ein Umstand macht die XMLHTTPRequest-Weiche ja auch nicht, und man kann (nur dort?) mit onreadystatechange bzw. readyState eben feststellen, ob die Daten komplett transferiert wurden. Bei der anderen Variante ließ sich sowas vielleicht selbst bauen, indem am Ende eine Variable definiert wird, deren Größe dann mit setTimeout in einer while-Schleife abgefragt würde?

            
          user={"tierisch lange objektkette von useren":"lang und ganz oft"}  
          kontrollvar=-17;  
            
          // und bereits auf dem Client:  
            
          5malhöchstens=0;  
          wartemal() {  
           while (kontrollvar!=-17 && 5malhöchstens < 6 ) {  
            setTimeout(1000,"wartemal()");  
            5malhöchstens++;  
          }  
          //  
          
          

          Na, dann vielleicht doch lieber die readyState-Eigenschaft des XMLHttpRequest-Objekts/ActiveXObject-Objektes abfragen und als mime-type text/html wählen, und das als innerHTML reinwurschteln.

          Dank und Gruß,

          frankx

          1. Hallo frankx,

            Mh, ich dachte JSON steht für JavascriptObjectNotation.

            Das ja, richtiges JSON Format müsste dann aber mit eval ausgeführt werden.

            Wenn du direkt javascript nachlädst durch Ändern des src-Attributs im script-Tag, ist das auch ok, aber dabei gibt es eben ein paar Dinge zu bedenken.

            Also wenn ich die userdaten im nachgeladen Script definiere mit Javascript Objectnotation (Bspl. 1) und diese dann mittels einer bereits geladenen Funktion in den Dokumentenbaum einhängen will, das Object user aber nocht nicht vollständige geladen ist?

            Ja, sowas. Oder wenn die nachzuladende js-Datei z.B. gar nicht existiert, dann bekommst du keinen 404-Error und dein Browser hängt.

            So ein Umstand macht die XMLHTTPRequest-Weiche ja auch nicht, und man kann (nur dort?) mit onreadystatechange bzw. readyState eben feststellen, ob die Daten komplett transferiert wurden.

            Ja, nur dort.

            Bei der anderen Variante ließ sich sowas vielleicht selbst bauen, indem am Ende eine Variable definiert wird, deren Größe dann mit setTimeout in einer while-Schleife abgefragt würde?

            Ja, zum Beispiel.

            Schau mal unter "Alternate Ajax Techniques" auf http://javascript.internet.com/ajaxTutorials/ (Part 1 und 2), dort ist beschrieben, wie es funktioniert und was es evtl. für Nachteile gibt.

            Gruss, Don P