Günter Marchewka: externe .js-Dateien dynamisch einbinden

Liebe Forumer,

ich binde in eine HTML-Seite ca. 20 externe .js-Dateien ein. Den Code hatte ich bisher statisch und teilweise dynamisch hinterlegt. Alles funktioniert prima. Um die Wartbarkeit der Seiten zu erhöhen möchte ich die statisch hinterlegten Aufrufe ebenfalls dynamisch einbinden und kriege das nicht hin.
Die Dateien ipssystemf.js (definiert ein Array) und ipssystemd.js (schaufelt Daten in das Array) ersetzen die vielen statischen Aufrufe nach dem Muster <script... type... src...></script>. Deren Einbindung funktioniert.
Das anschliessende script mit der for-Schleife funktioniert.Die darin generierten Aufrufe für document.write führen nicht zu dem gewünschten Ergebnis. Die Fehlermeldungen sind schwanken zwischen "xx ist unbekannt" und "objekt erwartet".
Das anschliessende Script beginnend mit dem aufdröseln von window.name funktioniert, inklusive der darin generierten Aufrufe für document.write.
Warum funktioniert der erste Teil mit der for-Schleife nicht? Ich habe schon probiert, alle aufrufe die statisch waren so wie sie sind in eine externe .js-Datei zu packen, was überhaupt nicht ging. Das Auslagern der document.write-Aufrufe in eine externe .js-Datei führte auch nicht zum Erfolg.
Hier der Code, der nicht funktioniert:
<html>
<head>
<title>Projektdokumentation Arbeitsschritte</title>
<meta http-equiv="expires" content="0">
<script language="JavaScript1.1" type="text/javascript" src="ipsystemf.js">
</script>
<script language="JavaScript1.1" type="text/javascript" src="ipsystemd.js">
</script>

<script language="JavaScript1.1" type="text/javascript">
<!--

for (i=0;i<ips.length-1;i++)
     { alert('anzips=' + ips.length + ' i=' + i + ' name=' + ips[i].name);
       document.write('<script language="JavaScript1.1" type="text/javascript" src="' + ips[i].name + '"></script>');
     }
//-->
</script>
<script language="JavaScript1.1" type="text/javascript">
<!--
Wname = window.name.split('.');
if (2 != Wname.length)
   { alert(' Fehler!\n\n Falscher Programmaufruf!\n\n Bitte wenden Sie sich an Ihre Administration\n Der Eintrag in der Komponentendatei für die aufzurufende SOURCE ist fehlerhaft!');
     history.back();
   }
JSname = window.name;
var gefunden = '';
for (i=0;i<pa.length;i++)
     {
       if (pa[i].source == window.name)
          {
           gefunden = 'ja';
           if (pa[i].funktion) // Fehlen ist erlaubt
              { document.write('<script language="JavaScript1.1" type="text/javascript" src="' + pa[i].funktion + '"></script>');
              }
           if (pa[i].konfig) // Fehlen ist erlaubt
              { document.write('<script language="JavaScript1.1" type="text/javascript" src="' + pa[i].konfig + '"></script>');
              }
           document.write('<script language="JavaScript1.1" type="text/javascript" src="' + pa[i].source + '"></script>');
           if (pa[i].titel) document.title= pa[i].titel;
          }
     }
  if (!gefunden) // DivAuswahl generiert die Aufrufe. Fehler kann in der Verwendung unterschiedlicher partikeld.je-Dateien liegen.
     {
       alert('Oh, was ist passiert?\n\n Hatten sie diese Seite in Ihre Favoriten aufgenommen (gebookmarked)??\n\n Das funktioniert leider nicht.\n\n Sie kommen jetzt zur Startseite. Falls Sie diese Seite über die Favoriten aufgerufen haben,\n können Sie sie von dort aus neu aufrufen.\n\n Das war nicht der Fall? Dann haben wir eine\n\n Katastrophe!\n\n Fehlfunktion im Script DivAuswahl!\n\n Bitte wenden Sie sich an Ihre Administration\n Die Programmlogik ist zu überprüfen!');
       window.location.href="iprojekt.html";
     }

//-->
</script>
Vielen Dank für das Interesse
Grüsse Günter

  1. Hallo auch!!!

    Ich habe auch mal lange experimentiert, und bin doch hinter eine Lösung gekommen =)

    Der Ansatz
    document.write('<script language="JavaScript1.1" type="text/javascript" src="' + ips[i].name + '"></script>');

    ist an sich schon richtig ;)

    Dennoch habe ich gemerkt, dass der Browser den letzten Abschnitt (</script>) als Script-Ende interpretiert, und daher mit einer Fehlermeldung abbricht.

    Das hier sollte Abhilfe schaffen:
    document.write('<script language="JavaScript1.1" type="text/javascript" src="' + ips[i].name + '"></scr'+'ipt>');

    Wichtig ist der letzte Teil: Trenne das </script>-Tag auf, beliebig. Das ist nur eine Idee. Nur ganz darf er nie sein.

    Ob dein Script jetzt funktioniert weiss ich nicht, weil ich das weiter nicht ausprobiert habe, aber ich denke, das hilft Dir weiter.

    Gruß
    Thomas J.

    1. Hallo Thomas !!!

      Dennoch habe ich gemerkt, dass der Browser den letzten Abschnitt (</script>) als Script-Ende interpretiert, und daher mit einer Fehlermeldung abbricht.

      Das hier sollte Abhilfe schaffen:
      document.write('<script language="JavaScript1.1" type="text/javascript" src="' + ips[i].name + '"></scr'+'ipt>');

      Danke für den Tip, wenn er auch kein anderes Ergebnis produziert, der Fehler bleibt der gleiche.
      Auch das Trennen des öffnenden script tags ändert nichts.
      Da das dynamische Einbinden über die anderen document.write-Anweisungen im folgenden Teil des Codes funktionieren, hätte mich das auch gewundert.

      Viele Grüße
      Günter

      1. Hallo mal wieder,

        es interessiert mich schon etwas, da die mögliche Lösung nicht funktioniert hat =)

        nochmal ein auszug:
        for (i=0;i<ips.length-1;i++)
             { alert('anzips=' + ips.length + ' i=' + i + ' name=' + ips[i].name);
               document.write('<script language="JavaScript1.1" type="text/javascript" src="' + ips[i].name + '"></script>');
             }

        ist es das, was nicht so recht funktioniert?
        ich nehme an, "ips" ist ein Array?

        wenn ja, wie sieht es aus, und was ist dann ips[i].name? Willst du den wert des Arrays? Denn nach meiner Erfahrung haben die Arrayfelder kein "name".

        Gruß
        Thomas

        1. Hi!

          wenn ja, wie sieht es aus, und was ist dann ips[i].name? Willst du den wert des Arrays? Denn nach meiner Erfahrung haben die Arrayfelder kein "name".

          Auch ich sehe hier ein Problem:

          "name" ist ein geschütztes Wort, versuch's mal mit "quelle" oder so.

          Ulixes

          1. Hi Thomas, Ulixes!

            wenn ja, wie sieht es aus, und was ist dann ips[i].name? Willst du den wert des Arrays? Denn nach meiner Erfahrung haben die Arrayfelder kein "name".

            Auch ich sehe hier ein Problem:

            "name" ist ein geschütztes Wort, versuch's mal mit "quelle" oder so.

            Ihr habt es korrekt erkannt. ips ist ein Array und name ist ein Feld in diesem Array. Die Verwendung von name schafft keine Probleme. Mit dem eingebauten alert kann ich sehen, dass die Werte aus dem Array korrekt ausgelesen und die for-Schleife vollständig durchlaufen wird, mit der entsprechend korrekten Generierung der document.write-Anweisungen. Die for-Schleife bricht nicht ab. Nach einem debugging des gesamten Codes habe ich nur herausfinden können, daß eine später aufgerufene Funktion eine Funktion nicht findet, die in einem der externen .js-Dateien enthalten ist.
            Ich habe jetzt viel probiert, auch mit setTimeout ohne Erfolg.
            Was mich wundert, ist daß ein dynamisches Einbinden über die for-Schleife nicht funktioniert, wohl aber das dynamische Einbinden ein paar Zeilen später.
            Ein merkwürdiges Ergebnis habe ich noch produzieren können, das ich aber überhaupt nicht nachvollziehen kann. Die Schritte zum Einbinden sind jetzt in separaten <script>-Bereichen definiert. Wenn man sie in einen gemeinsamen Bereich schreibt, wird die for-Schleife korrekt abgearbeitet, aber der zweite Teil des dynamischen Einbindens bricht sofort ab, weil der angesprochende Array nicht gefunden wird.
            Danke für eure Ideen!
            Vielleicht fällt Euch noch etwas ein. Ich versuche es weiter...
            Grüsse Günter

  2. Liebe Forumer,
    Vielen Dank für das Interesse und ein dickes mea culpa!
    Der Code war 100% korrekt und funktioniert wie er soll. Der Fehler lag in der Begrenzung der for-Schleife. Statt ips.length-1 muss es heissen ips.length.
    Ich muss wohl den Lehrgang "Programmieren für Anfänger" noch einmal besuchen...
    Grüsse Günter

    1. Hallo Günter,

      ja, natürlich nimmt man ja an, dass eine offensichtliche Schleife bis ips.length-1 so sein soll, wie sie ist :) aber gut...

      übrigens weiss ich nun, warum ich den fehler mit dem mit "document.write" geschriebenen </script>-Tag bekomme :)

      Es wird wohl mein Editor sein, der, sobald er </script> findet, einfach die farbliche hervorhebung des Script-Bereichs abschließt und den eindruck hinterläßt, der Tag wäre falsch. Den Browser scheint es dennoch nicht zu stören, was irgendwo logisch ist =)

      Gruß
      Thomas J.

      1. Hallo Thomas,

        ja, natürlich nimmt man ja an, dass eine offensichtliche Schleife bis ips.length-1 so sein soll, wie sie ist :) aber gut...

        Tja, das habe ich auch gedacht, man darf eben seiner eigenen Programmierung nicht trauen :)

        übrigens weiss ich nun, warum ich den fehler mit dem mit "document.write" geschriebenen </script>-Tag bekomme :)

        Und ich habe gelernt, daß der <script>-Bereich zum dyn.Einbinden separiert sein muß von der folgenden Verarbeitung, so hat das ganze doch etwas Gutes gehabt.

        Gruß
        Günter
        P.S. Vielleicht mach ich ja mal wieder so einen tollen Fehler und frag dann nach;-)