mir: Nach Klick ist JS nicht mehr definiert

Hallo!

Ich habe schon ein wenig rumgegoogelt, aber zu meinem Problem leider keine Lösung gefunden...
Folgendes:

So ist meine HTML-Datei (ungefähr) aufgebaut:
<html>
<head></head>

<body>

<script type="text/javascript">
function aendere(div_id)
{
  ...
}

function initialisiere()
{
   ...
}

document.write("Überschrift<br>");
document.write("<input type="checkbox" name="menu">Anhaken!<br>")
<<<<XXXX>>>>
</script>

</body>
</html>

"initialisiere" ruft eine andere Funktion auf, die etwas ins Dokument schreibt (diverse div's mit ID) und "aendere" wechselt die Anzeigeart (von "none" zu "inline" und umgekehrt) des div's mit der übergebenen ID. "aendere" wird per <a href="javascript:aendere(div_id)"> aus dem generierten (!) Dokument aufgerufen.

Beim XXXX habe ich zwei verschiedene Dinge ausprobiert:
1: Ich habe einfach "initialisiere()" in den Code reingeschrieben.
Das funktioniert zwar, aber der Benutzer soll vorher auf nen Button oder nen Link draufklicken, bevor es weiter geht.
2: Ich habe einen Button oder einen Link (wie das "a href=" oben) angelegt.
Wenn ich jetzt aber auf den Link klicke, der "aendere" aufruft, dann meldet mir der Firefox immer, dass "aendere" undefiniert sei.

ich vermute, dass das eben an diesem "klicken" mit der Maus zusammenhängt, weiß aber noch nicht, wie ich das umgehen kann...

Habt ihr da eine Idee?

  1. Moin

    hast du eventuell mal etwas vollständigeren Code?

    Gruß
    rfb

    --
    Man kann einen Menschen nichts lehren, man kann ihm nur helfen, es selbst zu entdecken.
    (Galileo Galilei)
    1. Moin

      hast du eventuell mal etwas vollständigeren Code?

      Klar:

      <html>
      <head>
      <title>0.4-devel</title>
      </head>
      <body>

      <script type="text/javascript">

      var Ebene = 1;

      function changestatus(layerName)
      {
          if (document.getElementById(layerName).style.display == "none")
          {
            showLayer(layerName);
          } else
          {
            hideLayer(layerName);
          }
      }

      function hideLayer(layerName) {
         document.getElementById(layerName).style.display = "none";
      }
      function showLayer(layerName) {
         document.getElementById(layerName).style.display = "inline";
      }

      function aufbau(id1, id2, currentEbene)
      {
        document.write("<a href="javascript:changestatus('eindiv')">Anzeigen/Verbergen</a><br>");
        document.write("<div id="eindiv">Ich bin der Inhalt eines DIVs!</div>");
      }

      function initAufbau()
      {
          changestatus('menu');
          aufbau(-1, -1, Ebene);
      }

      document.write("<div id="menu">");
      document.write("<h1>Überschrift!</h1><br><br>");
      document.write("<input type="checkbox" name="menu">Menü<br></div>");
      // document.write("<br><br><br><a href="javascript:initAufbau()">Anzeigen!</a>");
      //initAufbau();
      </script>

      </body>
      </html>

      Wie du an den übergebenen Parametern sehen kannst, ist das Ganze noch stark vereinfacht, aber ich wollte hier keine 900 Zeilen posten :)
      Das Prinzip (welches man an dieser Vereinfachung aber gut erkennen kann) bleibt das gleiche, da der Rest direkt aus dem Skript kopiert wurde.
      Ich habe hier erstmal beide Aufrufe auskommentiert.

      Danke schonmal für deine Hilfe!

      1. Moin

        Due Funktion

        function aufbau(id1, id2, currentEbene)
        {
          document.write("<a href="javascript:changestatus('eindiv')">Anzeigen/Verbergen</a><br>");
          document.write("<div id="eindiv">Ich bin der Inhalt eines DIVs!</div>");

        schreibt direkt in die Seite. Wenn du das nach dem Laden der Seite machst wird dadurch der bisher dort stehende Quellcode komplett gelöscht.
        Als Alternative empfehle ich dir die Methoden des DOM zur Seitenmanipulation.

        Gruß
        rfb

        --
        Man kann einen Menschen nichts lehren, man kann ihm nur helfen, es selbst zu entdecken.
        (Galileo Galilei)
        1. Moin

          Due Funktion

          [..]

          schreibt direkt in die Seite. Wenn du das nach dem Laden der Seite machst wird dadurch der bisher dort stehende Quellcode komplett gelöscht.

          Hallo!

          Ich zitiere mal: "Das document-Objekt bezieht sich auf den Inhalt, der in einem Browser-Fenster angezeigt wird." (http://de.selfhtml.org/javascript/objekte/document.htm#allgemeines)

          Warum wird da der Quelltext gelöscht? In meinem Skript benutze ich ca.  ...  10000 mal document.write und da wird nichts überschrieben, schon gar kein Quellcode!
          Warum passiert das, wenn ich einen Link benutze?

          Als Alternative empfehle ich dir die Methoden des DOM zur Seitenmanipulation.

          Meinst du die ganzen createElement() und appendChild() Sachen? Wenn ja, wäre das ein Alternative, aber irgendwie kann ich da nur einzelne Elemente (wie z.B. DIVs) anlegen, aber denen nicht gleichzeitig eine ID zuweisen und das macht diese Herangehensweise für mich leider unbrauchbar...

          Außerdem fehlt ja auch nur diese EINE Funktion. Alle anderen, die ich der Übersich halber weggelassen habe, funktionieren noch (die machen im Prinzip auch alle document.write).

          Ich habe mich jetzt erstmal damit beholfen, diese Funktion nochmal manuell in das Dokuement reinzuschreiben. Jetzt zeigt der Firefox, obwohl das Dokument komplett geladen ist, immer noch an, dass was geladen wird, aber das ist Quatsch. Der IE macht's richtig...

          Naja...

          1. Warum wird da der Quelltext gelöscht? In meinem Skript benutze ich ca.  ...  10000 mal document.write und da wird nichts überschrieben, schon gar kein Quellcode!
            Warum passiert das, wenn ich einen Link benutze?

            Weil document.write() nach dem laden der Seite den Dokumenten Inhgakrt überschreibt.

            Meinst du die ganzen createElement() und appendChild() Sachen? Wenn ja, wäre das ein Alternative, aber irgendwie kann ich da nur einzelne Elemente (wie z.B. DIVs) anlegen, aber denen nicht gleichzeitig eine ID zuweisen und das macht diese Herangehensweise für mich leider unbrauchbar...

            Wozu brauchst du eine ID?
            Aber selbst wenn, natürlich kann du denen auch eine ID zuweisen.

            Ich habe mich jetzt erstmal damit beholfen, diese Funktion nochmal manuell in das Dokuement reinzuschreiben. Jetzt zeigt der Firefox, obwohl das Dokument komplett geladen ist, immer noch an, dass was geladen wird, aber das ist Quatsch. Der IE macht's richtig...

            Wenn der IE etwas vermeintlich richtig macht kannst du davon ausgehen, dass es in 90% der Fällen falsch ist, es fehlt einfach ein document.close();

            Struppi.

            --
            Javascript ist toll (Perl auch!)
          2. Moin

            Meinst du die ganzen createElement() und appendChild() Sachen? Wenn ja, wäre das ein Alternative, aber irgendwie kann ich da nur einzelne Elemente (wie z.B. DIVs) anlegen, aber denen nicht gleichzeitig eine ID zuweisen und das macht diese Herangehensweise für mich leider unbrauchbar...

            Quatsch, natürlich geht das.
            Ich nutze dazu meist solch eine Funktion:

            function neuElement(t) {  
            var knoten=document.createElement(t);  
            var s=new RegExp("(\\w*)=(.+)");  
            for (var i=1;i<arguments.length;i++) {  
            var a=s.exec(arguments[i]);  
            if (a[1]=="text") knoten.appendChild(document.createTextNode(a[2]));  
            else knoten[a[1]]=a[2];  
            }  
            return knoten;  
            }
            

            Aufruf mit zB.:
            var a=neuElement("a", "href=irgendwo.htm", "id=linky", "text=Linktext", "class="Linkklasse");
            Anschließend mit sonstwo.appendChild(a) an der gewünschten Stelle einhängen.

            Gruß
            rfb

            --
            Man kann einen Menschen nichts lehren, man kann ihm nur helfen, es selbst zu entdecken.
            (Galileo Galilei)
      2. Hallo mir.

        Moin

        hast du eventuell mal etwas vollständigeren Code?

        Klar:

        <html>
        <head>
        <title>0.4-devel</title>
        </head>
        <body>

        <script type="text/javascript">

        var Ebene = 1;

        function changestatus(layerName)
        {
            if (document.getElementById(layerName).style.display == "none")
            {
              showLayer(layerName);
            } else
            {
              hideLayer(layerName);
            }
        }

        function hideLayer(layerName) {
           document.getElementById(layerName).style.display = "none";
        }
        function showLayer(layerName) {
           document.getElementById(layerName).style.display = "inline";
        }

        function aufbau(id1, id2, currentEbene)
        {
          document.write("<a href="javascript:changestatus('eindiv')">Anzeigen/Verbergen</a><br>");
          document.write("<div id="eindiv">Ich bin der Inhalt eines DIVs!</div>");
        }

        function initAufbau()
        {
            changestatus('menu');
            aufbau(-1, -1, Ebene);
        }

        document.write("<div id="menu">");
        document.write("<h1>Überschrift!</h1><br><br>");
        document.write("<input type="checkbox" name="menu">Menü<br></div>");
        // document.write("<br><br><br><a href="javascript:initAufbau()">Anzeigen!</a>");
        //initAufbau();
        </script>

        </body>
        </html>

        „<a href="javascript:initAufbau()">Anzeigen!</a>“
          → initAufbau()
            → aufbau(-1, -1, Ebene);
              → „document.write("<a href="javascript:changestatus('eindiv')">Anzeigen/Verbergen</a><br>");“

        Mit letzterem überschreibst du das komplette aktuelle Dokument. Dass hiernach der nicht mehr vorandene JS-Code Probleme macht, dürfte ersichtlich sein.

        Du solltest document.write gänzlich begraben und dich mit den heute <http://de.selfhtml.org/javascript/objekte/document.htm@title=üblichen Zugriffsmethoden auf Elementobjekte> (getElement*) befassen.

        Einen schönen Montag noch.

        Gruß, Mathias

        --
        ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
        debian/rules