Hans-Jürgen: Globale Variable nichts geht mehr

Hallo,
bin ich wirklich so doof? Ich versuche seit 2 Wochen ein kleines Programm zusammenzuzimmern, aber der PC spielt nur mit mir herum und lacht sich kaputt. Das Programm macht ALLES - nur nicht das, was ich will.

Hoffentlich kann jemand helfen.

Bis denne
Hajo
---------------------------
Hier der Code:

  
<html>  
<head>  
<title></title>  
</head>  
<body>  
  
<script type="text/javascript">  
var Antwort;  
var modus;  
  
  
//Die richtige Lösung wird im Nur-Lese-Modus angezeigt  
function AntwortenAnzeigen() {  
   alert("AntwortenAnzeigen. Modus = " + modus + "Antwort = " + Antwort);  
      document.write('<input type="Text" size=' + Antwort.length + ' maxlength=' + Antwort.length + ' value=' + Antwort +' readonly>');  
}  
  
//Alle Eingabefelder werden gelöscht  
function AntwortenLoeschen() {  
  alert("Antworten werden gelöscht. Modus = " + modus + "Antwort = " + Antwort);  
     document.write('<input type="Text" name="1" size=' + Antwort.length + ' maxlength=' + Antwort.length + ' value="..."' );  
}  
  
//Statistik: richtig/fasch/ungelöst  
function kontrollieren() {  
  alert("Hier werden die Antworten kontrolliert");  
}  
  
//Meldung für Vollbildmodus ausgeben  
function Vollbildmodus() {  
 alert("Bitte drücken Sie die Taste [F11] um vom/zum Vollbildmodus zu wechseln.");  
}  
  
//Eingabefelder werden durch Unterstriche ersetzt (zum Ausdrucken als Kopervorlage für schriftliche Arbeiten)  
function Arbeitsblattvorlage() {  
  var Ausgabe = "-"  
  var i = 1;  
  while (i <= 4){  
   Ausgabe = Ausgabe + "__";  
   i++;  
  }  
  document.write(Ausgabe);  
  alert(Ausgabe);  
}  
  
//Meldefenster, Dokumentation, Hilfe  
function Hinweise() {  
  alert("Hinweise: Hier folgen einige Hinweise");  
}  
  
//Meldefenster Programmversion  
function Info() {  
  alert("Info: Hier folgen Informationen zum Programm");  
}  
  
function interaktiv() {  
alert("Funktion interaktiv. Modus = " + modus);  
    //Aufruf der Funktionen abhängig vom Modus  
    switch(modus) {  
 case "AntwortenAnzeigen":  
  AntwortenAnzeigen();  
    break;  
 case "AntwortenLoeschen":  
  AntwortenLoeschen;  
    break;  
 case "kontrollieren":  
  kontrollieren();  
    break;  
 case "Vollbildmodus":  
  Vollbildmodus();  
    break;  
 case "Arbeitsblattvorlage":  
  Arbeitsblattvorlage();  
    break;  
 default:  
  alert("Fehler: Modus unbekannt");  
 break;  
  }  
}  
  
function Moduswechsel(NeuerModus) {  
 modus = NeuerModus;  
}  
  
</script>  
  
Menue:<br>  
<a href="#" onclick="Moduswechsel('AntwortenAnzeigen')">Antworten anzeigen</a>  
<a href="#" onclick="Moduswechsel('AntwortenLoeschen')">Antworten löschen</a>  
<a href="#" onclick="Moduswechsel('kontrollieren')">kontrollieren</a>  
  
<a href="#" onclick="Moduswechsel('Vollbildmodus')">Vollbildmodus</a>  
<a href="#" onclick="Moduswechsel('Arbeitsblattvorlage')">Arbeitsblattvorlage</a>  
<a href="#" onclick="Moduswechsel('Hinweise')">Hinweise</a>  
<a href="#" onclick="Moduswechsel('Info')">Info</a>  
  
<p>Fülle alle Lücken aus:<br>  
<br>5 + 5 = <script type="text/javascript">Antwort="10";interaktiv();</script>  
<br>2 * 20 = <script type="text/javascript">Antwort="40";interaktiv();</script>  
  
<br>120 + 30 = <script type="text/javascript">Antwort="150";interaktiv();</script>  
</body>  
  
</html>  
  

  1. Hallo,

    und wir sollen uns aus der Nase ziehen, was hier schief läuft !?
    sag mal ein paar mehr Details --> WAS läuft schief, WAS willst du überhaupt erreichen?

    MfG. Christoph Ludwig

    --
    Wo die Sprache aufhört, fängt die Musik an...
    Selfcode:  ie:( fl:| br:^ va:| ls:/ fo:| rl:? n4:) ss:) de:] js:) ch:{ sh:) mo:) zu:)
    Go to this
    1. Hallo,

      und wir sollen uns aus der Nase ziehen, was hier schief läuft !?
      sag mal ein paar mehr Details --> WAS läuft schief, WAS willst du überhaupt erreichen?

      MfG. Christoph Ludwig

      Hallo Christoph,

      naja, nicht wirklich. Ich habe mir schon viele Gedanken gemacht (siehe Antwort für Mathias). Habe auch nur die gekürzte Version gemailt damit es nicht zu unübersichtlich ist und Kommentare eingefügt.

      Zu den richtigen Problemen:

      • der HTML-Code soll wirklich nur aus "5 + 5 = ((10))" usw. bestehen und nicht aus
        5 + 5 = <script type="text/javascript">Antwort="10";interaktiv();</script>
        damit der Lehrer seinen Code erkennt.
        (D. h. zum Programmanfang müsste der Quellcode auf "((" und "))" durchgesehen werden und ersetzt werden:
        "((" durch <script type="text/javascript">Antwort="
        "))" durch ";interaktiv();</script>

      Dann werde ich, fürchte ich, nicht um ein Array herumkommen um die Statistik zu erstellen.

      Aber das kriege ich schon hin. Das Problem ist nicht der Code, sondern die Syntax.

      Nur, da bin ich noch nicht.

      Gruß
      Hans-Jürgen

  2. Das Programm macht ALLES - nur nicht das, was ich will.

    Aus deinem Code werde ich nicht schlau. Sieht ehrlich gesagt aus wie Kraut und Rüben. Erzähle uns doch mal detailliert, was du willst und was das Programm bisher macht.
    Willst du, dass beim Klicken auf einen Moduswechsel-Link das Dokument neu erzeugt werden soll, also die eingebetteten Scripte erneut aufgerufen werden? interaktiv wird derzeit nur einmal aufgerufen, nämlich beim Laden des Dokuments, wenn der Browser das erste Mal auf die script-Elemente trifft. Zu der Zeit dürfte modus nicht gesetzt sein, also müsste die Funktion "Fehler: Modus unbekannt" ausgeben. Und wenn du später den Modus wechselst, passiert logischerweise nichts - schließlich wird nur eine Variable geändert und nicht interaktiv aufgerufen. Und letztlich ist dieses Konzept auch unmöglich, weil du document.write nicht nach dem Laden des Dokuments verwenden kannst.
    Aber erkläre wie gesagt mal, was du vorhast, bevor ich mir einen Wolf mutmaße.

    Mathias

    1. Hallo Mathias,
      im Prinzip ist die Idee ganz einfach:
      Der Lehrer schreibt eine Arbeit:
      5 + 5 = ((10))
      3 * 3 = ((9))
      usw.

      Der Schüler soll anhand der Lektion am PC getestet werden.
      d. h. er hat verschieden Möglichkeiten (z. Zt. href-Tags):

      • AntwortenAnzeigen ergibt 5 + 5 = 10, 3 * 3 = 9
      • AntwortenLoeschen ergibt 5 + 5 = .., 3 * 3 = ..
      • kontrollieren (Statistik mache ich später)
      • Arbeitsblattvorlage ergibt 5 + 5 = __, 3 * 3 = __

      (Die Arbeitsblattvorlage ersetzt die Antwort nur durch Unterstriche, damit man die Seite für schriftliche Arbeiten ausdrucken kann).

      Da ich keinen Spaghetticode entwickeln wollte, habe ich die Variable "modus" eingefügt, die über die Funktion "interaktiv" die weiteren Unterprogramme/Funktionen aufrufen soll.

      Ich habe die Funktion "interaktiv" und "Moduswechsel" ans Programmende gesetzt, weil dort die anderen Funktionen schon bekannt sind.

      Aber irgendwie klappt es nicht. Das Programm vergisst den Inhalt der Variable modus, ich komme nicht in die Funktionen hinein.

      Viele Grüße
      Hans-Jürgen

      1. im Prinzip ist die Idee ganz einfach:

        Gut, das dachte ich mir schon. Dazu habe ich bereits einiges geschrieben, führe dir das mal bitte zu Gemüte.

        Das Programm vergisst den Inhalt der Variable modus, ich komme nicht in die Funktionen hinein.

        Wie gesagt ist dein Konzept für deine Aufgabenstellung völlig ungeeignet. modus ist anfangs leer, daher passiert beim Laden der Seite nichts außer der besagten Fehlermeldung. Und wenn du später den Modus änderst, passiert ebenfalls nichts - die Seite wird nicht neu aufgebaut, der JavaScript-Code in den script-Elemente werden nicht erneut ausgeführt, nur weil du eine Variable änderst.

        Wenn du den Inhalt von Elementen dynamisch ändern willst - und zwar nach, nicht während dem Laden des Dokuments - dann benutze das DOM, z.B. document.getElementById("...").innerHTML.
        Im HTML stellst du ein leeres Gerüst zur Verfügung. Dieses wird dann nach dem Laden (onload) mit Werten gefüllt - je nach Modus. Und wenn sich der Modus ändert, dann stößt du dieses »Befüllen« erneut an.

        Mathias

        1. Hallo Mathias,

          Wenn du den Inhalt von Elementen dynamisch ändern willst - und zwar nach, nicht während dem Laden des Dokuments - dann benutze das DOM, z.B. document.getElementById("...").innerHTML.
          Im HTML stellst du ein leeres Gerüst zur Verfügung.

          Die Idee ist nicht schlecht. Nur leider liegt das Problem im Detail. Mit DHTML, Knoten, DOM, get_element... darf ich nichts anfangen, denn wie gesagt erstellt EIN LEHRER die HTML-Lektion. Und ich kann nicht im Vorhinein wissen, was er macht. Vielleicht benutzt er eine Seite, die bereits eigene Knoten besitzt? Auch kann ich ihm nicht zumuten IDs zu setzen. Er möchte am liebsten Folgendes eingeben:
          3 + 3 = ((6))
          4 - 2 = ((2))
          JS müsste beim Autostart "erkennen", dass "6" und "2" Lösungen sind und diese durch Eingabefelder ersetzen. Wenn ich verlange, dass "((" durch einen JS-Aufruf ersetzt und "))" durch "</script>" ersetzt wird, ist das für viele Lehrer nicht einsichtig. Da darf ich mit DHTML gar nicht erst kommen.

          Gruß
          Hans-Jürgen

          1. Er möchte am liebsten Folgendes eingeben:
            3 + 3 = ((6))
            4 - 2 = ((2))

            Dann richte dein JavaScript so ein, dass man nur das in ein bestimmtes Element schreiben muss. Das Script kann diese Ausdrücke im Elementinhakt dann auswerten und Formularfelder generieren.

            JS müsste beim Autostart "erkennen", dass "6" und "2" Lösungen sind und diese durch Eingabefelder ersetzen.

            Das ist möglich. Beschäftige dich mit <http://de.selfhtml.org/javascript/objekte/regexp.htm@title=Regulären Ausdrücken>.

            Da darf ich mit DHTML gar nicht erst kommen.

            Dein bisheriger Ansatz wird aus prinzipiellen Gründen nicht funktionieren und um das DOM kommst du nicht herum. Deine weiteren Anforderungen sind durchaus umzusetzen, ohne dass der Lehrer irgendetws mit der internen Funktionsweise zu tun haben muss.

            Mathias

            1. Hallo Mathias,

              vielen Dank für deine Hilfe.
              Ich denke, jetzt komme ich weiter.
              Schön, dass es das Forum gibt.

              Hans-Jürgen

      2. Mahlzeit Hans-Jürgen,

        Da ich keinen Spaghetticode entwickeln wollte,

        Genau das hast Du aber getan ... document.write() ist im Normalfall die schlechteste aller Möglichkeiten, insbesondere, wenn Alternativen bestehen. Das Problem, dass die meisten Deiner Leser immer noch haben dürften, ist schlicht und ergreifend, dass sie überhaupt nicht wissen, was Du eigentlich willst.

        Also beschreibe doch bitte einmal Deine Idee, Dein Konzept, Deine Absichten - und zwar vollkommen untechnisch.

        MfG,
        EKKi

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

          Keiner versteht mich *schluchz*

          Aber okay: Ich möchte, dass das Programm iWord (VBA-Basic in Word) auch unter HTML läuft.
          iWord-Beispieldateien kann man hier herunterladen:
             www.staff.uni-mainz.de/schulzha/iWord.zip
          Über den Menüpunkt iWord kann man Antworten anzeigen bzw. löschen lassen usw.

          Ich habe document.write genommen, weil die Lektionen von Lehrern (die noch weniger programmieren können wie ich) in HTML geschrieben werden sollen. Der Lehrer soll also gar nicht mit Javaskript in Kontlikt kommen.
          Ich habe also nicht die Möglichkeit, wie z. B. "Hot Potatoe" und andere Programme erst alle Antworten in einem Array zu sammeln.
          Mit den href-Anweisungen will ich "modus" ändern. Dort rufe ich dann "interaktiv()" auf, welches zu den verschiedenen Funktionen verzweigt und mit document.write das Formular ändern soll.

          Ich hoffe, ich habe mich einigermaßen verständlich ausgedrückt. Es ist schon etwas anderes, ob jemand neben einem sitzt oder ob alles über ein Forum läuft. Da habe ich noch nicht so viel Erfahrung.
          Ich bitte um Nachsehen.

          Hans-Jürgen
          -----------------------------------------------------------------

          Mein abgespeckter Code sieht so aus:

            
          <html>  
          <head>  
          <title></title>  
          </head>  
          <body>  
            
          <script type="text/javascript">  
          var Antwort;  
          if (Antwort=="") {  
           Antwort="???";  
           }  
          var modus;  
            
          //Die richtige Lösung wird im Nur-Lese-Modus angezeigt  
          function AntwortenAnzeigen() {  
                document.write('<input type = "text" size = ' + Antwort.length + ' maxlength = ' + Antwort.length + ' value = ' + Antwort +' readOnly>');  
          }  
            
          //Alle Eingabefelder werden gelöscht  
          function AntwortenLoeschen() {  
               document.write('<input type="Text" name="1" size=' + Antwort.length + ' maxlength=' + Antwort.length + ' value="..."' );  
          }  
          function interaktiv() {  
          if (modus=="AntwortenAnzeigen") {  
           AntwortenAnzeigen();  
           }  
          if (modus=="AntwortenLoeschen") {  
           AntwortenLoeschen();  
           }  
          }  
            
          function Moduswechsel(NeuerModus) {  
          if (NeuerModus!="") {  
           modus = NeuerModus;  
           }  
           interaktiv();  
          }  
            
          </script>  
            
          Menue:<br>  
          <a href="#" onclick='modus="AntwortenAnzeigen"; interaktiv();'>Antworten anzeigen</a>  
          <a href="#" onclick='Moduswechsel("AntwortenLoeschen")'>Antworten löschen</a>  
            
          <p>Auf Klick sollen die Antworten angezeigt bzw. gelöscht werden:<br>  
          <br>5 + 5 = <script type="text/javascript">Antwort="10";interaktiv();</script>  
          <br>2 * 20 = <script type="text/javascript">Antwort="40";interaktiv();</script>  
          <br>120 + 30 = <script type="text/javascript">Antwort="150";interaktiv();</script>  
          </body>  
            
          </html>  
            
          
          
          1. Mit den href-Anweisungen will ich "modus" ändern. Dort rufe ich dann "interaktiv()" auf, welches zu den verschiedenen Funktionen verzweigt und mit document.write das Formular ändern soll.

            document.write kann das bestehende Dokument nicht ändern. document.write kann wie gesagt lediglich während des Ladens aufgerufen werden. Eine Alternative habe ich dir bereits aufgezeigt.

            Mathias

    2. Das Programm macht ALLES - nur nicht das, was ich will.

      Aus deinem Code werde ich nicht schlau.

      Ich habe den Code noch einmal gekürzt.
      Wenn man auf "Antwort anzeigen" klickt, sollen alle Antworten angezeigt werden.
      Wenn man auf "Antwort löschen" klickt, sollen alle Antworten gelöscht werden.

      Irgendwie startet das Programm aber nach Klick bei der letzten Antwort und scheint dann einen Neustart durchzuführen. Kommt an "var modus" vorbei und sieht ihn als nicht definiert an.

      Die Klicks arbeiten also nicht so, wie oben gewünscht :-((((

      Gruß
      Hans-Jürgen

      1. Mahlzeit Hans-Jürgen,

        Das Programm macht ALLES - nur nicht das, was ich will.

        Aus deinem Code werde ich nicht schlau.
        Ich habe den Code noch einmal gekürzt.

        Das bringt Deinen Lesern so lange nichts, wie Du den "nochmals gekürzten" nicht zeigst. Abgesehen davon ist Dein Code schon in Ansätzen dermaßen unübersichtlich, falsch und kann so gar nicht funktionieren, dass jegliches Daran-herumarbeiten höchstwahrscheinlich eh nicht zum Erfolg führen wird.

        Wenn man auf "Antwort anzeigen" klickt, sollen alle Antworten angezeigt werden.

        Und wie soll das erreicht werden? Indem man auf den Link (der im übrigen keiner ist, da er nicht linkt - also könntest Du ihn auch getrost weglassen) klickt? Dann wird lediglich die Funktion Moduswechsel() aufgerufen und ihr der String 'AntwortenAnzeigen' als Parameter übergeben. Diese Funktion schreibt allerdings lediglich den als Parameter übergebenen Wert in die globale Variable modus. Mehr nicht. Wieso wunderst Du Dich also, dass nicht mehr passiert?

        Wenn man auf "Antwort löschen" klickt, sollen alle Antworten gelöscht werden.

        s.o.

        Irgendwie startet das Programm aber nach Klick bei der letzten Antwort und scheint dann einen Neustart durchzuführen.

        Das "Programm" startet nicht und führt auch keinen Neustart durch - informiere Dich über <http://de.selfhtml.org/javascript/intro.htm@title=die Grundlagen von Javascript>. Javascript-Code, der nicht in Funktionen gesteckt oder an Events gebunden wurde, wird genau dann ausgeführt, wenn der Browser ihn parst. Genau einmal.

        Die Klicks arbeiten also nicht so, wie oben gewünscht :-((((

        Du meinst die Links. Natürlich nicht. Erstens sind sie gar keine Links und zweitens ist Dein Code falsch.

        Die Frage ist weiterhin: was willst Du eigentlich?

        MfG,
        EKKi

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