Felix Riesterer: Bei fehlender Variable WIEDER Abbruch ?

Beitrag lesen

Lieber Franz,

ich vermute, dass das genau davon kommt, dass Du mit den Bezeichnern programmatisch hantierst. Würdest Du Dich rein an der Dokumentstruktur orientieren, wäre das Ganze dynamisch und sicherer.

Da Du von Zeilen und Spalten sprichst, denkst Du im Grunde in einer Tabelle, bei der jede Zeile die exakt gleiche Anzahl an Feldern ("Spalten") hat. Und selbst wenn dem nicht so wäre, könntest Du das bei einer dynamischen Herangehensweise kompensieren!

Ich vereinfache Dein jsFiddle-Beispiel vom Markup her:

<ol id="daten">
  <li>
    <label>Zeile 1 Wert 1 <input type="number"></label>
    <label>Zeile 1 Wert 2 <input type="number"></label>
    <label>Zeile 1 Wert 3 <input type="number"></label>
  </li>
  <li>
    <label>Zeile 2 Wert 1 <input type="number"></label>
    <label>Zeile 2 Wert 2 <input type="number"></label>
  </li>
</ol>

Ich muss die <label> im HTML haben, kann ihre Darstellung nötigenfalls mit CSS aber ausblenden. Egal. Die fehlende dritte Zahl in der zweiten Zeile ist Absicht, um diesen "Fehler" in JavaScript kompensieren zu müssen, damit das Script sauber arbeitet. Außerdem habe ich die Zeilen als Listenpunkte realisiert, damit man eine zumindest auf Zeilenebene semantische Struktur hat (deine div-Suppe will mir so gar nicht schmecken).

So. Nun zu den Zeilen und Spalten.

function holeWerte () {
  const liste = document.getElementById("daten");
  const zeilen = liste.getElementsByTagName("li");
  const tabelle = []; // das wird unsere Datentabelle
  var felder; // benötigen wir später

  for (var z=0; z < zeilen.length; z++) {

    // Tabellenzeile anlegen
    tabelle[z] = []; // noch leer

    felder = zeilen[z].querySelector('input[type="number"]');

    for (f = 0; f < felder.length; f++) {
      // Wert des Feldes in unserer Tabellenzeile eintragen
      tabelle[z][f] = parseFloat(
        felder[f].value.replace(/[^0-9 ]/g, "")
      ) || 0;
    }
  }

  return tabelle;
}

Die Variable tabelle wird ein Array, dessen Inhalte selbst wieder Arrays sind. Damit hast Du eine zweidimensionale Abbildung der Werte Deiner Eingabefelder. Man kann also mit tabelle[y][x] (y = Zeile, x = Spalte) auf eine bestimmte "Zelle" zugreifen. Damit sollte eine Berechnung von Spalten und Zeilen kein Problem mehr sein:

function summe_spalte (x) {
  const zeilen = holeWerte();
  var summe = 0;

  for (var y=0; y < zeilen.length; y++) {
    // Zelle vorhanden?
    if (zeilen[y][x]) {
      summe += zeilen[y][x];
    }
  }

  return summe;
}

function summe_zeile (y) {
  const zeilen = holeWerte();
  var summe = 0;

  // Zeile vorhanden?
  if (zeilen[y]) {

    for (x = 0; x < zeilen[y].length; x++) {
      summe += zeilen[y][x];
    }
  }

  return summe;
}

Der gesamte Code hier ist ungetestet, sollte aber veranschaulichen, wie man das dynamisch lösen könnte. Außerdem kann man sehen, dass fehlende Zellen ignoriert werden, was so ähnlich ist, als stünde darin der Wert "0".

Liebe Grüße

Felix Riesterer

0 59

Schleife in einer Javascript funktion

Franz
  • javascript
  1. 1
    Tabellenkalk
    1. 0
      Franz
      1. 0
        Tabellenkalk
        1. 0
          Franz
          1. 0
            Rolf B
  2. 2
    Rolf B
    1. 0
      Franz
      1. 1
        JürgenB
        1. 0
          Rolf B
          1. 0
            JürgenB
          2. 0
            Tabellenkalk
      2. 1
        Rolf B
        1. 0
          Franz
          1. 0
            Rolf B
            1. 0
              Franz
              1. 0
                Rolf B
                1. 0
                  Franz
                  1. 0

                    Wert(e) aus function speichern für andere function vorbehalten und wiederverwenden

                    Franz
                    1. 0
                      Der Martin
                      1. 0
                        Rolf B
                    2. 1
                      Rolf B
                      1. 0
                        Franz
                        1. 0
                          Rolf B
                      2. 0

                        Summenzuweisung wird nicht ausgeführt

                        Franz
                        1. 0
                          Rolf B
                          1. 0
                            Franz
                            1. 0
                              Rolf B
                              1. 0

                                Summenzuweisung wird nicht ausgeführt, wenn INPUT Felder nicht übergen werden

                                Franz
                                1. 0
                                  Tabellenkalk
                                2. 0
                                  Der Martin
                                3. 0
                                  Rolf B
                                  1. 0
                                    Franz
                                    1. 0
                                      Rolf B
                                      1. 0
                                        Franz
                                        1. 0
                                          Rolf B
                                          1. 0
                                            Felix Riesterer
                                            1. 0
                                              Rolf B
                                              1. 0
                                                Felix Riesterer
                                                1. 0
                                                  Rolf B
                                          2. 0
                                            Franz
                                            1. 0
                                              Rolf B
                                              1. 0
                                                Franz
                                                1. 1
                                                  Rolf B
                                                  1. 0
                                                    Franz
                            2. 0
                              Rolf B
                              1. 0
                                Franz
                                1. 0
                                  Rolf B
                                  1. 0
                                    Franz
                                    1. 0
                                      Rolf B
                                      1. 0

                                        function setOptionalValue

                                        Franz
                                        1. 0
                                          Rolf B
                                          1. 0
                                            Franz
                                            1. 0
                                              Rolf B
                                    2. 0
                                      Matthias Scharwies
  3. 0
    Felix Riesterer
    1. 0
      Rolf B
  4. 0

    Bei fehlender Variable WIEDER Abbruch ?

    Franz
    1. 1
      Felix Riesterer