Taldrit: Einfache IF-Abfrage funktioniert nicht... warum?

Hallo zusammen,

ich hoffe jemand kann mir helfen. Ich bin langsam mit meinem Latein am Ende.
Ich habe hier ein einfaches Formular mit folgendem Feld drin:

<input type="text" name="Computername" size="50" onChange="checkname(this.value)">

Dann rufe ich ein Javascript auf (extra-Datei), welche auch so mit den anderen Funktionen einwandfrei arbeitet... jetzt mach ich die "checkname()-Funktion":

function checkname(namefield){
  var korrekt = /^GPC[0-9]{5}$/;

// Bis hierher läuft alles korrekt und laut vorherigen Tests mit alert() sind auch die Variablen hier alle korrekt bestückt, auch die Variable document.form.Computername.value.length ist mit der korrekten Zahl hinterlegt (in meinem Testfall 7).
// Schreibe ich jetzt eine Bedingung funktionieren auch evtl. alert()'s nicht mehr.

If(document.form.Computername.value.length<"8"){
    alert("Der Name ist zu kurz!");
    return false;
  } else {
    alert("Länge ist ok!");
  }
  If(!namefield.match(korrekt)){
    alert("Der Name ist nicht im korrekten Format!");
    return false;
  } else {
    alert("Der Name sollte so richtig sein!");
  }
}

Was mache ich falsch? Ich finde es nicht. Könnte es an den Browsereinstellungen liegen? Ist irgendwo ein usichtbares Zeichen drin? Ich habs mit Notepad geöffnet, sollte also dann zu sehen sein... ich weiß mir keinen Rat mehr.

  1. Hallo Taldrit,

    If(document.form.Computername.value.length<"8"){

    ^^
        if

    Grüße,
    Thomas

    1. If(document.form.Computername.value.length<"8"){

      Außerdem solltest du die Anführungsstriche weglassen, denn die Länge ist eine Zahl und kein String. In JavaScript ist das zwar (imho) kein logischer Fehler, denn die Variablentypen werden (ungefragt und oft auch deinen Wünschen entsprechend) passend umgewandelt.

      In anderen Programmiersprachen fällt dir das dann aber auf die Füße.

      Matthias

      --
      Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Rat und Ratsche.

      1. Hallo,

        If(document.form.Computername.value.length<"8"){
        Außerdem solltest du die Anführungsstriche weglassen, denn die Länge ist eine Zahl und kein String.

        richtig, und sowas sieht man öfter - warum eigentlich? Wie kommt man auf so eine Idee?

        In JavaScript ist das zwar (imho) kein logischer Fehler, denn die Variablentypen werden (ungefragt und oft auch deinen Wünschen entsprechend) passend umgewandelt.

        Auch in Javascript kann das sehr unerwartete Ergebnisse liefern - vor allem dann, wenn der erste Operand tatsächlich ein String ist, der Programmierer aber mit seinen Gedanken bei einem Zahlenwert ist:

        if (document.forms[...].age.value<"6")

        Hier mag sich der Programmierer irgendwann fragen, warum die Abfrage zutrifft, obwohl er doch im Testlauf 18 eingegeben hat, was ganz sicher größer als 4 ist.

        In anderen Programmiersprachen fällt dir das dann aber auf die Füße.

        In JS unter Umständen auch, wie man sieht.

        Ciao,
         Martin

        --
        Abraham sprach zu Bebraham: Kann i mal dei Cebra ham?
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Om nah hoo pez nyeetz, Der Martin!

          In JavaScript ist das zwar (imho) kein logischer Fehler, denn die Variablentypen werden (ungefragt und oft auch deinen Wünschen entsprechend) passend umgewandelt.

          Auch in Javascript kann das sehr unerwartete Ergebnisse liefern - vor allem dann, wenn der erste Operand tatsächlich ein String ist, der Programmierer aber mit seinen Gedanken bei einem Zahlenwert ist:

          Immer dann wenn die automatische Typumwandlung anders arbeitet als man gerade denkt.

          Insofern ist es bei Programmiersprachen, die nicht lose typisiert sind, sogar weniger gefährlich, denn da sollte es einen Programmabbruch nebst Fehlermeldung geben.

          Matthias

          --
          Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Lego und Legolas.

        2. Hallo "Der Martin",

          Auch in Javascript kann das sehr unerwartete Ergebnisse liefern - vor allem dann, wenn der erste Operand tatsächlich ein String ist, der Programmierer aber mit seinen Gedanken bei einem Zahlenwert ist:

          if (document.forms[...].age.value<"6")

          Hier mag sich der Programmierer irgendwann fragen, warum die Abfrage zutrifft, obwohl er doch im Testlauf 18 eingegeben hat, was ganz sicher größer als 4 ist.

          URGS!

            
          alert("18" < "4");   //true !  
          alert("18" < 4);     //false  
          alert(18 < "4");     //false  
          alert(18 < 4);       //false  
          
          

          kleine Ergänzung: und da .value ja immer strings zurückgibt... Aber ich mußte auch erst testen, was du meinst, weil mir wiederum nicht klar war, dass JS auch Strings direkt vergleicht. Ich hatte irgendwie erwartet, dass zuerst aus "18" ein Integer 18 wird, dann "4" zu Integer 4 konvertiert wird und dann der Vergleich stattfindet. Schön. Wieder was gelernt (ich hoffe, dass mir das auch wieder einfällt, wenn der Code etwas umfangreicher ist ;-)). Vielen Dank

          mbr

          1. Hallo,

            alert("18" < "4");   //true !

            alert("18" < 4);     //false
            alert(18 < "4");     //false
            alert(18 < 4);       //false

            
            >   
            > kleine Ergänzung: und da .value ja immer strings zurückgibt...  
              
            eben, und daran denkt man oft nicht. "Wieso? Ist doch eine Zahleneingabe!"  
              
            
            > Aber ich mußte auch erst testen, was du meinst, weil mir wiederum nicht klar war, dass JS auch Strings direkt vergleicht. Ich hatte irgendwie erwartet, dass zuerst aus "18" ein Integer 18 wird, dann "4" zu Integer 4 konvertiert wird und dann der Vergleich stattfindet.  
              
            Und wie sollte dann der Vergleich `"David"<"Goliath"`{:.language-javascript} ablaufen? Erst beide Strings in Integer wandeln, dabei 0 herausbekommen, und dann behaupten, sie seien gleich? Nee, JS macht zwar manchmal sehr eigenwillige Dinge, aber ein Stringvergleich ist "pretty straightforward".  
              
            Ciao,  
             Martin  
            
            -- 
            Keine Sorge, wir finden für jede Lösung ein Problem.  
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            
            1. Hallo Martin,

              Und wie sollte dann der Vergleich "David"<"Goliath" ablaufen? Erst beide Strings in Integer wandeln, dabei 0 herausbekommen, und dann behaupten, sie seien gleich? Nee, JS macht zwar manchmal sehr eigenwillige Dinge, aber ein Stringvergleich ist "pretty straightforward".

              hm, naja, ich finde einen Größenvergleich von Strings sowieso etwas unintuitiv (obwohl molily ja sehr schön erklärt hat, nach welchen Schema das ganze abläuft - aber "Riese"<"Zwerg" finde ich auch nicht gerade toll ;-) ).

              Viele Grüße

              mbr

              1. @@mbr:

                nuqneH

                aber "Riese"<"Zwerg" finde ich auch nicht gerade toll ;-)

                "acht" < "neun" < "zehn" – Stimmt doch.

                Qapla'

                --
                „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                1. Hi,

                  aber "Riese"<"Zwerg" finde ich auch nicht gerade toll ;-)

                  "acht" < "neun" < "zehn" – Stimmt doch.

                  Und Brüche kann man kürzen, indem man im Zähler und Nenner einfach identische Ziffern streicht:

                  16/64 -> 1/4 paßt
                  26/65 -> 2/5 paßt
                  49/98 -> 4/8 paßt
                  19/95 -> 1/5 paßt
                  22/121 -> 2/11 paßt
                  145/435 -> 1/3 paßt
                  ...

                  cu,
                  Andreas

                  --
                  Warum nennt sich Andreas hier MudGuard?
                  O o ostern ...
                  Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          2. Hallo,

            Ich hatte irgendwie erwartet, dass zuerst aus "18" ein Integer 18 wird, dann "4" zu Integer 4 konvertiert wird und dann der Vergleich stattfindet.

            In der ECMAScript-Spezifikation ist definiert, wie der Kleiner-als-Operator funktioniert:

            http://es5.github.io/#x11.8.1
            http://es5.github.io/#x11.8.5

            1. Else, both px and py are Strings

            Wenn beide Operanden Strings sind…

            a. If py is a prefix of px, return false.

            "Donaudampfschiff" < "Donau" => false

            b. If px is a prefix of py, return true.

            "Donau" < "Donaudampfschiff" => true

            c. Let k be the smallest nonnegative integer such that the character at position k within px is different from the character at position k within py.

            "abc" < "def"

            k = 0 (denn »a« ist ungleich »d«)

            d. Let m be the integer that is the code unit value for the character at position k within px.

            m = "a".charCodeAt(0)
            m = 97

            e. Let n be the integer that is the code unit value for the character at position k within py.

            n = "d".charCodeAt(0)
            n = 100

            f. If m < n, return true. Otherwise, return false.

            97 < 100
            => true

            "abc" < "def" => true, weil »a« eine kleinere Unicode-Nummer hat als »b«.

            Mathias

            1. Hi!

              "abc" < "def" => true, weil »a« eine kleinere Unicode-Nummer hat als »b«.

              Als »d«, oder?

              --
              Signaturen sind bloed.
              1. "abc" < "def" => true, weil »a« eine kleinere Unicode-Nummer hat als »b«.

                Als »d«, oder?

                Ja, das meinte ich. :)

                ("a" < "b" ergibt natürlich auch true)

                Mathias

            2. @@molily:

              nuqneH

              "abc" < "def" => true, weil »a« eine kleinere Unicode-Nummer hat als »b«.

              Und damit sind String-Vergleiche ziemlich unbrauchbar, weil "ä" < "b" => false, was für die deutsche Sprache nicht stimmt. In anderen Sprachen sind Umlaute aber tatsächlich hinter z eingeordnet.

              Qapla'

              --
              „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
              1. Meine Herren,

                "abc" < "def" => true, weil »a« eine kleinere Unicode-Nummer hat als »b«.

                Und damit sind String-Vergleiche ziemlich unbrauchbar, weil "ä" < "b" => false, was für die deutsche Sprache nicht stimmt. In anderen Sprachen sind Umlaute aber tatsächlich hinter z eingeordnet.

                Dem hat sich das TC39 auch inzwischen angenommen: http://www.2ality.com/2013/09/ecmascript-i18n-api.html
                Implementationen sind aber mau.

      2. If(document.form.Computername.value.length<"8"){

        Außerdem solltest du die Anführungsstriche weglassen, denn die Länge ist eine Zahl und kein String. In JavaScript ist das zwar (imho) kein logischer Fehler, denn die Variablentypen werden (ungefragt und oft auch deinen Wünschen entsprechend) passend umgewandelt.

        In anderen Programmiersprachen fällt dir das dann aber auf die Füße.

        Matthias

        Ok, hast Recht, ich versuch auch hier etwas sauberer zu arbeiten... hab das wohl gemacht, weil es in einem Beispiel so stand ^^

    2. Hallo Taldrit,

      If(document.form.Computername.value.length<"8"){
          ^^
          if

      Grüße,
      Thomas

      Verdammt... danke... eine einfache Groß-/Kleinschreibung bricht mir hier auf der Arbeit das Genick... args... danke vielmals...

  2. @@Taldrit:

    nuqneH

    sollte also dann zu sehen sein... ich weiß mir keinen Rat mehr.

    Andere Schriftart einstellen, bei der Zeichen besser unterscheidbar sind?

    Den Fehler hätte dir auch die Fehlerkonsole deines Browswers sagen sollen. Einfach mal reinschauen, ist besseres Debugging als im Forum fragen. ;-)

    Aber warum verwendest du überhaupt JavaScript anstatt das @pattern-Attribut?

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)