Rolf ẞ: Checkbock + Berechnung in Java Skript

Beitrag lesen

Hallo JeBubing,

ich habe ja KEINE Ahnung von Simatic und was man da so alles anstellen kann, aber eins glaube ich begriffen zu haben: Du kannst auf der CPU einen Webserver laufen lassen und der liefert an einen beliebigen Browser HTML aus. Und über bestimmte Namen von input Elementen kann man Werte zurückschreiben. Und Du brauchst einen Helper, der Dir eine binäre Eingabe eines Integer-Wertes ermöglicht. Serverseitig hast Du keine Chance, da die Simatic das alles intern handelt.

Ideen dazu:

  • das eigentliche Input-Feld verstecken (type=hidden)
  • sicherstellen, dass der user erkennen kann, welche checkbox welchen bitwert darstellt
  • am ENDE der HTML Seite einen Javascript-Block setzen, der folgendes tut:
  1. Wert aus dem Inputfeld auslesen (der dürfte da als Integer stehen)
  2. Bits auf die Checkboxen verteilen
  3. Die Checkboxen so benennen, dass ihre Bitposition oder ihr Bitwert in ihrem Namen codiert ist (z.B. cb0, cb1, cb2, cb3)
  4. mit addEventListener('change', function(){...}) einen Event-Handler für das change-Event auf dem Container registrieren (nicht pro Checkbox)
  5. in der Eventhandler-Funktion die Bits wieder einsammeln und ins versteckte Inputfeld schreiben.

Statt auf Change kann man sich auch auf das Submit des Form registrieren. In der Change-Variante kannst Du das Feld zum Testen sichtbar lassen und gucken, wie die Boxen sich auswirken.

Zerlegen in Bits - dafür gibt's verschiedene Möglichkeiten. Wenn die Checkboxen so wie oben beschrieben benannt sind, geht es z.B. so:

var wert = parseInt( /* wert des textfeldes */ );
for (var pos = 0; pos < 4; pos++) {
   document.getElementById("cb"+pos).checked = Boolean(wert % 2);
   wert >>= 1;   // Shift-right um 1 ist Integer-Division durch 2
}

Im change-Eventhandler machst Du es andersrum, du gehst die Checkboxen durch und addierst die Values auf. Das hast Du ja im Prinzip schon. So würde ich es machen:

var wert = 0;
for (var pos = 3; pos >= 0; pos--) {
   wert *= 2;
   wert += (document.getElementById("cb"+pos).checked) ? 1 : 0;
}
// jetzt Wert ins eigentliche Eingabefeld schreiben

Rolf

--
Dosen sind silbern