EKKi: Reihenfolge beim Laden bzw. Ausführen von externen .js-Dateien

Mahlzeit alle,

ich hätte da gerne mal ein Problem ... :-)

Für unser Intranet bin ich gerade dabei, einige Javascript-Funktionalitäten zu überarbeiten, zu zentralisieren und etwas schicker zu kapseln. Alle globalen Werte und Funktionen, die auf jeden Fall immer gebraucht werden, sollen dann in einer zentralen .js-Datei in einem Objekt vorliegen:

Datei "foo.js":
--------------------------------------------------

var foo = {  
  irgendwas: false,  
  nochwas:   ['bla', 'blubb'],  
  
  machwas: function() {  
// Irgendwelche Funktionen ...  
  },  
  
  init: function() {  
// An den window.onload-Handler hängen usw. ...  
  }  
};  
  
foo.init();

--------------------------------------------------

Funktioniert bestens.

Jetzt möchte ich dieses Objekt um zusätzliche Funktionen erweitern, die nicht immer auf jeder Seite benötigt werden. Ich habe sie je nach "Bereich" in verschiedenen Unterobjekten zusammengefasst und erweitere mein Objekt "foo" wie folgt:

--------------------------------------------------

foo.bar = {  
  mehr: 0,  
  noch_mehr: 'fasel',  
  
  dideldum: function() {  
// Zusätzliche Funktionen im Bereich "bar" ...  
  }  
};  
  
foo.baz = {  
  anderes: {hue: 'hott', hoppel: 'didoppel'},  
  
  tralala: function() {  
// Zusätzliche Funktionen im Bereich "baz" ...  
  }  
};

--------------------------------------------------

Dadurch wird die Datei "foo.js" einerseits immer größer, andererseits wäre es sinnvoller, wenn der Code für die einzelnen "Bereiche" in verschiedenen Datei vorliegen würde - gerade im Hinblick darauf, dass mehrere Entwickler gleichzeitig damit arbeiten sollen (Subversion usw.).

Ich habe also versucht, den Code wie folgt aufzuteilen:

Datei "foo.js":
--------------------------------------------------

var foo = {  
// Inhalt wie oben ...  
};

--------------------------------------------------

Datei "bar.js":
--------------------------------------------------

foo.bar = {  
// Inhalt wie oben ...  
};

--------------------------------------------------

Datei "baz.js":
--------------------------------------------------

foo.baz = {  
// Inhalt wie oben ...  
};

--------------------------------------------------

Diese werden dann folgendermaßen in den HTML-Dokumenten eingebunden:

Immer:
--------------------------------------------------
<script type="text/javascript" src="foo.js"></script>
--------------------------------------------------

Je nach Bedarf:
--------------------------------------------------
<script type="text/javascript" src="bar.js"></script>
--------------------------------------------------
bzw.
--------------------------------------------------
<script type="text/javascript" src="baz.js"></script>
--------------------------------------------------

Und jetzt treten - zumindest im IE6 [*] - Probleme auf:

--------------------------------------------------
Zeile:   11
Zeichen: 1
Fehler:  'foo' ist undefiniert
Code:    0
--------------------------------------------------

Der Fehler weist (in der für den IE6 typischen Klarheit) auf die Zeile in der Datei "bar.js" hin, in der folgendes steht:

--------------------------------------------------
foo.bar = {
--------------------------------------------------

Ich gehe also davon aus, dass der IE6 die Datei "bar.js" geladen hat und ausführt, bevor er die Datei "foo.js" geladen und ausgeführt hat. In dem Fall existiert das Objekt "foo" natürlich noch nicht.

Im Firefox scheint die Reihenfolge des Ladens und Ausführens diejenige zu sein, in der die Dateien auch im HTML-Dokument notiert sind - im IE6 offenbar nicht immer zwangsläufig.

Wie kann ich erreichen, dass die Datei in der Reihenfolge geladen bzw. ausgeführt werden, die sicherstellt, dass das zugrundeliegende Objekt bereits existiert?

MfG,
EKKi

[*] Ja, ich weiß ... der IE6 ist aber leider hausweit als Browser ausgerollt bzw. vorgeschrieben. Dass das suboptimal ist, ist mir und auch anderen bewusst. Wir können das aber nicht ändern - Politik.

--
sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  1. [latex]Mae  govannen![/latex]

    Wie kann ich erreichen, dass die Datei in der Reihenfolge geladen bzw. ausgeführt werden, die sicherstellt, dass das zugrundeliegende Objekt bereits existiert?

    Genaues weiß ich auch nicht und leider hab ich seit ein paar Wochen keinen nativen IE6 mehr, daher nur eine auch niczt wirklich saubere Möglichkeit:

    In jeder Datei am Anfang eine Abfrage wie z.B. if(!foo) foo = {}; oder if (typeof foo !== 'object') foo = {}; einfügen. Das wird wahrscheinlich kein Allheilmittel sein, insbesondere, wenn in den Erweiterungs-Dateien Abhängigkeiten zum "Hauptobjekt" bestehen, aber es könnte zumindest helfen. Da der IE6 sowas wie DocumentReady ohnehin nicht kennt und auf onload angewiesen ist könnte es vom Timing reichen.

    Cü,

    Kai

    --
    A workaround for an avoidable problem often adds clutter and overhead to the program which
    could have been avoided by not creating the problem in the first place.(Garrett Smith/clj)
    Foren-Stylesheet Site Selfzeug JS-Lookup
    SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
    1. Mahlzeit Kai345,

      In jeder Datei am Anfang eine Abfrage wie z.B. if(!foo) foo = {}; oder if (typeof foo !== 'object') foo = {}; einfügen.

      Die Frage ist dann ja nur folgende:

      Angenommen ich mache das so wie Du sagst, es wird erst die Datei "bar.js" geladen und ausgeführt:

      ----------------------------------------

      if (!foo) foo = {};  
        
      foo.bar = {  
      // ...  
      };
      

      ----------------------------------------

      Dann hätte ich ein Objekt namens "foo" mit einem Unterobjekt "bar". Wenn jetzt aber *anschließend* die Datei "foo.js" geladen und ausgeführt wird, dann überschreibt doch folgender Code

      ----------------------------------------

      var foo = {  
      // ...  
      };
      

      ----------------------------------------

      Das bereits bestehende Objekt "foo" wieder ... dann hat das Objekt "foo" zwar all die Eigenschaften und Methoden, die es haben sollte - allerdings kein Unterobjekt "bar" mehr. :-(

      Habe ich bereits getestet und ist genau so ... ist also keiner keine brauchbare Lösung.

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      1. Angenommen ich mache das so wie Du sagst, es wird erst die Datei "bar.js" geladen und ausgeführt:

        Ich hab das mal nachgebaut: http://selfhtml.jstruebig.de/foo.html
        funktioniert einwandfrei ohne Fehler im IE 6, ich vermute nach wie vor eher ein Zeichensatz Problem.

        Struppi.

        1. [latex]Mae  govannen![/latex]

          Angenommen ich mache das so wie Du sagst, es wird erst die Datei "bar.js" geladen und ausgeführt:

          Ich hab das mal nachgebaut: http://selfhtml.jstruebig.de/foo.html
          funktioniert einwandfrei ohne Fehler im IE 6

          Vielleicht hat IE6 auch "normalerweise" richtig herum geladen (es kann auf einem externen Server z.B. durch Serverlast oder Request-Begrenzung sein, daß die Dateien in einer anderen Reihenfolge geladen werden) oder das Timing verändert

          bar wird angefordert
          bar wird geladen
          foo wird angefordert
          bar ist fertig, alert
          foo wird währenddessen im Hintergrund geladen
          foo ist fertig

          Wenn nun der Alert bestätigt wird, ist foo inzwischen geladen, Fehler tritt nicht auf

          (alles Therorie, Denkfehler ggf. bitte aufzeigen)

          Cü,

          Kai

          --
          A workaround for an avoidable problem often adds clutter and overhead to the program which
          could have been avoided by not creating the problem in the first place.(Garrett Smith/clj)
          Foren-Stylesheet Site Selfzeug JS-Lookup
          SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
          1. Vielleicht hat IE6 auch "normalerweise" richtig herum geladen (es kann auf einem externen Server z.B. durch Serverlast oder Request-Begrenzung sein, daß die Dateien in einer anderen Reihenfolge geladen werden) oder das Timing verändert

            Ich hatte diese Problem noch nie und habe davon auch noch nie gehört. Das alert() hatte ich auch erst nach dem ersten Versuch reingemacht, damit man was sieht, ist jetzt an anderer Stelle.

            Struppi.

        2. funktioniert einwandfrei ohne Fehler im IE 6, ich vermute nach wie vor eher ein Zeichensatz Problem.

          Alternativ böte sich noch an: Werden die JS Ressourcen evtl. komprimiert ausgeliefert?

          1. Mahlzeit Pragma,

            Alternativ böte sich noch an: Werden die JS Ressourcen evtl. komprimiert ausgeliefert?

            Nein, stinknormal ... :-(

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        3. Mahlzeit Struppi,

          Angenommen ich mache das so wie Du sagst, es wird erst die Datei "bar.js" geladen und ausgeführt:

          Ich hab das mal nachgebaut: http://selfhtml.jstruebig.de/foo.html

          In der Tat. Wenn ich bei mir in der "bar.js" ein entsprechendes alert() einbaue, kommt weiterhin die beschriebene Fehlermeldung ... aber kein alert().

          Komisch ... ich suche weiter ...

          funktioniert einwandfrei ohne Fehler im IE 6, ich vermute nach wie vor eher ein Zeichensatz Problem.

          An welcher Stelle genau? Die ASP-Datei ist Windows-1252, das erzeugte HTML auch, die beiden .js-Dateien auch.

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      2. [latex]Mae  govannen![/latex]

        Das bereits bestehende Objekt "foo" wieder ... dann hat das Objekt "foo" zwar all die Eigenschaften und Methoden, die es haben sollte - allerdings kein Unterobjekt "bar" mehr. :-(

        Hmmm, ja, stimmt schon. Die Schreibweise der Objekte müßte in diesem Fall anders sein.

        Würde dann auf ein Schema wie z.B.

        if (!foo) var foo = {};  
          
        foo.init = function (){...};  
          
        foo.machwas = function() {...};  
          
        foo.sinn = 42;  
          
        foo.hatHandtuch = true;  
        
        

        hinauslaufen. Ist natürlich auch nicht so schön, das alles umzuschreiben. Muß mal nachdenken, ob mir noch was einfällt.

        Cü,

        Kai

        --
        A workaround for an avoidable problem often adds clutter and overhead to the program which
        could have been avoided by not creating the problem in the first place.(Garrett Smith/clj)
        Foren-Stylesheet Site Selfzeug JS-Lookup
        SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
      3. [latex]Mae  govannen![/latex]

        Das bereits bestehende Objekt "foo" wieder ... dann hat das Objekt "foo" zwar all die Eigenschaften und Methoden, die es haben sollte - allerdings kein Unterobjekt "bar" mehr. :-(

        andere Möglichkeit, nicht XHTML-fähig:

        foo.js:

          
        document.write('<script type="text/javascript" src="bar.js"><\/script>');  
        document.write('<script type="text/javascript" src="baz.js"><\/script>');  
          
        var foo = {...};  
        
        

        dann muß im HTML-Head nur noch foo.html eingebunden werden.

        Cü,

        Kai

        --
        A workaround for an avoidable problem often adds clutter and overhead to the program which
        could have been avoided by not creating the problem in the first place.(Garrett Smith/clj)
        Foren-Stylesheet Site Selfzeug JS-Lookup
        SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
        1. andere Möglichkeit, nicht XHTML-fähig:

          foo.js:

          document.write('<script type="text/javascript" src="bar.js"></script>');
          document.write('<script type="text/javascript" src="baz.js"></script>');

          var foo = {...};

            
            
          Genau diese Mölglichkeit ruft dann aber Timing Probleme hervor.  
            
          Struppi.
          
          1. [latex]Mae  govannen![/latex]

            Genau diese Mölglichkeit ruft dann aber Timing Probleme hervor.

            Ich sollte wieder ins Bett gehen *seufz*

            Cü,

            Kai

            --
            A workaround for an avoidable problem often adds clutter and overhead to the program which
            could have been avoided by not creating the problem in the first place.(Garrett Smith/clj)
            Foren-Stylesheet Site Selfzeug JS-Lookup
            SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
          2. [latex]Mae  govannen![/latex]

            document.write('<script type="text/javascript" src="bar.js"></script>');
            document.write('<script type="text/javascript" src="baz.js"></script>');

            var foo = {...};

            
            >   
            >   
            > Genau diese Mölglichkeit ruft dann aber Timing Probleme hervor.  
              
            Ungekehrt müßte es aber gehen, oder? (erst foo definieren, danach die anderen Scripte laden; Voraussetzung ist natürlich, daß foo wirklich erst mal nur definiert wird und noch nichts direkt ausführt. Ach, ich merk schon, mit Kopfschmerzen sollte man sich raushalten.  
              
            Cü,  
              
            Kai
            
            -- 
            A workaround for an avoidable problem often adds clutter and overhead to the program which  
            could have been avoided by not creating the problem in the first place.(Garrett Smith/clj)  
            [Foren-Stylesheet](http://kaichen.in/selfhtml/#h_stylesheet) [Site](http://knrs.de/) [Selfzeug](http://kaichen.in/selfhtml/) [JS-Lookup](http://js.knrs.de/lookup/)  
            SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
            
        2. Mahlzeit Kai345,

          foo.js:

          document.write('<script type="text/javascript" src="bar.js"></script>');
          document.write('<script type="text/javascript" src="baz.js"></script>');

          var foo = {...};

          
          >   
          > dann muß im HTML-Head nur noch foo.html eingebunden werden.  
            
          Hmmmmm ... Problem dabei ist: Ich weiß, dass auf jeden Fall \*immer\* "foo.js" eingebunden werden soll. Also steht das fix im Seiten-Master drin. Ob jedoch "bar.js", "baz.js" oder andere Dateien erforderlich sind, weiß eigentlich nur der ASP-Code auf dem Server - und der schustert dann im Seiten-Master ggf. die entsprechenden <script>-Elemente dazu.  
            
            
          MfG,  
          EKKi  
          
          -- 
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          
          1. [latex]Mae  govannen![/latex]

            Hmmmmm ... Problem dabei ist: Ich weiß, dass auf jeden Fall *immer* "foo.js" eingebunden werden soll. Also steht das fix im Seiten-Master drin. Ob jedoch "bar.js", "baz.js" oder andere Dateien erforderlich sind, weiß eigentlich nur der ASP-Code auf dem Server - und der schustert dann im Seiten-Master ggf. die entsprechenden <script>-Elemente dazu.

            Das ließe sich notfalls  dadurch lösen, daß foo.js keine statische js-Datei ist sondern eine asp-Datei, die den Code mit entsprechenden Content-type ausliefert. Würde natürlich bedingen, daß im Seiten-Master entsprechend nur noch festgestellt wird, welche Dateien erforderlich sind, die Ausgabe der Script-Elemente müßte dann in der foo.asp (oder wie auch immer man die dann nennt) erfolgen. Aber Struppi hat ja eh Bedenken gegen diese Lösung. Ob man die so lösen kann, weiß ich gerade auch nicht. Keine Ahnung, ich klinke mich jetzt auch (vorerst) endgültig aus, mein Kopf platzt gleich.

            Cü,

            Kai

            --
            A workaround for an avoidable problem often adds clutter and overhead to the program which
            could have been avoided by not creating the problem in the first place.(Garrett Smith/clj)
            Foren-Stylesheet Site Selfzeug JS-Lookup
            SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
            1. Mahlzeit Kai345,

              Keine Ahnung, ich klinke mich jetzt auch (vorerst) endgültig aus, mein Kopf platzt gleich.

              Trotzdem danke für die Hilfe!

              MfG,
              EKKi

              --
              sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Diese werden dann folgendermaßen in den HTML-Dokumenten eingebunden:

    Immer:

    <script type="text/javascript" src="foo.js"></script>

    Je nach Bedarf:

    <script type="text/javascript" src="bar.js"></script>

    bzw.

    <script type="text/javascript" src="baz.js"></script>

    Und jetzt treten - zumindest im IE6 [*] - Probleme auf:


    Zeile:   11
    Zeichen: 1
    Fehler:  'foo' ist undefiniert
    Code:    0

    Der Fehler weist (in der für den IE6 typischen Klarheit) auf die Zeile in der Datei "bar.js" hin, in der folgendes steht:


    foo.bar = {

    Ich gehe also davon aus, dass der IE6 die Datei "bar.js" geladen hat und ausführt, bevor er die Datei "foo.js" geladen und ausgeführt hat. In dem Fall existiert das Objekt "foo" natürlich noch nicht.

    Bist du sicher? soweit ich das in Erinnerung habe, sollte es so keine Probleme geben. Allerdings sind die Fehlermeldungen im IE ja leider nicht immer zielführend, diese Fehlermeldung tritt auch auf, wenn die JS Dateien eine falsche Zeichenkodierug verwenden, d.h. eine vom Hauptdokument unterschiedliche.

    Im Firefox scheint die Reihenfolge des Ladens und Ausführens diejenige zu sein, in der die Dateien auch im HTML-Dokument notiert sind - im IE6 offenbar nicht immer zwangsläufig.

    Das klingt zumindest so, als ob das Problem eben nicht daran liegt.

    Struppi.

    1. Mahlzeit Struppi,

      Ich gehe also davon aus, dass der IE6 die Datei "bar.js" geladen hat und ausführt, bevor er die Datei "foo.js" geladen und ausgeführt hat. In dem Fall existiert das Objekt "foo" natürlich noch nicht.

      Bist du sicher?

      Ja, ziemlich. Ich habe verschiedene Konstruktionen, Notationen und Reihenfolgen ausprobiert ... die Fehlermeldung tritt immer genau dann im IE auf, wenn ich den Quellcode wie beschrieben in zwei Dateien aufteile - ansonsten nicht. Die Fehlermeldung verweist auch immer auf genau diese Stelle, an der ja implizit davon ausgegangen wird, dass das Objekt "foo" bereits existiert.

      Wenn ich - wie von Kai345 vorgeschlagen - vor die Stelle eine Abfrage, ob das Objekt existiert, samt Neuanlage eines leeren Objekts im Fehlerfall einbaue, kommt die beschriebene Fehlermeldung nicht ... dann habe ich nur das Problem, dass dann die eigentliche Definition des Objekts "foo" in der Datei "foo.js" dann das Unterobjekt "foo.bar" wieder überschreibt.

      soweit ich das in Erinnerung habe, sollte es so keine Probleme geben.

      Das glaube ich Dir gern - leider jedoch habe ich die beschreiebenen Probleme (die IMHO darauf hindeuten, dass der IE6 die Dateien anders lädt und ausführt als der Firefox).

      Allerdings sind die Fehlermeldungen im IE ja leider nicht immer zielführend,

      Das ist zwar richtig, in diesem konkreten Fall halte ich sie jedoch für halbwegs hilfreich, da in betreffenden Zeile genau das steht, was auch zum Verhalten passt (mit einer entsprechenden Abfrage und einem expliziten Anlegen eines leeren Objekts vor der Stelle zeigt sich nämlich, dass nach dem Laden des kompletten Dokuments die in "foo.bar" definierten Methoden eben *nicht* zur Verfügung stehen - da die Neudefinition in "foo.js" offenbar das Objekt "foo" komplett überschreibt).

      diese Fehlermeldung tritt auch auf, wenn die JS Dateien eine falsche Zeichenkodierug verwenden, d.h. eine vom Hauptdokument unterschiedliche.

      Das mag sein - alle Dateien sind jedoch Windows-1252.

      Im Firefox scheint die Reihenfolge des Ladens und Ausführens diejenige zu sein, in der die Dateien auch im HTML-Dokument notiert sind - im IE6 offenbar nicht immer zwangsläufig.

      Das klingt zumindest so, als ob das Problem eben nicht daran liegt.

      Das mag sein - dann frage ich mich eben nur: woran sonst? Die Symptome deuten darauf hin ...

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      1. diese Fehlermeldung tritt auch auf, wenn die JS Dateien eine falsche Zeichenkodierug verwenden, d.h. eine vom Hauptdokument unterschiedliche.

        Das mag sein - alle Dateien sind jedoch Windows-1252.

        Das ist die schlechteste Wahl überhaupt.

        Ich bleibe bei meiner These, da ich dieses Problem noch im IE oder in einem anderen Browser hatte.

        Struppi.

        1. Mahlzeit Struppi,

          diese Fehlermeldung tritt auch auf, wenn die JS Dateien eine falsche Zeichenkodierug verwenden, d.h. eine vom Hauptdokument unterschiedliche.

          Das mag sein - alle Dateien sind jedoch Windows-1252.

          Das ist die schlechteste Wahl überhaupt.

          Ich weiß - ist aber Firmenpolitik. Wir haben fürs Intranet halt IIS-Server und hausweit IE6 als Browser. Im Sinne der Kompatibilität - insbesondere mit uuuuuralten Anwendungen - wurde "von oben" Windows-1252 festgelegt. Ich bin auch nicht glücklich damit ... aber was soll man tun?

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          1. Ich weiß - ist aber Firmenpolitik. Wir haben fürs Intranet halt IIS-Server und hausweit IE6 als Browser. Im Sinne der Kompatibilität - insbesondere mit uuuuuralten Anwendungen - wurde "von oben" Windows-1252 festgelegt. Ich bin auch nicht glücklich damit ... aber was soll man tun?

            OK, und du bist 100% sicher, dass ALLE Dateien in der gleichen Kodierung vorliegen?

            Struppi.

            1. Mahlzeit Struppi,

              OK, und du bist 100% sicher, dass ALLE Dateien in der gleichen Kodierung vorliegen?

              Ich habe mir gerade noch einmal die HTTP-Header von allen Dateien angeschaut. Das HTML-Dokument ist Windows-1252, die beiden .js-Dateien werden mit ISO-8859-1 ausgeliefert ... sollte aber eigentlich auch Windows-1252 sein.

              Komisch ist aber, dass die Probleme eben *nicht* auftreten, wenn ich nur *eine* .js-Datei habe.

              MfG,
              EKKi

              --
              sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    2. Mahlzeit Struppi,

      Ich gehe also davon aus, dass der IE6 die Datei "bar.js" geladen hat und ausführt, bevor er die Datei "foo.js" geladen und ausgeführt hat. In dem Fall existiert das Objekt "foo" natürlich noch nicht.

      Bist du sicher?

      Ich habe jetzt mal das Debugging im IE6 aktiviert und den Microsoft-Script-Debugger angeworfen ... an genau der Stelle:

      --------------------------------------------------
      foo.bar = {
      --------------------------------------------------

      bzw. alternativ

      --------------------------------------------------
      alert('in bar.js: ' + foo);
      --------------------------------------------------

      erscheint die Fehlermeldung:

      "Laufzeitfehler in Microsoft JScript: 'foo' ist undefiniert"

      Im Projekt-Explorer werden dabei die beiden eingebundenen .js-Dateien "foo.js" und "bar.js" angezeigt.

      Ich bin mir immer sicherer, dass der IE6 - aus welchem Grund auch immer - erst die Datei "bar.js" ausführt und genau deshalb die beschriebenen Fehler auftreten.

      Meine Frage bleibt also bestehen: kann ich dem IE6 sagen, in welcher Reihenfolge er die eingebundenen externen .js-Dateien laden und ausführen soll? Und wenn ja: wie?

      MfG,
      EKKi

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      1. Meine Frage bleibt also bestehen: kann ich dem IE6 sagen, in welcher Reihenfolge er die eingebundenen externen .js-Dateien laden und ausführen soll? Und wenn ja: wie?

        sie werden in der Reihenfolge eingebunden, wie sie im HTML Code eingebunden sind.

        Struppi.

        1. Mahlzeit Struppi,

          Meine Frage bleibt also bestehen: kann ich dem IE6 sagen, in welcher Reihenfolge er die eingebundenen externen .js-Dateien laden und ausführen soll? Und wenn ja: wie?

          sie werden in der Reihenfolge eingebunden, wie sie im HTML Code eingebunden sind.

          Der darin enthaltene Code wird aber offenbar nicht zwangsläufig in genau der Reihenfolge abgearbeitet ... denn der erste Fehler, der im IE6 auftritt, ist der, dass in Zeile 11 der Datei "bar.js" das Objekt "foo" nicht existiert.

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          1. Der darin enthaltene Code wird aber offenbar nicht zwangsläufig in genau der Reihenfolge abgearbeitet ...

            Ich hab's noch nicht anders gesehen

            Struppi.

            1. Mahlzeit Struppi,

              Der darin enthaltene Code wird aber offenbar nicht zwangsläufig in genau der Reihenfolge abgearbeitet ...

              Ich hab's noch nicht anders gesehen

              Genau das passiert aber offenbar bei mir ...

              Könnte es daran liegen, dass er vielleicht die Datei "bar.js" schneller lädt als die Datei "foo.js" und dann "einfach schonmal mit der anfängt, wenn die andere so lange braucht"?

              MfG,
              EKKi

              --
              sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      2. Ich bin mir immer sicherer, dass der IE6 - aus welchem Grund auch immer - erst die Datei "bar.js" ausführt und genau deshalb die beschriebenen Fehler auftreten.

        Kannst Du das verifizieren, indem Du z.B. am Anfang von foo.js alert('foo') und am Anfang von bar.js alert('bar') einsetzt?

        1. Mahlzeit Pragma,

          Ich bin mir immer sicherer, dass der IE6 - aus welchem Grund auch immer - erst die Datei "bar.js" ausführt und genau deshalb die beschriebenen Fehler auftreten.

          Kannst Du das verifizieren, indem Du z.B. am Anfang von foo.js alert('foo') und am Anfang von bar.js alert('bar') einsetzt?

          Gerne:

          foo.js:
          --------------------------------------------------

          alert('BEGINN foo.js');  
            
          // ...  
            
          var foo = {  
          // ...  
          }  
            
          // ...  
            
          alert('ENDE foo.js');
          

          --------------------------------------------------

          bar.js:
          --------------------------------------------------

          alert('BEGINN bar.js');  
            
          // ...  
            
          foo.bar = {  
          // ...  
          }  
            
          // ...  
            
          alert('ENDE bar.js');
          

          --------------------------------------------------

          Reihenfolge im Firefox (3.5.5):

          "BEGINN foo.js"
          "ENDE foo.js"
          "BEGINN bar.js"
          "ENDE bar.js"

          Reihenfolge im IE6:

          "BEGINN bar.js"

          "Es ist ein Laufzeitfehler aufgetreten
           Soll der Debugmodus gestartet werden?

          Zeile:  11
          Fehler: 'foo' ist undefiniert"

          Die Frage bleibt bestehen: wie kann ich dafür sorgen, dass der IE6 die eingebundenen Javascript-Dateien in der Reihenfolge abarbeitet, wie sie auch im HTML-Dokument definiert sind?

          MfG,
          EKKi

          --
          sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          1. Die Frage bleibt bestehen: wie kann ich dafür sorgen, dass der IE6 die eingebundenen Javascript-Dateien in der Reihenfolge abarbeitet, wie sie auch im HTML-Dokument definiert sind?

            Sie wird so abgearbeitet. Ich hab mein Beispiel nochmal modifiziert, die foo.js ist jetzt 200 KB gross, trotzdem funktioniert alles.

            Dein Problem hat eine andere Ursache.

            Struppi.

            1. Mahlzeit Struppi,

              Dein Problem hat eine andere Ursache.

              In der Tat - danke für die hartnäckige Hilfe ... :-)

              MfG,
              EKKi

              --
              sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  3. Mahlzeit Ingrid,

    Problem ist behoben - es handelte sich (mal wieder) um ein typisches PEBKAC-Problem.

    Es lag ein Fehler in der Datei "foo.js" innerhalb der Definition eines Unterobjekts von "foo" vor ... den Firefox offenbar geflissentlich übersehen bzw. ignoriert hat. Deswegen hat dort das Laden und Ausführen wunderbar funktioniert, das Objekt "foo" stand zur Verfügung und konnte in der Datei "bar.js" erweitert werden.

    Der IE6 hat sich in diesem Fall ausnahmsweise mal halbwegs richtig verhalten und den folgenden Code nicht einfach so hingenommen:

    foo.js:
    --------------------------------------------------

    var foo = {  
    // ...  
    // ...  
    }  
      
    foo.statusbar = {  
      icon: {  
        error:   'statusError.gif',  
        warning: 'statusWarning.gif',     // <--- dieses Komma ist natürlich falsch!  
      },  
      
    // ...  
    }
    

    --------------------------------------------------

    Destowegen hat er anscheinend den gesamten in der Datei "foo.js" enthaltenen Code verworfen (wobei ich das schon wieder fragwüdig finde - es hätte doch gereicht, die Definition des Unterobjekts "foo.statusbar" zu ignorieren) ... und in der Datei "bar.js" natürlich kein Objekt namens "foo" gefunden.

    Vielen Dank an die hilfreichen Mitdenker!

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. foo.statusbar = {
        icon: {
          error:   'statusError.gif',
          warning: 'statusWarning.gif',     // <--- dieses Komma ist natürlich falsch!
        },

      // ...
      }[/code]

      Ein altbekanntes Problem, des IE ob er sich da richtig verhält weiss ich nicht, aber in anderen Browsern und auch in anderen Sprachen ist es kein Syntaxfehler.

      Struppi.

      1. Mahlzeit Struppi,

        aber in anderen Browsern und auch in anderen Sprachen ist es kein Syntaxfehler.

        Wenn ich es abstrakt- bzw. umgangssprachlich betrachte, finde ich es zumindest merkwürdig, dass nach dem letzten Komma in einer Aufzählung kein Element mehr kommt, sondern das Ende der Aufzählung.

        Wenn ich einen Parser entwerfen würde, würde ich das als Fehler betrachten ...

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. Wenn ich einen Parser entwerfen würde, würde ich das als Fehler betrachten ...

          was mir gerade auffällt, ich bekomme zwei Fehlermeldungen im IE 6, wenn ich dein Problem nachbaue. Hast du die erste Meldung nicht bekommen?

          "Bezeichner, Zeichenfolge oder Zahl erwartet"

          Struppi.

          1. Mahlzeit Struppi,

            was mir gerade auffällt, ich bekomme zwei Fehlermeldungen im IE 6, wenn ich dein Problem nachbaue. Hast du die erste Meldung nicht bekommen?

            "Bezeichner, Zeichenfolge oder Zahl erwartet"

            Erst als ich mich in die Untiefen des Microsoft-Script-Debuggers vorgewagt habe und dort versucht, das Probleme näher zu analysieren - direkt im IE6 nicht.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            1. Erst als ich mich in die Untiefen des Microsoft-Script-Debuggers vorgewagt habe und dort versucht, das Probleme näher zu analysieren - direkt im IE6 nicht.

              Ach so - Ich lasse mir im IE alle Skriptfehler anzeigen in dem diese direkt aufpoppen. Normalerweise muss man durch die Fehlermeldungen irgendwie durchklicken, wenn es mehrere sind. Das wäre auf jedenfall hilfreicher gewesen, als deine Spekulationen.

              Struppi.

        2. [latex]Mae  govannen![/latex]

          Wenn ich es abstrakt- bzw. umgangssprachlich betrachte, finde ich es zumindest merkwürdig, dass nach dem letzten Komma in einer Aufzählung kein Element mehr kommt, sondern das Ende der Aufzählung.

          Wenn ich einen Parser entwerfen würde, würde ich das als Fehler betrachten ...

          ACK. Ein Array oder Objekt {"a","b",} bzw. ["a","b",] würde ich als Array/Objekt mit drei Elementen ansehen: a, b und einem undefinierten Element.

          Cü,

          Kai, knapp über eine Stunde gepennt und schon geht's wieder (halbwegs), Foren-Sucht ist stärker.

          --
          A workaround for an avoidable problem often adds clutter and overhead to the program which
          could have been avoided by not creating the problem in the first place.(Garrett Smith/clj)
          Foren-Stylesheet Site Selfzeug JS-Lookup
          SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
          1. Mahlzeit Kai345,

            Kai, knapp über eine Stunde gepennt und schon geht's wieder (halbwegs), Foren-Sucht ist stärker.

            Kaum warst Du nicht im Forum, konnte ich mein Problem selbst lösen ... ein Schelm, der Böses dabei denkt ... ;-)

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|