Torsten Meletzki: Checkboxüberprüfung scheitert im NC 4.5

Hallo an alle,

ich habe folgendes Problem für die Experten.
Ich habe ein Formularfeld auf dem ich vor dem Absenden (submit) eine Funktion aufrufe,
die überprüft, ob auf dem Formular überall etwas eingetragen wurde.
Bei den Überprüfungen der Textfelder funktioniert das auch prima, aber ich will auch eine
Optionsgruppe überprüfen, die aus Kontrollfelder (Checkboxen) besteht. Bei dieser Optionsgruppe
muß mindestens 1 Feld markiert sein, es können aber auch mehrere angklickt werden.
Dazu habe ich eine Funktion geschrieben, die auch im MSIE 4.0 prima funktioniert. Aber leider
nicht im NC 4.5.
Dann habe ich die Funktion überarbeitet damit sie auch im Communikator läuft. Wieder Banane.
Auch die 2 Variation läuft im MSIE prima, der NC ignoriert sie völlig. Was mache ich falsch??

//1 Funktionsmöglichkeit
function check_auswahl(checkbox)
{ var feld1 = document.form.testfeld1

if (feld1[0].checked == true)
{ return true}

else if (feld1[1].checked == true)
{return true}

else if (feld1[2].checked == true)
{return true}

return false;
}

//2. Funktionsmöglichkeit
function check_auswahl(checkbox)
{ var feld1 = document.form.testfeld1
  var feld2 = document.form.testfeld2
  var feld3 = document.form.testfeld3

if (feld1.checked == true)
{return true}

else if (feld2.checked == true)
{return true}

else if (feld3.checked == true)
{return true}

return false;
}

Wenn mir jemand einen Tip geben könnte, wäre ich sehr dankbar.

Torsten Meletzki

  1. Hallo Torsten,

    angenommen, Du hast in HTML so was:

    <form name="formular">
    <input type="checkbox" name="boxes" value="1"> 1<br>
    <input type="checkbox" name="boxes" value="2"> 2<br>
    <input type="checkbox" name="boxes" value="3"> 3
    </form>

    dann kannst Du in JavaScript notieren:

    function check_auswahl()
    {
    var check = 0;
    for(i = 0; i < document.formular.boxes.length; ++i)  
    {
      if(document.formular.boxes[i].checked == true)
        check = 1;
    }
    return check;
    }

    viele Gruesse
      Stefan Muenz

    1. Hallo Stefan,
      vielen Dank für die Mail.
      Ich habe Deine Funktion auch eingebunden, aber leider ohne Ergebnis. Ich weiß, daß
      du kaum noch Zeit hast, aber vieleicht kann mir auch jemand anderes helfen.
      Vermutlich mache ich auch nur einen dusseligen Syntaxfehler.
      Vielen Dank im Vorab an alle.

      Meine letzte Variation sah
      so aus:

      // Die Funktion der Submit Abfrage
      <script language="JavaScript">
        function validate_form() {
         validity = true; // assume valid
         if (!check_empty(document.form.Titel.value))
               { validity = false; alert('Titel ist leer!'); }
         if (!check_email(document.form.email.value))
               { validity = false; alert('eMail ist ungültig!'); }
         if (!check_url(document.form.url.value))
               { validity = false; alert('URL ist ungültig!'); }
         if (!check_empty(document.form.Strasse.value))
               { validity = false; alert('Keine Strasse angegeben'); } usw.

      // Hier kommt jetzt das für das Testfeld
      if (!check_auswahl(document.form.testfeld1.value))
               { validity = false; alert('Testfeld1 ist leer'); }

      if (validity)
               alert ("Alle benötigten Informationen wurden geprüft. "
                       + "Die Eingaben wurden als richtig erkannt "
                       + "Mail Delivery Sub-System.");
         return validity;
      }

      //Jetzt Deine angepasste Funktion

      function check_auswahl()
      {
      var check = 0;
      for(i = 0; i < document.form.testfeld1.length; ++i)

      if(document.form.testfeld1[i].checked == true)
          check = 1;

      else if(check == 1)
      {return true}
      return false;

      }

      // Hier die Form
      <form METHOD="POST" name="form" ACTION="testcgi" onSubmit="return validate_form()">
        <input type="hidden" name="required" value="VollerName"><input type="hidden"
        name="ResponsePage" value="danke.htm">

      // Hier die Testboxen auf der Seite
      <p><font face="Arial" color="#FFFFFF">Wählen Sie eine der folgenden Optionen:</font></p>
        <p><font face="Arial" color="#FFFFFF">Option 1 <input type="checkbox" name="testfeld1"
        value="ON">  Option 2<input type="checkbox" name="testfeld1" value="ON">  Option
        3 <input type="checkbox" name="testfeld1" value="ON">

      THx Torsten Meletzki

      1. Hallo Torsten

        OK, also das hier ist, was Du geschrieben hast, nur etwas anders formatiert.

        =======================
        // Hier kommt jetzt das für das Testfeld
            if (!check_auswahl(document.form.testfeld1.value)) {
                validity = false;
                alert('Testfeld1 ist leer');
            }

        if (validity)
                 alert ("Alle benötigten Informationen wurden geprüft. "
                         + "Die Eingaben wurden als richtig erkannt "
                         + "Mail Delivery Sub-System.");

        return validity;
        }

        //Jetzt Deine angepasste Funktion

        function check_auswahl() {
            var check = 0;
            
            for (i=0; i<document.form.testfeld1.length; i++)  
                if (document.form.testfeld1[i].checked == true)
                    check = 1;
                else if (check == 1) {return true}

        return false;
        }

        Als erstes faellt auf, dass Du beim Aufruf der Funktion check_auswahl() einen Parameter uebergibst, den die Funktion gar nicht haben will. Ich wurde Dich an des Browsers stelle heftig beschimpfen ;-)

        Soweit sieht es schon ganz gut aus, bis auf einen Fehler in der zweiten Funktion (ich gehe davon aus, Du willst ueberpruefen, ob mindestens eine Checkbox angekreuzt ist). Bei jedem Schleifendurchgang wird geprueft, ob die aktuelle Checkbox checked ist; wenn ja wird check=1 und mit der naechsten Checkbox weitergemacht. Nur wenn diese jetzt NICHT angekreuzt ist, wird nochmal geschaut (im else-Zweig), ob die VORHER ueberpruefte Box angekreuzt WAR, und falls ja, wird true returned. Die Funktion gibt immer dann true zurueck, wenn die eine Checkbox angekreuzt ist UND die darauffolgende nicht, ansonsten immer false. Aehem naja, ziemlich konfus, wuerde ich sagen. Versuch's lieber mal so:

        function check_auswahl() {
            for (i=0; i<document.form.testfeld1.length; i++)  
                if (document.form.testfeld1[i].checked)
                    return true;

        return false;
        }

        Im Prinzip ist es das, was Stefan geschrieben hat. Fuer den Fall, dass Du jetzt aus Platzspar- und Wiederverwendbarkeitsgruenden unbedingt das zu testende Feld als Parameter uebergeben willst, sieht's halt so aehnlich aus:

        function check_auswahl(field) {
            for (i=0; i<field.length; i++)  
                if (field[i].checked)
                    return true;

        return false;
        }

        Ob das jetzt wirklich so funktioniert, weiss ich aber nicht.

        Allgemein wuerde ich sagen, dass Checkboxen von Natur aus Singles sind (werden also unabhaengig von anderen ein- und ausgeschaltet) und deshalb jeweils einen Namen fuer sich allein verdient haben (bei Dir haben alle denselben). Fuer Deine Zwecke sind Radiobuttons wohl besser geeignet. Das merkt man spaetestens, wenn man dieses FORM an ein Perlscript oder sonstiges submitted.

        Calocybe

        1. Hallo Calocybe

          erstmal vielen Dank für deine Mail. Ich habe umgehend Dein Skript getestet und es funktioniert prima....IM MSIE 4.0. Es ist wirklich nicht zu glauben, aber der NC 4.5 scheint alles zu ignorieren. Ich muß allerdings auch zugeben, das ich gerade erst mit Java Skript anfange zu arbeiten. Es ist schon lange her, daß ich micht mit Pascal und C beschäftigt habe was ich aber dann beruflich nicht mehr benötigte. Ich danke Dir aber trotzdem und werde wenn Du nichts dagegen hast, Deine Version auf der Page dann einsetzen.
          Wenn die Seiten publiziert worden sind, werde ich Dir gerne mal den Link zusenden. Wenn Du möchtest.
          Ich werde jetzt die Formularfeldabfrage so wie ich diese jetzt habe auch belassen, egal ob der Communikator es versteht oder nicht.
          Vielleicht sollte Netscape, besser AOL das J-Skript an MS verkaufen, in deren Browser läuft nämlich fast alles. Lifescript---JavaScript----MS-Script???
          Verstehen kann ich es aber trotzdem nicht, warum!

          Vielen Dank noch und frohe Osterfeiertage!!

          Torsten Meletzki