Anton: Funktion will Bezeichner

Guten Tag Forum,

der IE gibt ständig eine Javascript Fehlermeldung aus.
Es soll getestet werden, ob ein Feld eine Ganzzahl enthält.

So wird die Funktion aufgerufen:

<form action="card.php" method="post" onsubmit="return zahl(this)">

Und hier ist die Funktion:

function zahl(form) {
    var i;
    var ok = true;
    var form = this.form

for (i=0; i < form.['anzahlNeu[]'].length; i++) {

if (form.['anzahlNeu[]'][i].value.charAt(0) < "0" ||
     form.['anzahlNeu[]'][i].value.charAt(0) > "9" ||
     form.['anzahlNeu[]'][i].value.charAt(1) < "0" ||
     form.['anzahlNeu[]'][i].value.charAt(1) > "9") {
            ok = false;
        }
    }

if (ok == false) {
        alert("Bitte nur Zahlen eingeben !");
    }

return ok;
}

Die Zeile in der der Fehler sein soll ist diese:

for (i=0; i < form.['anzahlNeu[]'].length; i++) {

Sieht jemand was da verkehrt ist?

  1. Hallo Anton,

    var form = this.form

    Wozu soll diese Zuweisung gut sein?

    for (i=0; i < form.['anzahlNeu[]'].length; i++) {

    form.elements['anzahlNeu[]'].length

    if (form.['anzahlNeu[]'][i].value.charAt(0) < "0" ||
         form.['anzahlNeu[]'][i].value.charAt(0) > "9" ||
         form.['anzahlNeu[]'][i].value.charAt(1) < "0" ||
         form.['anzahlNeu[]'][i].value.charAt(1) > "9") {

    form.elements['anzahlNeu[]'][i].value

    if (ok == false) {

    if (!ok) {

    alert("Bitte nur Zahlen eingeben !");
        }

    return ok;
    }

    Grüße
    Andreas

    --
    "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
    (Rich Cook)
    1. hi,

      var form = this.form

      Wozu soll diese Zuweisung gut sein?

      und vor allem: aus welchem grunde wird offenbar davon ausgegangen, die function hätte eine eigenschaft form?

      gruß,
      wahsaga

      --
      "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
      1. Hallo wahsaga,

        und vor allem: aus welchem grunde wird offenbar davon ausgegangen, die function hätte eine eigenschaft form?

        Damit meint er - aus welchen Gründen auch immer - wahrscheinlich den Übergabeparameter.

        Grüße
        Andreas

        --
        "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
        (Rich Cook)
        1. Hallo wahsaga,

          und vor allem: aus welchem grunde wird offenbar davon ausgegangen, die function hätte eine eigenschaft form?

          Damit meint er - aus welchen Gründen auch immer - wahrscheinlich den Übergabeparameter.

          Es kann am Anfang aber auch sehr verwirren, wenn in allen Beispielen zu Objekten in Javascript die Übergabeparameter dieselben Namen haben wie die Eigenschaften des Objekts, z.B.

          function meinObjekt(a) {
            this.a = a;
          }

          Grüße
          Andreas

          --
          "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
          (Rich Cook)
          1. Jetzt kommt ein Syntaxfehler vom IE. Die genau Zeile gibt er nicht an.

            function zahlChecker(form) {
                var i;
                var ok = true;

            for (i=0; i < form.elements['anzahlNeu[]'].length; i++) {

            if (form.elements['anzahlNeu[]'][i].value) < 0)
                        ok = false;
                    }
                }

            if (!ok) {
                    alert("Bitte nur Zahlen eingeben !");
                }

            return ok;
            }
            //->

            1. Außerdem wird so doch nicht getestet, ob eine Zahl eingegeben wurde.
              Sicher, dass das so richtig ist?

              1. Hallo Anton,

                Außerdem wird so doch nicht getestet, ob eine Zahl eingegeben wurde.

                Da war mein erstes Posting wohl etwas missverständlich. Ich meinte, dass alle Vorkommen von form.['anzahlNeu[]'] ersetzt werden sollten. Abgesehen davon gibt es eine bessere Möglichkeit, das zu testen:
                http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#number oder
                http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#parse_int.

                Zum Testen solltest Du übrigens einen Browser verwenden, der aussagekräftigere Fehlermeldungen liefert als der IE.

                Grüße
                Andreas

                --
                "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
                (Rich Cook)
                1. Hallo,

                  Firefox gibt mir keine Fehlermeldungen. Bin erst dadurch auf IE aufmerksam geworden.

                  parseInt() wandelt die Zeichen in Integer um. Was habe ich davon. So kann ich immer noch nicht testen, ob der Besucher eine Nicht-Integer eingegeben hat, oder ? Ich will ihn ja darüber informieren, dass er dies nicht un solle und nicht einfach mit einer konvertierten Eingabe weiterarbeiten.

                  1. Hallo Anton,

                    parseInt() wandelt die Zeichen in Integer um. Was habe ich davon. So kann ich immer noch nicht testen, ob der Besucher eine Nicht-Integer eingegeben hat, oder ?

                    Doch kannst Du, indem Du abfragst, ob das Ergebnis der Umwandlung mit dem ursprünglichen Wert übereinstimmt.

                    Grüße
                    Andreas

                    --
                    "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
                    (Rich Cook)
                    1. function zahlChecker(aForm) {
                          var i;
                          var test;
                          var ok = true;

                      for (i=0; i < aForm.elements['anzahlNeu[]'].length; i++) {

                      test = parseInt(aForm.elements['anzahlNeu[]'][i].value);

                      if (aForm.elements['anzahlNeu[]'][i].value != test) {
                                  alert("Bitte nur Zahlen eingeben !");
                                  ok = false;
                              }
                          }
                          return ok;
                      }

                      Jetzt kommt:
                      aForm.elements['anzahlNeu[]'].length ist Null oder kein Objekt

                      :(

                      1. Hallo Anton,

                        Jetzt kommt:
                        aForm.elements['anzahlNeu[]'].length ist Null oder kein Objekt

                        Da fehlt ein .value, Du willst ja die Länge des Strings wissen:
                        aForm.elements['anzahlNeu[]'].value.length

                        Grüße
                        Andreas

                        --
                        "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
                        (Rich Cook)
                        1. function zahlChecker(aForm) {
                              var i;
                              var test;
                              var ok = true;

                          for (i=0; i < aForm.elements['anzahlNeu[]'].value.length; i++) {

                          test = parseInt(aForm.elements['anzahlNeu[]'][i].value);

                          if (aForm.elements['anzahlNeu[]'][i].value != test) {
                                      alert("Bitte nur Zahlen eingeben !");
                                      ok = false;
                                  }
                              }
                              return ok;
                          }

                          Stimmt. Das ist ein Flüchtigkeitsfehler. Die gleiche Fehlermeldung kommt immernoch.

                          1. Hallo Anton,

                            tut mir leid, ich hatte mir auch immer nur noch die Stelle angesehen, um die es gerade ging.

                            Ich gehe mal davon aus, dass Du so etwas hast:

                            <form .... onsubmit="return zahlChecker(this)">
                              <input type="text" name="anzahlNeu[]">
                            ...
                            </form>

                            Dann entfällt in der Funktion zahlChecker die Schleife (die war ja nur dafür da, den Wert zeichenweise zu prüfen):

                            function zahlChecker(aForm) {
                              var test = parseInt(aForm.elements['anzahlNeu[]'].value);
                              if (aForm.elements['anzahlNeu[]'].value != test) {
                                 alert("Bitte nur Zahlen eingeben !");
                                 return false;
                              }
                              return true;
                            }

                            Wenn ich falsch liege, dann solltest Du mal etwas HTML-Code posten.

                            Grüße
                            Andreas

                            --
                            "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
                            (Rich Cook)
                            1. Hai,

                              Hast schon die richtige Vermutung gehabt.

                              <form .... onsubmit="return zahlChecker(this)">
                                <input type="text" name="anzahlNeu[]">
                              ...
                              </form>

                              <td>
                              <input type="text" name="anzahlNeu[1]" size="2" maxlength="2" title="Hier bitte die gewünschte Anzahl des Artikels eingeben." />
                              <input type="hidden" name="artikel_id[1]" value="10111" />
                              </td>
                              <td>
                              <input type="text" name="anzahlNeu[2]" size="2" maxlength="2" title="Hier bitte die gewünschte Anzahl des Artikels eingeben." />
                              <input type="hidden" name="artikel_id[1]" value="10112" />
                              </td>
                              etc

                              Dann entfällt in der Funktion zahlChecker die Schleife (die war ja nur dafür da, den Wert zeichenweise zu prüfen):

                              Nein, ich muss doch durch die Arrayelemente loopen.

                              function zahlChecker(aForm) {
                                var test = parseInt(aForm.elements['anzahlNeu[]'].value);
                                if (aForm.elements['anzahlNeu[]'].value != test) {
                                   alert("Bitte nur Zahlen eingeben !");
                                   return false;
                                }
                                return true;
                              }

                              So würde der ja nur ein Array Element testen.

                              1. Hallo Anton,

                                Nein, ich muss doch durch die Arrayelemente loopen.

                                Das Problem ist nur, dass Du aus Javascript-Sicht gar kein Array hast (zumindest nicht so, wie Du dir das vorstellst), sondern der Name eines Formularelements ist ein ganz normaler String.

                                Jetzt hast Du zwei Möglichkeiten:

                                1. Du durchläüfst in einer Schleife _alle_ Formularelemente und prüfst, ob der Name
                                   des aktuellen Elements mit "anzahlNeu" beginnt:
                                   for (var i=0; i<aForm.elements.length; i++)
                                     if (aForm.elements[i].name.substring(0, 8) == "anzahlNeu") {
                                        ...
                                     }
                                   }
                                   (http://de.selfhtml.org/javascript/objekte/string.htm#substring) oder

                                2. Du schreibst serverseitig die Anzahl in eine Javascript-Variable
                                   var anz = <?php echo $anzahl ?>;
                                   (Ich weiss nicht genau, ob das so ganz korrekt ist, da ich kein PHP kann, aber
                                   das Prinzip sollte klar sein.)
                                   Dann kannst Du in deiner Funktion eine Schleife machen wie folgt:
                                   for (var i=0; i<anz; i++)
                                      var test = parseInt(aForm.elements['anzahlNeu[' + i + ']'].value);
                                      if (aForm.elements['anzahlNeu[' + i + ']'].value != test) {
                                         alert("Bitte nur Zahlen eingeben !");
                                         return false;
                                      }
                                      return true;
                                   }

                                So, das ist jetzt nicht getestet, aber so ungefähr sollte es gehen.

                                Grüße
                                Andreas

                                --
                                "Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning."
                                (Rich Cook)
                          2. Stimmt. Das ist ein Flüchtigkeitsfehler. Die gleiche Fehlermeldung kommt immernoch.

                            <Selbstkorrektur>
                            Da darf doch kein value hin. Es soll ja die Länge des Arrays ermittelt werden und nicht die Länge des Wertes des Eingabefeldes.
                            </Selbstkorrektur>