André Laugks: Schleife fragt Checkboxen ab

Hallo alle zusammen!

In meinem Schleifenrausch, habe ich eine kleine Abfrage erstellt, die 12 checkboxeb abfragt, ob mindestens 1 angeklickt ist. Irgendwie futzt es aber nicht so richtig.

Es futzt nur, wenn ich die erste checkbox auswähle. Wenn ich die checkboxen 2-12 wähle, kommt immer die Aufforderung, etwas auszuwählen. Von der Logik her, dürfte es aber nicht sein.
Abfrage: ist checkbox 1 oder checkbox 2 oder 3 oder .... oder 12 ausgewählt. Ich muß ja ein ODER enthalten haben, sonst wird ja überprüft, ob alle 12 ausgewählt sind.

<script language="javascript">
<!--

function auswahl() {

for (var i = 1; i <=11; i++)
{

var x = document.nummern.elements;

if ((x[0].checked  == true) (x[i].checked  == true)) return true;
    else { alert("Bitte waehlen sie etwas aus!"); return false; }

}

}

// -->
</script>

Testseite: http://www.netcologne.de/~nc-laugksan/forum/schleife4.htm

Mit freundlichen Grüßen

André Laugks

  1. Hallo alle zusammen!

    Es futzt nur, wenn ich die erste checkbox auswähle. Wenn ich die checkboxen 2-12 wähle, kommt immer die Aufforderung, etwas auszuwählen. Von der Logik her, dürfte es aber nicht sein.
    Abfrage: ist checkbox 1 oder checkbox 2 oder 3 oder .... oder 12 ausgewählt. Ich muß ja ein ODER enthalten haben, sonst wird ja überprüft, ob alle 12 ausgewählt sind.

    <script language="javascript">
    <!--

    function auswahl() {

    for (var i = 1; i <=11; i++)
    {

    var x = document.nummern.elements;

    if ((x[0].checked  == true) (x[i].checked  == true)) return true;
        else { alert("Bitte waehlen sie etwas aus!"); return false; }

    }

    }

    // -->
    </script>

    Hallo Andre,

    in deinern Gedankengängen steckt ein Denkfehler.
    Die Abfrage if ((x[0].checked  == true) (x[i].checked  == true))  fragt ab, ob das erste oder das i-te Element angeklickt ist.
    Hast du das erste Element aktiviert ist die Aussage wahr und durch den return true wird die Funktion abgebrochen und das Formular abgeschickt.
    Dein Fehler steckt im else-Zweig. Ist weder Element 1 noch 2 aktiviert, ist die Aussage falsch, also
    x[0].checked  falsch und x[i].checked  falsch. Durch das return false wird die Funktion abgebrochen und die Schleife nicht durchlaufen. Es werden also nur die ersten 2 Felder geprüft.
    Änderst du das Script so ab:
    <script language="javascript">
    <!--

    function auswahl() {

    for (var i = 1; i <=11; i++)
    {

    var x = document.nummern.elements;

    if ((x[0].checked  == true) (x[i].checked  == true)) return true;

    }
    alert("Bitte waehlen sie etwas aus!"); return false;
    }

    // -->
    </script>

    erfüllt es seinen gewünschten Zweck. Wird in der Schleife ein angeklicktes Feld erreicht, erfolgt der Abbruch der Funktion und die alert-Anweisung wird gar nicht ausgeführt. Wurde kein Feld ausgewählt, dann wird nach Beendigung des Schleifendurchlaufes die alert-Anweisung ausgeführt und dann das return false zurückgegeben. Das Formular also nicht abgeschickt.

    Viele Grüße

    Antje

    PS: Einiges gibt es am Script noch zu verbessern, aber da du lernen willst mache ich es nicht.

    1. Hallo Antje!

      PS: Einiges gibt es am Script noch zu verbessern, aber da du lernen willst mache ich es nicht.

      Nachdem Du mir die Optimierung im Chat nicht so schnell verraten (Vielen Dank dafür, habe mal wieder einiges gelernt!), will ich es für die Interessierten auch posten.

      -Dadurch, daß die Schleife alle Checkboxen durch geht, ist ein ODER überflüßig. Sobald von den 12 checkboxen eine ausgewählt ist, wird ein true geliefert.
      -als ganz kleine Verbesseruing, var x = document.nummern.elements; kann ich mir dadurch/eigetlich auch sparen.

      <script language="javascript">
      <!--

      function auswahl() {

      for (var i = 0; i <=11; i++)
      {

      if (document.nummern.elements[i].checked  == true) return true;
      }
      alert("Bitte waehlen sie etwas aus!"); return false;
      }

      }
      }
      // -->
      </script>

      Mit freundlichen Grüßen

      André Laugks

      1. Hallo Andre,

        wenn schon perfekt, dann richtig :-)

        <script language="javascript">
        <!--

        function auswahl() {

        for (var i = 0; i <=11; i++)
        {

        if (document.nummern.elements[i].checked  == true) return true;
        }
        alert("Bitte waehlen sie etwas aus!"); return false;
        }

        // -->
        </script>

        Zwei Klammern waren zuviel.

        Antje

        1. Hallo Antje!

          Zwei Klammern waren zuviel.

          Ist es richtig korrekt nicht so?:

          <script language="javascript">
          <!--

          function auswahl() {   // function auf

          for (var i = 0; i <=11; i++)
          {  // Schleife auf

          if (document.nummern.elements[i].checked  == true) return true;
          { // if Anweisung auf
          alert("Bitte waehlen sie etwas aus!"); return false;
          } // if Anweisung zu

          } // Schleife zu

          } // function zu

          // -->
          </script>

          Mit freundlichen Grüßen

          André LAugks

          1. Hallo André,

            nein, nein, Antje hatte es schon richtig, da nach der if-Abfrage nur ein Aufruf erfolgt nämlich return true;

            Also, wenn Du für die if-Abfrage schon klammern haben willst dann so:

            <script language="javascript">
            <!--

            function auswahl() {   // function auf

            for (var i = 0; i <=11; i++)
              {  // Schleife auf
              if (document.nummern.elements[i].checked  == true)
                { //if Anweisung auf
                return true;
                } // if Anweisung zu
              } //Schleife zu
              alert("Bitte waehlen sie etwas aus!"); return false;
               // wird nicht erreicht, wenn irgendwann return true erreicht war und die Funktion dadurch
              // abgebrochen wurde
               } // function zu
            // -->
            </script>

            Gruß

            Leonhard