Fluxx: onChange

Hallo,

noch eine Frage von mir, leider kenne ich mich mit JS nicht so gut aus.

Ich benutzte momentan ein dropdown-Menü, bei dem Änderungen automatisch von einem Script erfasst werden:

<select onChange="ViewSum('A');" SumId="A"  name="v_343">
<option value="0" selected>0</option>
<option value="10">10</option>
<option value="20">20</option>
...
<option value="100">100</option>
</select>

Lieber würde ich aber auf die Auswahl verzeichten, und die Besucher den Wert selber eintragen lassen. Dafür habe ich dann ein Formular verwendet:

<input onChange="ViewSum('A');" SumId="A"  name="v_343" value="0">

Leider funktioniert diese Variante nicht.
Wenn ich in das Feld einen Wert eintrage, sollte ein Script eigentlich weiter unten die Summe über mehrere Felder aktualisieren. Mit der select-Variante klappts, mit dem Formular nicht.
Hat jemand eine Idee warum?

Vielen Dank schonmal!

  1. Hallo,

    Hi,

    <input onChange="ViewSum('A');" SumId="A"  name="v_343" value="0">

    ^^^^^^
    Was ist "SumId", ein valides Attribut, ein Schreibfehler oder Unfug?

    Wenn ich in das Feld einen Wert eintrage, sollte ein Script eigentlich weiter unten die Summe über mehrere Felder aktualisieren.

    Welches Script? Vielleicht die Funktion ViewSum() die Du leider vergessen hast zu posten?

    Gruß Chris

    1. OK, hier das Script dazu (hatte es nicht gepostet, da es ja mit der dropdown-Variante einwandfrei funktioniert).
      Zu deiner Frage: wenn ich das richtig sehe ist "SumID" eine von der Funktion genutzte Variable.

      <script language="JavaScript" type="text/javascript">
      <!--
        var max=1000;
        function ViewSum(SumId)
        {var nCounter;
          var nSum=0;
          var MyInputCollection=document.getElementsByTagName("select");
          for (nCounter=0;nCounter<MyInputCollection.length;nCounter++)
          {if (MyInputCollection[nCounter].getAttribute("SumId")==SumId)
            {if (MyInputCollection[nCounter].value!="" && parseInt(MyInputCollection[nCounter].value)!=NaN)
              {nSum +=parseInt(MyInputCollection[nCounter].value);}
              else
              {nSum += 0;}}}
          if(nSum <= max)
          {document.getElementById("Result" + SumId).innerHTML=nSum;}}
      -->
      </script>

      1. hi,

        function ViewSum(SumId)
          {var nCounter;
            var nSum=0;
            var MyInputCollection=document.getElementsByTagName("select");

        Na, worauf versucht denn diese Funktion hier zuzugreifen ...?

        Wenn du kein select mehr hast, sondern stattdessen jetzt ein input-Feld, dann musst du deine Funktion natürlich anpassen (und nicht nur an dieser Stelle).

        Die Beschreibung des elements-Objektes sollte weiterhelfen können.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Vielen Dank, das war tatsächlich der Fehler!

  2. Hallo Fluxx,

    onchange feuert erst, wenn die Änderung abgeschlossen ist. Bei Select also, wenn du die Auswahl geändert hast, bei Input aber erst, wenn du das Feld verlässt, also "wo anders hin" klickst. Erst dann ist die Änderung abgeschlossen.
      Eine Alternative wäre onkeyup. Die benutze ich bei einstelligen Eingaben. Onkeyup feuert aber jedesmal, wenn eine Taste losgelassen wird. Wenn du also eine 42stellige Zahl eingibst, wird auch 42mal gerechnet.

    Link zu den Eventhandlern: http://de.selfhtml.org/javascript/sprache/eventhandler.htm

    Gruß, Jürgen

    1. Hallo Jürgen,

      vielen Dank für deine Hinweise.

      onchange feuert erst, wenn die Änderung abgeschlossen ist. Bei Select also, wenn du die Auswahl geändert hast, bei Input aber erst, wenn du das Feld verlässt, also "wo anders hin" klickst. Erst dann ist die Änderung abgeschlossen.

      Das habe ich auch probiert, es funktioniert aber definitiv nicht.

      Eine Alternative wäre onkeyup. Die benutze ich bei einstelligen Eingaben. Onkeyup feuert aber jedesmal, wenn eine Taste losgelassen wird. Wenn du also eine 42stellige Zahl eingibst, wird auch 42mal gerechnet.

      die eingaben sind bei mir nicht einstellig, sondern werte zwischne 0 und 100, also maximal dreistellig.

      Habs grad mal probiert, funktioniert damit aber leider auch nicht.
      Noch eine andere Idee?

      Gruß
      Fluxx