kati: IE / dynamisches Laden von Scripts (window-objekt)

Hallo,

ich habe einen Script-Loader geschrieben, der Scripts dynamisch in ein Dokument einfügt. Alle Klassen / Funktionen , die in diesen Scripts vorhanden sind, sind nach dem Laden auch verfügbar.

Das Einfügen sieht so ähnlich aus:

  
var heads = document.getElementsByTagName( "head" );  
var script  = document.createElement("script");  
//-- set the src attribute, that means load the script!  
script.src  = "xxx.js";  
script.type = "text/javascript";  
var head = (heads.length > 0 ) ? heads[0] : document.body;  
//-- append child to the head parent node  
head.appendChild(script);	  

Nun möchte ich alle Function-Objekte, die das Dokument kennt, durchlaufen

  
for( var name in window ) {  
	var f = window[name];  
	if( typeof f != 'function' ) continue;  
        //... do something  
}  

jedoch sind diese im window-Objekt nicht vorhanden, zumindest dann nicht, wenn man mit dieser for-each-Schleife drübergeht. Kennt man den Namen des Function-Objektes und referenziert dieses direkt (window["MeineKlasse"]), kennt sich IE plötzlich aus. Warum?!

Ich arbeite schon seit einigen Jahren im JS-Umfeld - und zwar sehr intensiv - jedoch ist mir so eine Sch... Software wie IE noch niemals untergekommen. Es ist eine Qual etwas für IE zu entwickeln. Rein für die Optimierungen und Kompatibilität mit IE-Browsern (6, 7, 8) muss man mind.30% der Arbeitszeit einplanen, weil das so ein Mist ist! Ich bin wirklich entsetzt!

Danke für etwaige Vorschläge, wie man dies fixen könnte.
kati

  1. Hi,

    Nun möchte ich alle Function-Objekte, die das Dokument kennt, durchlaufen

    innerhalb des selben <script>-Elementes, in dem das neue JavaScript dem Head[1] eingefügt wurde? Vergiss es, es ist allerfrühestens nach dem </script> verfügbar.

    Ich arbeite schon seit einigen Jahren im JS-Umfeld - und zwar sehr intensiv - jedoch ist mir so eine Sch... Software wie IE noch niemals untergekommen. Es ist eine Qual etwas für IE zu entwickeln.

    Sieh es positiv: Die Bezahlung, die ein guter Entwickler dafür bekommt, enthält das entsprechende Schmerzensgeld.

    Cheatah

    [1] Nebenbei: Wie kommst Du auf die Idee, auf den <body> zugreifen zu können, wenn noch nicht einmal der <head> da ist?

    --
    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 Cheatah!

      [1] Nebenbei: Wie kommst Du auf die Idee, auf den <body> zugreifen zu können, wenn noch nicht einmal der <head> da ist?

      Nebenbei: wie kommt es, dass Du immer sofort hier zu sein scheinst, sobald die Zeichenkette 'IE' im Betreff enthalten ist?

      off:PP

      --
      "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
      1. Hi,

        wie kommt es, dass Du immer sofort hier zu sein scheinst, sobald die Zeichenkette 'IE' im Betreff enthalten ist?

        weil dann sein Virenscanner losmeckert ;-)

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
      2. Hi,

        Nebenbei: wie kommt es, dass Du immer sofort hier zu sein scheinst, sobald die Zeichenkette 'IE' im Betreff enthalten ist?

        oh, das ist einfach: Nebenberuflich bin ich Jesus. Ich lade das Leid aller Web-Entwickler auf meine Schultern. HTH.

        Chea "Jeder braucht schließlich ein Hobby." tah ;-)

        --
        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!

          Nebenbei: wie kommt es, dass Du immer sofort hier zu sein scheinst, sobald die Zeichenkette 'IE' im Betreff enthalten ist?

          oh, das ist einfach: Nebenberuflich bin ich Jesus.

          Bescheidenheit ist eine Zier..

          Ich lade das Leid aller Web-Entwickler auf meine Schultern. HTH.

          Du bist so gut zu uns;)

          off:PP

          --
          "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
          1. Hi,

            oh, das ist einfach: Nebenberuflich bin ich Jesus.
            Bescheidenheit ist eine Zier..

            deswegen habe ich ja auch nicht verraten, dass ich hauptberuflich Gott bin. Und das behalte ich auch für mich.

            Oops ... :-)

            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,

              deswegen habe ich ja auch nicht verraten, dass ich hauptberuflich Gott bin. Und das behalte ich auch für mich.

              "I refuse to prove that I exist", says God, "for proof denies faith, and without faith I am nothing."
              "But", says Man, "the Babel fish is a dead giveaway, isn't it? It could not have evolved by chance. It proves you exist, and so therefore, by your own arguments, you don't. QED."
              "Oh dear", says God, "I hadn't thought of that.", and promptly vanished in a puff of logic.

              Oh, that was easy. ;-)

              Oops ... :-)

              So long & thanks for all the fish,
               Martin

              --
              Der Mensch denkt, Gott lenkt.
              Der Mensch dachte, Gott lachte.
    2. Hi Cheedah,

      ich mache es nicht gleich beim Laden der Seite, sondern erst später (per Button-Klick). Es handelt sich um ein Analysetools, das ein Javascript-Framework lädt und analysiert. Ich hätte mir erwartet, dass durch das dynamische Nachladen die ganzen neuen Klassen auch im window-Objekt (und zwar über die for-Schleife) verfügbar sind. Sind es aber nicht? Hälst du es für normal?!

      Ich fange besser als Aldi-Kassiererin an, dann muss ich mich nicht herumärgern mit so nem Dreck und dafür auch noch vor allen geradestehen.. Ist echt zum kotzen.

      kati

      Hi,

      Nun möchte ich alle Function-Objekte, die das Dokument kennt, durchlaufen

      innerhalb des selben <script>-Elementes, in dem das neue JavaScript dem Head[1] eingefügt wurde? Vergiss es, es ist allerfrühestens nach dem </script> verfügbar.

      Ich arbeite schon seit einigen Jahren im JS-Umfeld - und zwar sehr intensiv - jedoch ist mir so eine Sch... Software wie IE noch niemals untergekommen. Es ist eine Qual etwas für IE zu entwickeln.

      Sieh es positiv: Die Bezahlung, die ein guter Entwickler dafür bekommt, enthält das entsprechende Schmerzensgeld.

      Cheatah

      [1] Nebenbei: Wie kommst Du auf die Idee, auf den <body> zugreifen zu können, wenn noch nicht einmal der <head> da ist?

      1. Hi,

        ich mache es nicht gleich beim Laden der Seite, sondern erst später (per Button-Klick).

        na, dann sollte der <head> auf jeden Fall verfügbar sein.

        Ich hätte mir erwartet, dass durch das dynamische Nachladen die ganzen neuen Klassen auch im window-Objekt (und zwar über die for-Schleife) verfügbar sind. Sind es aber nicht? Hälst du es für normal?!

        Das kommt darauf an, wann Du sie überprüfst und was da eigentlich genau geschieht - auch im nachgeladenen Script. Mit anderen Worten: Wir benötigen wesentlich mehr Informationen, als Du bisher geliefert hast; idealerweise in Form eines Links auf eine Seite, die das Problem nachvollziehbar enthält.

        Ich fange besser als Aldi-Kassiererin an, dann muss ich mich nicht herumärgern mit so nem Dreck und dafür auch noch vor allen geradestehen.. Ist echt zum kotzen.

        Tröste Dich, man gewöhnt sich dran ...

        Hi,

        Bitte zitiere nur das, worauf Du Dich beziehst, und antworte in einer in Mitteleuropa üblichen Leserichtung, danke.

        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
  2. Hi,

    Nun möchte ich alle Function-Objekte, die das Dokument kennt, durchlaufen

    for( var name in window ) {

    var f = window[name];
    if( typeof f != 'function' ) continue;
            //... do something
    }

    
    >   
    > jedoch sind diese im window-Objekt nicht vorhanden, zumindest dann nicht, wenn man mit dieser for-each-Schleife drübergeht.  
      
    Das ist bei Funktionen, die nicht erst nachgeladen werden, sondern schon "sofort" in einem Script-Bereich im Dokument vorhanden sind, nach meinem Test genauso.  
      
    ~~~javascript
    function Test1() {  
    	alert("Test1");  
    }  
      
    var Test2 = function() {  
    	alert("Test2");  
    }  
      
    Test3 = function() {  
    	alert("Test3");  
    }  
      
    window.Test4 = function() {  
    	alert("Test4");  
    }
    

    Die einzige dieser Funktionen, die mir über eine for-in-Schleife analog deiner aufgelistet wird, ist - Test4.

    Kennt man den Namen des Function-Objektes und referenziert dieses direkt (window["MeineKlasse"]), kennt sich IE plötzlich aus. Warum?!

    Keine Ahnung. Ich kann nur vermuten, dass der IE an dieser Stelle ähnlich "speziell" ist, wie auch beim dynamischen erzeugen von Formularelementen - siehe auch </archiv/2009/7/t188948/#m1258678>

    Selbst mit Variablen verhält er sich nicht anders, wenn ich analog zu obigem Beispiel

    TVar1 = "TVar1";  
    var TVar2 = "TVar2";  
    window.TVar3 = "TVar3";
    

    habe, und mit for-in über die Eigenschaften von window iteriere, dann bekomme ich lediglich TVar3 angezeigt, die ersten beiden jedoch nicht.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.