Flo: Funktionsaufruf via Link

Hi,

bei dem Skript unten steh ich inzwischen vollkommen auf dem Schlauch. Die Variablenbelegung über den Funktionsaufruf im script-tag funktioniert soweit. Übergebe ich die Werte allerdings über einen Link, hakt der FF in der zweiten for-Schleife (index is not defined). Der IE nimmt zwar die zweite for-Schleife noch mit, gibt dann aber nach einem zweiten Aufruf über einen Link nichts weiter. Ich kapiers nicht, nicht einmal soweit dass ich wüsste wonach ich genau googeln soll.

Danbar für jeden Tipp...

Flo

<html>
<head>

<script type="text/javascript">

index = new Array ();

index["home"] = new Array("Enzyclopaedien", "Editorial");
 index["Enzyclopaedien"] = new Array("ECO","OCB");
 index["ECO"] = new Array("A", "B", "C", "D", "E");
 index["Editorial"] = new Array();

var linkI   = "<a href="javascript:seti('";
  var linkII  = "')">";
  var linkIII = "</a></br>";

function seti(menue) {

for (i in index)

{ if ( i==menue)
  { document.write(i+'</br><ul>');
  { for (j in index[i])
  { document.write(linkI+index[i][j]+linkII+index[i][j]+linkIII); }
          document.write('</ul>'); }
  } } }

</script>
 </head>

<body>

<script>
  seti('home');
  </script>

</body>
 </html>

  1. Hallo,

    bei dem Skript unten steh ich inzwischen vollkommen auf dem Schlauch. Die Variablenbelegung über den Funktionsaufruf im script-tag funktioniert soweit.

    Ja und erzeugt beim rendern durch den Browser folgendes HTML

    <html><head>
     <script type="text/javascript">
     index = new Array ();
     index["home"] = new Array("Enzyclopaedien", "Editorial");
     index["Enzyclopaedien"] = new Array("ECO","OCB");
     index["ECO"] = new Array("A", "B", "C", "D", "E");
     index["Editorial"] = new Array();

    var linkI   = "<a href="javascript:seti('";
      var linkII  = "')">";
      var linkIII = "</a></br>";

    function seti(menue) {

    for (i in index)

    { if ( i==menue)
      { document.write(i+'</br><ul>');
      { for (j in index[i])
      { document.write(linkI+index[i][j]+linkII+index[i][j]+linkIII); }
              document.write('</ul>'); }
      } } }

    </script></head><body>

    <script>
      seti('home');
      </script>

    home<br>
      <ul>
       <a href="javascript:seti('Enzyclopaedien')">Enzyclopaedien</a>
       <br>
       <a href="javascript:seti('Editorial')">Editorial</a>
       <br>
      </ul>
     </body>
    </html>

    Abgesehen davon, dass diese Elementverschachtelung UL-A-BR-/UL unsinnig ist, wird bei einem Klick auf einen der Links mit document.write immer ein _neues_ Dokument beschrieben. Das alte Dokument geht dabei verloren. Nach Klick auf 'Enzyclopaedien' steht z.B. im Dokument dann nur noch folgendes:

    <html><head></head>
    <body>
    Enzyclopaedien
    <br>
    <ul>
    <a href="javascript:seti('ECO')">ECO</a>
    <br>
    <a href="javascript:seti('OCB')">OCB</a>
    <br>
    </ul>
    </body>
    </html>

    Das SCRIPT-Element mit der Funktion seti() ist damit Geschichte und nicht mehr greifbar. Ein Klick auf 'ECO' ergibt:

    Fehler: seti is not defined
    Quelldatei: javascript:seti('ECO')
    Zeile: 1

    Übergebe ich die Werte allerdings über einen Link, hakt der FF in der zweiten for-Schleife (index is not defined). Der IE nimmt zwar die zweite for-Schleife noch mit, gibt dann aber nach einem zweiten Aufruf über einen Link nichts weiter.

    Ja, dann wird sofort ein neues Dokument beschrieben und das SCRIPT-Element ist weg.

    Ich kapiers nicht, nicht einmal soweit dass ich wüsste wonach ich genau googeln soll.

    Das, was Du machen willst, geht so nicht. Der beste Weg wäre eine serverseitige Programmlogik zum Erzeugen der unterschiedlichen HTML-Dokumente zu nutzen.

    Mit JavaScript musst Du dafür sorgen, dass das SCRIPT-Element erhalten bleibt. Das SCRIPT muss in einem Dokument stehen, welches in einem anderen Fenster(window) dargestellt wird, als das Dokument, welches vom SCRIPT aus per document.write beschrieben wird. Das würde in einem Frameset der Fall sein, in dem das SCRIPT im Frameset-Dokument(parent) steht und das document.write die Inhalte jeweils in einen Frame schreibt. Das ist zweifach nachteilig. Es setzt Frames und JavaScript voraus.

    viele Grüße

    Axel

  2. Hallo Flo,

    ich muss ehrlich sagen, ich habe nicht begriffen, was du mit dem Script und seinem Drumherum wirklich vorhast. Also versuche ich mal, an einzelnen Ecken anzusetzen, in der Hoffnung, dass dir das hilft.

    for (i in index)
      { if ( i==menue)
      { document.write(i+'</br><ul>');
      { for (j in index[i])
      { document.write(linkI+index[i][j]+linkII+index[i][j]+linkIII); }
              document.write('</ul>'); }
      } } }

    Dieser Abschnitt kommt mir "böse" vor. Erstens hast du eine sehr unübersichtliche Art, Klammern zu setzen (die vor dem zweiten for-Statement ist sogar überflüssig), und zweitens rufst du hier document.write() in einer Funktion auf, *nachdem* das Dokument schon fertig geladen ist. Damit überschreibst du das komplette Dokument! Ich vermute, das ist dein Hauptproblem.

    Wenn du Teile des Dokuments dynamisch ersetzen und umbauen willst, musst du stattdessen über DOM-Methoden (getElementBy..., createElement, replaceChild, etc.) und/oder innerHTML den Elementbaum modifizieren.

    So long,
     Martin

    --
    Ich stehe eigentlich gern früh auf.
    Außer morgens.
  3. <html>
    <head>

    <script type="text/javascript">

    index = new Array ();

    das ist kein Array, das ist ein Object!

    var index = new Object ();

    index["home"] = new Array("Enzyclopaedien", "Editorial");
    index["Enzyclopaedien"] = new Array("ECO","OCB");
    index["ECO"] = new Array("A", "B", "C", "D", "E");
    index["Editorial"] = new Array();

    var linkI   = "<a href="javascript:seti('";
      var linkII  = "')">";
      var linkIII = "</a></br>";

    Du willst eine JS Funktion aufrufen, dann brauchst du auch keinen Link, nimm irgendein passendes Element und setzt den onclick Event.

    ...

    { document.write(i+'</br><ul>');
      { for (j in index[i])

    Einmal würde ich immer ein var benutzen um die Variabeln lokal zu machen. Globale Schleifenvariabeln können tödlich sein, das sind typische Fehler die man nur schwer findet. Ausserdem ist index[i] ein Array, da ist es besser eine for() Schleife zu verwenden.

    Dein Problem ist aber eher, dass du mit document.write() das Dokument komplett neu schreibst und dann die Funktion seti() nicht mehr da ist, dass ist zumindest die Fehlermledung die ich erhalte.

    Struppi.

    --
    Javascript ist toll (Perl auch!)