Helmut: Zusammenspiel von function und input

Hallo Experten,
der folgende Test-Code (von den beiden #-Zeilen nur #1 aktiv) verhält sich, wie ich erwarte.

Die Variante (#1 entfernt, #2 aktiviert) erzeugt keine Ausgabe von y.

Kann mir mal jemand einen Tipp geben, wie diese Variante zu reparieren ist?

Mit besten Grüßen  Helmut
--------------------------------------------------
<html><head><title>INPUT</title>
<script type="text/javascript">
function Q(){var x1=document.Form.x.value;
             var y = x1*x1;
             alert(y)               // (#1)
             return y;
}
</script></head><body>
<div style="position: absolute; left: 600px ">
<form name="Form" action="">
<input type="text" name="x" size="3">
<input type="button" value="Rechne!" onclick="Q()">
</form></div>
<script type="text/javascript">
//document.write(y);                 //(#2)
</script>
</body></html>
---------------------------------------------------

  1. Hi there,

    Die Variante (#1 entfernt, #2 aktiviert) erzeugt keine Ausgabe von y.

    Kann mir mal jemand einen Tipp geben, wie diese Variante zu reparieren ist?

    Gar nicht. document.write kann in fertig geladenes Dokument nichts schreiben oder aber es überschreibt die ganze Seite. Eine Möglichkeit, das von Dir gewünschte Verhalten zu erzeugen bietet das Objekt http://de.selfhtml.org/javascript/objekte/all.htm#inner_html@title=innerHTML ...

  2. Mahlzeit Helmut,

    Kann mir mal jemand einen Tipp geben, wie diese Variante zu reparieren ist?

    Gerne doch - ich parse mal ein wenig:

    function Q(){var x1=document.Form.x.value;

    Du deklarierst hier eine Funktion. Beim Aufruf dieser Funktion geschähe folgendes:

    var y = x1*x1;

    Es wird innerhalb dieser Funktion eine http://de.selfhtml.org/javascript/sprache/variablen.htm#definieren@title=lokale Variable deklarierst und derselben ein Inhalt zugewiesen.

    }

    Uuuuund ... schwupps, ist die Variable weg.

    Aber das passiert ja alles erst beim Funktionsaufruf ... nun erstmal weiter das Dokument verarbeiten:

    <script type="text/javascript">
    //document.write(y);                 //(#2)
    </script>

    An dieser Stelle wird *während* der Verarbeitung des Dokuments eine bisher nicht initialisierte, http://de.selfhtml.org/javascript/sprache/variablen.htm#definieren@title=globale Variable (die demzufolge keinen Inhalt hat) ausgegeben.

    Fertig mit Parsen!

    Was genau soll also passieren, wenn jemand auf diesen Knopf drückt?

    <input type="button" value="Rechne!" onclick="Q()">

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hallo EKKi,
      Danke für Deinen Beitrag!

      Uuuuund ... schwupps, ist die Variable weg.

      Ohne return y wäre sie weg, aber mit sollte Sie doch (bei entferntem alert) außerhalb der function zugänglich werden.

      Was genau soll also passieren, wenn jemand auf diesen Knopf drückt?

      Es sollte auf dem Bildschirm das Quadrat von x erscheinen und mit neuer Eingabe wiederholbar sein - so wie bei der Ausgangs-Version mit alert.
      MfG, Helmut

      1. Hi,

        Uuuuund ... schwupps, ist die Variable weg.
        Ohne return y wäre sie weg, aber mit sollte Sie doch (bei entferntem alert) außerhalb der function zugänglich werden.

        Nein. Ihr *Inhalt* wird an die aufrufende Stelle zurückgegeben.
        Die Variable selbst ist innerhalbder Funktion gültig, und "stirbt" mit dem Ende des Ablaufs der Funktion.

        Und an der aufrufenden Stelle machst du aber überhaupt nichts mit dem Wert - du lässt ihn verfallen.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. Hallo ChrisB,
          vielen Dank!

          Nein. Ihr *Inhalt* wird an die aufrufende Stelle zurückgegeben.

          Das ist dann wohl der "button", und da passt keine Variable rein. Ich glaube, mein ganzer Ansatz für einen wiederholbaren Rechenablauf mit einem Eingabewert ist verkorkst, obwohl es mit alert so schön ging. Ich muss es wohl ganz anders anstellen.

          MfG Helmut

          1. Mahlzeit Helmut,

            Ich glaube, mein ganzer Ansatz für einen wiederholbaren Rechenablauf mit einem Eingabewert ist verkorkst, obwohl es mit alert so schön ging. Ich muss es wohl ganz anders anstellen.

            Gute Idee. Mach Dir dazu zuerst klar, *wann* welcher Code ausgeführt wird:

            • Code, der direkt im Dokument steht: __________________________________________________

            • Code, der innerhalb von Funktionen steht: __________________________________________________

            • Code, der innerhalb von Eventhandlern steht: __________________________________________________

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            1. Vielen Dank für alle Beiträge,
              ich habe inzwischen nach einer möglichst einfachen analogen Problemlösung im www gesucht - und einen EURO/DM-Umrechner gefunden. Damit ist alles klar.

              MfG, Helmut

              p.s.
              Nach meiner noch kleinen Erfahrung mit html und JavaScript kann man diese Sprachen fast nur an funktionierenden Beispielen lernen. Bei z.B. Matlab, Scilab oder auch LaTeX war ich das anders gewohnt; da hilft mir die Dokumentation der einzelnen Kommandos viel mehr. Trotzdem kenne ich bisher nichts besseres als SELFHTML.

              Für eine Buchempfehlung wäre ich dankbar.

              1. Hallo,

                ich habe inzwischen nach einer möglichst einfachen analogen Problemlösung im www gesucht - und einen EURO/DM-Umrechner gefunden. Damit ist alles klar.

                ach was, wer stellt denn heute noch Euro/DM-Rechner zur Verfügung? Gibt's noch Leute, die heute noch in DM "denken"? - Also ich habe das schon weit verdrängt; ich muss meine Hirnwindungen mächtig anstrengen, um mich zu erinnern, ja, da gab's vor langer Zeit mal was anderes ...
                Aber ich hatte den Euro auch schon ein halbes Jahr nach der offiziellen Einführung so weit verinnerlicht, dass ich nicht mehr unbewusst in DM umgerechnet habe (es sei denn, ich wollte ganz gezielt Preise mit "früher" vergleichen).

                Nach meiner noch kleinen Erfahrung mit html und JavaScript kann man diese Sprachen fast nur an funktionierenden Beispielen lernen.

                Ja, diese Beispiele helfen außerordentlich, ersetzen aber nicht das eigene Erleben und Ausprobieren, und ebensowenig das gelegentliche Nachlesen in Referenzhandbüchern und Spezifikationen.

                Bei z.B. Matlab, Scilab oder auch LaTeX war ich das anders gewohnt; da hilft mir die Dokumentation der einzelnen Kommandos viel mehr.

                Ich kenne die Sprachen, die du erwähnst, nur vom Hörensagen. Aber ich weiß, dass sie im Wesentlichen prozedural arbeiten. Also man betrachtet etwa eine Funktion, die hat bestimmte Argumente, verarbeitet die auf genau definierte Art und Weise, und produziert ein Ergebnis. Das ist zwar in Javascript "im Prinzip" auch so, aber JS ist von der Struktur der Sprache her ungenauer, weniger scharf und eindeutig.
                Dazu kommt die Objektorientierung, die mit sich bringt, dass "alles irgendwie zusammenhängt"; und als ob das noch nicht genug wäre, haben wir auch noch einen ereignisgesteuerten Programmablauf. Das ist für jemanden, der mit einfachen, linear ablaufenden Konzepten das Programmieren gelernt hat, anfangs schwer zu verstehen.

                Trotzdem kenne ich bisher nichts besseres als SELFHTML.

                Geht mir auch so, obwohl's mir an vielen Stellen zu ungenau ist oder ich den Eindruck habe, die eine oder andere Erklärung würde mir etwas Wichtiges verschweigen.

                So long,
                 Martin

                --
                Ungeschehene Ereignisse können einen katastrophalen Mangel an Folgen nach sich ziehen.
                  (Unbekannter Politiker)
      2. Mahlzeit Helmut,

        Uuuuund ... schwupps, ist die Variable weg.
        Ohne return y wäre sie weg, aber mit sollte Sie doch (bei entferntem alert) außerhalb der function zugänglich werden.

        Nein. Sie wird nicht "zugänglich" - sie wird an dasjenige Etwas zurückgereicht, das die Funktion aufgerufen hat. In Deinem Fall ist das ein Eventhandler, der absolut *gar nichts* mit dem Rückgabewert macht.

        Was genau soll also passieren, wenn jemand auf diesen Knopf drückt?
        Es sollte auf dem Bildschirm das Quadrat von x erscheinen und mit neuer Eingabe wiederholbar sein - so wie bei der Ausgangs-Version mit alert.

        Und wieso sollte es das tun? Verinnerliche Dir bitte, *wann* das document.write() im unteren Abschnitt Deines Codes ausgeführt wird.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    2. Hallo EKKi,
      Danke für Deinen Beitrag!

      Uuuuund ... schwupps, ist die Variable weg.

      Ohne return y wäre sie weg, aber mit sollte sie doch (bei entferntem alert) außerhalb der function zugänglich werden.

      Was genau soll also passieren, wenn jemand auf diesen Knopf drückt?

      Es sollte auf dem Bildschirm das Quadrat von x erscheinen und mit neuer Eingabe wiederholbar sein - so wie bei der Ausgangs-Version mit alert.
      MfG, Helmut