Matze: nur Zahlen in <input> zulassen

0 57

nur Zahlen in <input> zulassen

Matze
  • javascript
  1. 0
    Gunnar Bittersmann
    1. 0
      Matze
      1. 0
        Gunnar Bittersmann
        • design/layout
        1. 0
          Matze
          1. 0
            Gunnar Bittersmann
            1. 0
              Matze
              1. 0
                Gunnar Bittersmann
                1. 1
                  Jaroslav Jablonski
                  1. 0
                    dr.colossos
                    1. 0
                      Matze
                  2. 0
                    Gunnar Bittersmann
                    1. 0
                      Jaroslav Jablonski
                    2. 0
                      Der Martin
              2. 0
                Matze
                1. 0
                  Gunnar Bittersmann
                  1. 0
                    Matze
                    1. 0
                      Hopsel
                      1. 0
                        Matze
                        • javascript
                        1. 0
                          Hopsel
                          1. 0
                            Matze
                    2. 0
                      Gunnar Bittersmann
                      1. 0
                        Matze
                        • menschelei
              3. 0
                Hopsel
                1. 0
                  Matze
        2. 0
          Matze
    2. 0
      Dr.Colossos
      1. 0
        Matze
  2. 0
    Christian S.
    1. 0
      Matze
      1. 0
        Christian S.
        1. 0
          Matze
          1. 0
            Matze
  3. 0
    Maxx
    1. 0
      Matze
      1. 0
        Maxx
        1. 0
          Matze
          1. 0
            Christian S.
            1. 0
              Christian S.
              1. 0
                Matze
                1. 0
                  Christian S.
                  1. 0
                    Matze
                    1. 0
                      Christian S.
                      1. 0
                        Matze
                        1. 0
                          Christian S.
                          1. 0
                            Matze
                      2. 0
                        Matze
                        1. 0
                          Christian S.
                          1. 0

                            doch noch/endlich geschafft Danke!

                            Matze
                            1. 0
                              Gunnar Bittersmann
                              1. 0
                                Christian S.
                                1. 0
                                  Matze
            2. 0

              Danke schön!!

              Matze
              1. 0
                Christian S.
                1. 0
                  Matze
  4. 0

    Aufgegeben - neuer Lösungsweg

    Matze
    • html
    1. 0
      at

Hallo und guten Morgen!

Jaja... ich spiel immernoch mit JS rum und lerne stündlich dazu ;)

Im Moment versuch ich mich daran ein Eingabefeld für Datumsangaben "aufzupeppen". Wie der Titel bereits aussagt, möchte ich alles was nicht 0-9 entspricht "on-the-fly" unterbinden.

Meine erste Idee ist onkeyup="onlyNum(this.value)"

und die entsprechende Funktion (Pseudocode)

  
function onlyNum(vari) {  
 wenn(nicht_numerisch(vari)) cursor.position = -1;  
}  

Tja, das scheint mir aber doch ein bisschen einfach. Es wird wohl auch nicht reichen, die Cursorposition um eine Stelle zu verrücken. Ich werde wohl auch noch das zuletzt eingegebene Zeichen ermitteln und ggf. löschen müssen.

Desweiteren weiß ich nicht ob es für JavaScript eine Funktion ähnlich dem is_numeric() von PHP gibt oÔ

Benutz ich überhaupt den richtigen Event-Handler?
Könnte mir bitte wieder jemand ein paar Tipps geben?

Danke für eure Hilfe!

Grüße, Matze

  1. @@Matze:

    Im Moment versuch ich mich daran ein Eingabefeld für Datumsangaben "aufzupeppen". Wie der Titel bereits aussagt, möchte ich alles was nicht 0-9 entspricht "on-the-fly" unterbinden.

    ?? Nutzer werden bei Datumsangaben aber auch Trennzeichen ('-', '.', evtl. auch '/') eingeben.

    Live long and prosper,
    Gunnar

    --
    Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.
    1. Hallo Gunnar!

      ?? Nutzer werden bei Datumsangaben aber auch Trennzeichen ('-', '.', evtl. auch '/') eingeben.

      Warum sollten sie das? Du denkst an Trennzeichen? Die fallen dadurch weg, dass ich 3 Felder angelegt habe. TT-MM-YYYY.
      Mein nächster Plan wäre dann, dass der Fokus bei korrekt ausgefüllten Feld zum nächsten Springt. Damit nerv ich euch aber später falls ich es nicht hin krieg. Eigentlich muss ich nur die Stringlänge abfragen und dann den Fokus an das nächste Feld übergeben. Sollte kein Problem werden.

      Bedenken zerstreut?

      Danke und Grüße, Matze

      1. @@Matze:

        Warum sollten sie das? Du denkst an Trennzeichen? Die fallen dadurch weg, dass ich 3 Felder angelegt habe.

        Das solltest du ändern. (Kurzversion, Langversion)

        TT-MM-YYYY.

        Ich finde es immer ärgerlich, ein Datumsformat aufgezwungen zu bekommen, das ich sonst nicht benuzte.

        Bedenken zerstreut?

        Nein, geschürt.

        Live long and prosper,
        Gunnar

        --
        Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.
        1. Hallo Gunnar!

          Bedenken zerstreut?

          Nein, geschürt.

          Manchmal wirkst du dogmatisch :(
          IMHO gibt es für Datumsangaben gewisse Standards und Normen.

          Grüße, Matze

          1. @@Matze:

            Manchmal wirkst du dogmatisch :(

            Indem ich Argumente zum Nachdenken liefere? Passt wohl kaum mit „Dogma“ zusammen.

            IMHO gibt es für Datumsangaben gewisse Standards und Normen.

            Eben. Und das DIN sagt, für Deutschland gilt die Norm "YYYY-MM-TT".

            Live long and prosper,
            Gunnar

            --
            Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.
            1. Hallo Gunnar!

              Indem ich Argumente zum Nachdenken liefere?

              Nein, indem du manchmal von dir auf _alle_ schließt. Zumindest wirkt es manchmal so.

              Eben. Und das DIN sagt, für Deutschland gilt die Norm "YYYY-MM-TT".

              Touchê! Bin ich echt so dämlich? Wann wurde das eingeführt?
              Dann könnte man die Reihenfolge der Inputs auch einfach drehen ;D

              Danke und Grüße, Matze

              1. @@Matze:

                Eben. Und das DIN sagt, für Deutschland gilt die Norm "YYYY-MM-TT".

                Touchê! Bin ich echt so dämlich? Wann wurde das eingeführt?

                1996.

                Live long and prosper,
                Gunnar

                --
                Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.
                1. 1996.

                  Eine Norm, die sich auch mehr als 10 Jahre nach ihrer Einführung nicht flächendeckend durchgesetzt hat, ist überflüssig wie ein Kropf.

                  ~JJ

                  1. Hi Matze,

                    Ich weiss ja nicht ob du eine User-Verwaltung bei deinem Projekt mit dabei hast, dann könntest ggf. die Datumsformate des Users speichern, und gegen das validieren.

                    Das einzige Problem dass ich mit dem Aufblähen des Datumsfeldes in drei Felder sehe, ist, wenn es eine FÜLLE dieser Felder gibt, da vorallem Gecko-Browser mit vielen Form-Elementen was zu tun haben.

                    Aber solange du keine Hundertschaft dieser auf einer Seite anzeigst ist das meiner Meinung nach ganz okay.

                    Auch weiss ich leider nicht, ob das nur so ein Hobby-Ding ist, aber was spricht gegen einen JavaScript-Kalender (ausser JavaScript ansich, aber das brauchst ja mit deiner Lösung auch). Dann entfällt jegliche Validierung ...

                    Andere Lösung wären auch zwei/drei Select-Boxen für Tag, Monat, Jahr, deren Inhalt du auch interaktiv updaten könntest ... [31].[1].[2007] auf [31].[2].[2007] -> Fehler! -> evtl.automatische Korrektur ...

                    Viel Erfolg!

                    1. Hallo!

                      Ich weiss ja nicht ob du eine User-Verwaltung bei deinem Projekt mit dabei hast, dann könntest ggf. die Datumsformate des Users speichern, und gegen das validieren.

                      Auch keine schlechte Idee. Da entscheidet der User einmalig wie er "global" arbeiten will. Da werde ich mal im Hinterkopf behalten. Danke!

                      Aber solange du keine Hundertschaft dieser auf einer Seite anzeigst ist das meiner Meinung nach ganz okay.

                      So an die 50 werden es werden falls ich das Projekt wirklich fertig mache :)

                      Auch weiss ich leider nicht, ob das nur so ein Hobby-Ding ist, aber was spricht gegen einen JavaScript-Kalender...

                      Also genau genommen erstell ich grad eine Menge kleinerer Funktionen etc. die ich universell verwenden kann und werde. Im Hinterkopf habe ich dabei ein etwas größeres Projekt für welches mir aber noch einiges Wissen fehlt. Vor allem was das JavaScript angeht. HTML, CSS und PHP stellen da nicht so das Problem dar.
                      Den Kalender brauch ich hier nicht denk ich. Es soll sich tatsächlich nur um 3 Felder oder halt 1 für die Möglichkeit einer Datumseingabe handeln.

                      Andere Lösung wären auch zwei/drei Select-Boxen für Tag, Monat, Jahr, deren Inhalt du auch interaktiv updaten könntest ... [31].[1].[2007] auf [31].[2].[2007] -> Fehler! -> evtl.automatische Korrektur ...

                      Auch nicht schlecht, hab ich auch schon realisiert aber ist hier eher von Nachteil.

                      Viel Erfolg!

                      Danke und Grüße, Matze

                  2. @@Jaroslav Jablonski:

                    Eine Norm, die sich auch mehr als 10 Jahre nach ihrer Einführung nicht flächendeckend durchgesetzt hat, ist überflüssig wie ein Kropf.

                    Soso, du findest das metrische Einheitensystem also überflüssig, nur weil es sich in den USA auch nach einem halben Jahrhundert immer noch nicht flächendeckend durchgesetzt hat?

                    (Und das haben sie davon.)

                    Live long and prosper,
                    Gunnar

                    --
                    Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.
                    1. Soso, du findest das metrische Einheitensystem also überflüssig, nur weil es sich in den USA auch nach einem halben Jahrhundert immer noch nicht flächendeckend durchgesetzt hat?

                      Genauso ist es, dein Link zeigt es. Was nützen Standards, an die sich keiner hält? ISt doch mit HTML genauso.

                      ~JJ

                    2. Hallo,

                      Soso, du findest das metrische Einheitensystem also überflüssig, nur weil es sich in den USA auch nach einem halben Jahrhundert immer noch nicht flächendeckend durchgesetzt hat?

                      ja, es ist immer kritisch zu betrachten, wenn man Menschen etwas Neues aufzwängen will, obwohl sie zeitlebens etwas anderes gewöhnt sind.

                      (Und das haben sie davon.)

                      Genau. Wären sie mal einheitlich bei ihren vertrauten Gallons geblieben.

                      Zu Maßeinheiten sage ich nur: Solange die Umrechnungsfaktoren eindeutig festgelegt sind, ist es völlig wurscht, wer welche Einheiten benutzt.
                      Sollen doch die Atomphysiker weiterhin ihre Ångströms, die Elektroniker ihre mil, die Informatiker ihre Inches, die Mediziner ihr Torr und Briten ihre Meilen verwenden.

                      Schönen Abend noch,
                       Martin

                      --
                      Wenn du beim Kochen etwas heißes Wasser übrig hast, friere es ein.
                      Heißes Wasser kann man immer gebrauchen.
              2. Schon wieder hallo Gunnar ;)

                Eben. Und das DIN sagt, für Deutschland gilt die Norm "YYYY-MM-TT".

                Laut Wikipedia ist TT-MM-YYYY optional und nicht falsch.
                Ich denke im deutschsprachigen Raum sogar verbreiteter. Da würde ich aber auch von mir auf alle schließen... Ok, jetzt hast du mich was die 3 Felder betrifft in der Zwickmühle.

                Die "on-the-fly"-Prüfung hätte ich aber trotzdem gern. Also zurück zum OP :|
                Wie wäre die richtige Vorgehensweise?

                Danke für deine Hilfe!

                Grüße, Matze

                1. @@Matze:

                  Laut Wikipedia ist TT-MM-YYYY optional und nicht falsch.
                  Ich denke im deutschsprachigen Raum sogar verbreiteter. Da würde ich aber auch von mir auf alle schließen... Ok, jetzt hast du mich was die 3 Felder betrifft in der Zwickmühle.

                  Also wie wär’s denn mit EINEM Eingabefeld, das sowohl "YYYY-MM-TT" als auch "TT.MM.JJJJ" zulässt? Das Jahr vierstellig anzugeben, dürfte nicht zu viel verlangt sein. Dann sind auch keine Mehrdeutigkeiten möglich.

                  Die "on-the-fly"-Prüfung hätte ich aber trotzdem gern.

                  Kannste ja machen. Außer Ziffern dann eben auch die Trennzeichen zulassen.

                  Live long and prosper,
                  Gunnar

                  --
                  Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.
                  1. Hallo Gunnar!

                    Also wie wär’s denn mit EINEM Eingabefeld, das sowohl "YYYY-MM-TT" als auch "TT.MM.JJJJ" zulässt? Das Jahr vierstellig anzugeben, dürfte nicht zu viel verlangt sein. Dann sind auch keine Mehrdeutigkeiten möglich.

                    Ja, du hast mich ja soweit. Auch wenn mich folgende Sätze von Wikipedia wieder ein Stück näher an meinen Standpunkt gebracht haben:

                    "Das neue Datumsformat nach ISO (Jahr-Monat-Tag) kollidierte jedoch mit den tatsächlichen Schreibgewohnheiten und konnte sich in den Jahren von 1996 bis 2000 nicht durchsetzen. Ähnlich wie in den meisten anderen europäischen Ländern wurde die Norm auch in Deutschland und Österreich weitgehend ignoriert, wo allgemein weiterhin das gewohnte Format TT.MM.[JJ]JJ in Gebrauch blieb. In der Ausgabe von 2001 der DIN 5008 wurde daraufhin eine Anmerkung eingefügt, wonach das gewohnte Format wieder zulässig sein sollte, „sofern keine Missverständnisse entstehen“."

                    Wenn also selbst die DIN davon abweicht die Gewohnheiten der Menschen nach 5 Jahren noch zu "korrigieren" zu versuchen, warum sollten wir jetzt damit anfangen? Zeigt nicht gerade dieses Beispiel, dass hierzulande TT-MM-YYYY sinvoller ist? Dabei wirkt eine Vorgabe auch eher wie ein Hinweis auf das richtige Format und nicht wie ein Zwang. Wirkt auf mich im ersten Moment positiv.

                    Die "on-the-fly"-Prüfung hätte ich aber trotzdem gern.

                    Kannste ja machen. Außer Ziffern dann eben auch die Trennzeichen zulassen.

                    Gut, wie? ^^ Ich find keinen wirklichen Ansatz.

                    Danke und Grüße, Matze

                    1. Hi Matze!

                      Gut, wie? ^^ Ich find keinen wirklichen Ansatz.

                      Wobei gibt´s denn da Probleme?

                      onchange
                      match
                      substr
                      length

                      MfG H☼psel

                      --
                      "It's amazing I won. I was running against peace, prosperity, and incumbency."
                      George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
                      Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
                      1. Hallo Hopsel!

                        Wobei gibt´s denn da Probleme?
                        onchange

                        Also ich wollte mit onkeyup arbeiten.

                        match

                        Ich habe jetzt

                          
                        function onlynum(self) {  
                         if(!self.match(/^[0-9]$/) && !self == "") {  
                          alert(self);  
                         }  
                        }
                        

                        und halt 1 Inputfeld mit onkeyup="onlynum(this.value)".
                        Ich dachte damit kann ich erstmal nach Zahlen filtern, aber der Alert kommt bei jeder 2-stelligen Zahl inkl. z.B. "05". Hab ich da was vergessen?

                        Danke für deine Hilfe!

                        Grüße, Matze

                        1. Hi Matze!

                          Ich dachte damit kann ich erstmal nach Zahlen filtern, aber der Alert kommt bei jeder 2-stelligen Zahl inkl. z.B. "05". Hab ich da was vergessen?

                          Ja, das Problem ist, dass du das gesamte Inputfeld überprüfst, aber nur eine Zahl im regulären Ausdruck vorgibst.

                          Ein ganz wichtiger Tipp, damit du deine Nutzer nicht verärgerst. Überprüfe das Eingabefeld erst beim Abschicken des Formulars, verhindere das Abschicken im Fall des Falls und weise auf die falsche Eingabe hin. Alles andere (wie z. B. die nervige Kontrolle während des Schreibens) besitzt Frustpotential.

                          Und so hast du den Vorteil, dass du einfach über den Eingabewert einen regulären Ausdruck laufen lässt und nicht beachten musst, wie der Nutzer das Feld gefüllt hat (Normale Eingabe, Copy&Paste [welches ja auch mit der Maus funktioniert]).

                          MfG H☼psel

                          --
                          "It's amazing I won. I was running against peace, prosperity, and incumbency."
                          George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
                          Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
                          1. Hi Matze!

                            Ich dachte damit kann ich erstmal nach Zahlen filtern, aber der Alert kommt bei jeder 2-stelligen Zahl inkl. z.B. "05". Hab ich da was vergessen?
                            Ja, das Problem ist, dass du das gesamte Inputfeld überprüfst, aber nur eine Zahl im regulären Ausdruck vorgibst.

                            Ich habe jetzt den onkeypress-Event genommen und den regulären Ausdruck um ein Sternchen erweitert:
                            if(!self.match(/[1]*$/)...
                                                  ^
                            Wenn ich jetzt einen Buchstaben eingebe passiert erstmal nichts. Erst ab dem zweiten wird der Alert ausgeführt. Versteh ich nicht oÔ

                            Ein ganz wichtiger Tipp, damit du deine Nutzer nicht verärgerst. Überprüfe das Eingabefeld erst beim Abschicken des Formulars, verhindere das Abschicken im Fall des Falls und weise auf die falsche Eingabe hin. Alles andere (wie z. B. die nervige Kontrolle während des Schreibens) besitzt Frustpotential.

                            Der Alert ist hier nur zur Kontrolle was passiert. Während des Betriebs sollen unerwünschte Zeichen einfach ignoriert werden. Wie gesagt erfolgt sowieso noch eine Serverseitige Prüfung. Eine vollständige JavaScript-Prüfung des Formulars will ich mir deshalb sparen.

                            Danke für deine Hilfe!

                            Grüße, Matze


                            1. 0-9 ↩︎

                    2. @@Matze:

                      Wenn also selbst die DIN davon abweicht die Gewohnheiten der Menschen nach 5 Jahren noch zu "korrigieren" zu versuchen, warum sollten wir jetzt damit anfangen?

                      Es wurde eine gute Chance verpasst.

                      Zeigt nicht gerade dieses Beispiel, dass hierzulande TT-MM-YYYY sinvoller ist?

                      Ich finde EIN internationales Datumsformat sinnvoller als dass es in jedem Land anders geschrieben wird.

                      Dabei wirkt eine Vorgabe auch eher wie ein Hinweis auf das richtige Format und nicht wie ein Zwang.

                      Es kann nicht sinnvoll, auf einer deutschen Webseite einzig das Format "JJJJ-MM-TT" zuzulassen. Aber eben auch nicht einzig "TT.MM.JJJJ".

                      Live long and prosper,
                      Gunnar

                      --
                      Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.
                      1. Hallo Gunnar!

                        Es wurde eine gute Chance verpasst.

                        Scheint ja ein running Gag bei dir zu sein :D
                        Vielleicht doch ein bisschen dogmatisch? ;)
                        Aber wahlen sind jedes Jahr, vllt. wirst du noch Kultusminister und kannst dich endlich durchsetzen. "Verpasst" ist noch nichts.

                        Es kann nicht sinnvoll, auf einer deutschen Webseite einzig das Format "JJJJ-MM-TT" zuzulassen. Aber eben auch nicht einzig "TT.MM.JJJJ".

                        ACK

                        Grüße, Matze

              3. Hi Matze!

                Indem ich Argumente zum Nachdenken liefere?
                Nein, indem du manchmal von dir auf _alle_ schließt. Zumindest wirkt es manchmal so.

                Ach was, sieh es als Vorschlag.

                Ich kann Gunnars Argumente auch nicht uneingeschränkt nachvollziehen.
                Denn m. E. mag es der Nutzer, wenn er genau Vorgaben bekommt: Hier das Jahr in diesem Format, hier der Monat bitte in folgendem Format, und da noch den Tag genau so (nicht genauso ;-) ) eintragen.

                Wenn stattdessen steht: Du kannst machen was du willst, ich finde es schon irgendwie raus, dann verunsichert das eher und führt zu Frust, wenn man als Trenner irgendwas verwendet, was nicht vorgesehen war. Das nämlich ist das Problem bei Gunnars Methode: Man kann nicht alle Gewohnheiten aller Nutzer abfangen. Zumindest wird die Fehleranfälligkeit erhöht.

                Deshalb solltest du deine Methode nutzen, da sie für dich leichter zu kontrollieren ist und du trotzdem dem Benutzer eine einfache (gemeint ist stressfreie, da die Konventionen klar ersichtlich sind) Eingabe ermöglichst.

                MfG H☼psel

                --
                "It's amazing I won. I was running against peace, prosperity, and incumbency."
                George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
                Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
                1. Hallo Hopsel!

                  Ach was, sieh es als Vorschlag.

                  Klar, keine Angst. Ich bin natürlich für jeden Verbesserungsvorschlag offen. Kritik steht jedem frei.

                  Wenn stattdessen steht: Du kannst machen was du willst, ich finde es schon irgendwie raus, dann verunsichert das eher und führt zu Frust, wenn man als Trenner irgendwas verwendet, was nicht vorgesehen war. Das nämlich ist das Problem bei Gunnars Methode: Man kann nicht alle Gewohnheiten aller Nutzer abfangen. Zumindest wird die Fehleranfälligkeit erhöht.

                  Nun gut, sooo viele Trennzeichen gibt es ja nicht^^
                  Zur Not könnte man auch das Trennzeichen vorgeben statt der Reihenfolge ;)
                  Aber den Rest befürchte ich auch. Verwirrung an allen Ecken und Enden. Der User ist es nunmal gewohnt für Eingaben verschiedener Daten (hier z.B. Tag und Monat) auch verschiedene Felder zur Verfügung zu haben. Ich stell mir schon Eingaben wie 070508 vor wenn man _nicht_ auf eine 4-stellige Jahreszahl prüft (sollte natürlich kein Problem sein). Soll das nun der 08. Mai 2007 sein oder der 07. Mai 2008...

                  Danke für deine Meinung!

                  Bin aber trotzdem noch kein Stück näher an der Lösung meines Problems :(

                  Grüße, Matze

        2. Hallo Gunnar!

          Nach der kurzen Version hier noch die lange.

          Ich müsste dann auch für "ganz kreative" solche Datumsangaben wie 24. März berücksichtigen (Geburtstag von Nena ^^). Das will ich aber nicht. Und bedeutet mehr Aufwand beim Programmieren als es dem User von vorn herein zu verbieten und dagegen zu prüfen. Weiter wäre dann March 24 zu berücksichtigen etc. Ist das sinnvoll? Für den Fall einer späteren Internationalisierung - eher nicht.

          Du beschreibst hier eine wilde Tipp- und Klickorgie nur weil 3 Felder nebeneinander stehen. Das find ich doch arg übertrieben. Zumal ich dir erklärt habe, dass ich vorhabe den Fokus bei korrekter Eingabe automatisch auf das nächste Feld zu setzen.
          Du hast also die Möglichkeit einfach 2403 zu tippen anstatt 24 - Tab o. Mausklick - 03. Rückwärts ist das genauso möglich. Auch wenn es minimal erscheint, find ich es eine Ecke komfortabler.

          Es erscheint mir unlogisch im deutsch-sprachigen Raum User mit einer Vorliebe für exotische Datumsformate und Tastaturlayouts zu bevorzugen.

          Davon abgesehen, stände ich so oder so vor dem selben Problem.
          Wie frage ich "on-the-fly" hab ob nur gültige Zeichen im Feld stehen, angenommen ich lasse nur 0-9 und .,/- zu? Das Problem ist das Gleiche.

          Danke und Grüße, Matze

    2. Hi,

      ich lass mich gerne belehren, aber die cursor position kannst du glaub ich nicht setzen, oder?

      Ich denke du müsstest nach jeder validen Eingabe den aktuellen Wert des Feldes wegsichern, und wenn als nächstes ein invalider Wert kommt, auf den vorherigen zurück springen.

      Einfacher wär's vielleicht die gesamte Eingabe abzuwarten, und den check bei onblur zumachen ...

      Viel Erfolg!

      1. Hallo!

        ich lass mich gerne belehren, aber die cursor position kannst du glaub ich nicht setzen, oder?

        Soweit ich weiß schon^^
        Ich hab hier noch ein Script um BB-Code einzufügen. Ich versteh es nur nich ganz, aber da steht:

        /* Anpassen der Cursorposition */
            var pos;
            if (insText.length == 0) {
              pos = start + aTag.length;
            } else {
              pos = start + aTag.length + insText.length + eTag.length;
            }
            input.selectionStart = pos;
            input.selectionEnd = pos;

        Die Variable aTag enthält den Starttag zB. [bbcode] und eTag den Abschlußtag z.B. [/bbcode], insText enthält den Text dazwischen. Ich will nicht den kompletten Code posten, aber es scheint zu funktionieren ;)

        Einfacher wär's vielleicht die gesamte Eingabe abzuwarten, und den check bei onblur zumachen ...

        Ich weiß, genau das will ich aber nicht. Zum späteren Zeitpunkt wird sowieso noch Serverseitig geprüft und deshalb wollte ich mir onblur oder onchange sparen und fand es so komfortabler.

        Danke für deine Hilfe!

        Grüße, Matze

  2. Hi,

    hab mir hier nicht alles durchgelesen, aber verwende das keypress Event.

    Wurde das schon vorgeschlagen?

    Dort hast du charCode oder keyCode (je nach Browser), daraus machst du mit String.fromCharCode das Zeichen.

    Und das überprüfst du mit nem Regularen Ausdruck auf einen Wert zwischen 0-9.

    Und wenns keine Zahl ist musst du das Event unterdrücken, mittels preventDefault/returnValue= false oder return false, je nach Implementierung deines Events.

    Funktioniert auf jeden Fall, habe auch schon so gemacht.

    Das ist besser als beim keyup Event, da man dort ja auch bei gedrückter Keytaste, mehrere Zeichen einfügen könnte, und man sieht ständig für einen kurzen Moment das Zeichen.

    Gruß!

    1. Hallo Christian!

      hab mir hier nicht alles durchgelesen, aber verwende das keypress Event.
      Wurde das schon vorgeschlagen?

      Nein, danke!

      Dort hast du charCode oder keyCode (je nach Browser), daraus machst du mit String.fromCharCode das Zeichen.

      Meinst du charCodeAt()?
      und wenn ich im Beispiel von keycode() eine Taste drücke erscheint immer ein Alert mit "0".

      Müsste ich sowas machen?

        
      function onlynum(self){  
         var foo = self.keyCode;  
         var bar = String.fromCharCode(foo);  
         if(!bar.match(/^[0-9]$/) && !self == "") {  
            alert(self);  
         }  
      }  
      
      

      Hm nee... da seh ich selbst schon, dass das irgendwie so nichts wird....
      Ich versteh die 3 von dir genannten Funktionen nicht ganz :(
      charCodeAt() erwartet z.B. einen Parameter. Hab ich denn einen? Woher weiß ich welche Stelle ich brauch oder kommt dort immer "0" rein?

      mittels preventDefault/returnValue= false oder return false, je nach Implementierung deines Events.

      Bahnhof. Oder meinst du einfach am Ende der Funktion ein return false; rein und fertig?

      Funktioniert auf jeden Fall, habe auch schon so gemacht.

      Ich glaub ich brauch bis dahin noch ein bisschen Hilfe.

      Danke und Grüße, Matze

      1. Hallo Christian!

        hab mir hier nicht alles durchgelesen, aber verwende das keypress Event.
        Wurde das schon vorgeschlagen?

        Nein, danke!

        Dort hast du charCode oder keyCode (je nach Browser), daraus machst du mit String.fromCharCode das Zeichen.

        Meinst du charCodeAt()?

        Nein. fromCharCode

        und wenn ich im Beispiel von keycode() eine Taste drücke erscheint immer ein Alert mit "0".

        Es kommt halt auf den Browser an. IE hat den Character Code beim keypress in keyCode, andere in charCode.

        Siehe hier.

        Müsste ich sowas machen?

        function onlynum(self){
           var foo = self.keyCode;
           var bar = String.fromCharCode(foo);
           if(!bar.match(/[1]$/) && !self == "") {
              alert(self);
           }
        }

          
        Ja, so in etwa.  
          
        eher so:  
          
        ~~~javascript
          
        function onlynum(e){  
            var foo = e.charCode || e.keyCode;  
            var bar = String.fromCharCode(foo);  
            if(!bar.match(/^[0-9]$/)) {  
               e.preventDefault(); // je nach Browser und Eventregistrierung  
            }  
         }  
        
        

        Hm nee... da seh ich selbst schon, dass das irgendwie so nichts wird....
        Ich versteh die 3 von dir genannten Funktionen nicht ganz :(
        charCodeAt() erwartet z.B. einen Parameter. Hab ich denn einen? Woher weiß ich welche Stelle ich brauch oder kommt dort immer "0" rein?

        String.fromCharCode brauchst du, wie gesagt.

        mittels preventDefault/returnValue= false oder return false, je nach Implementierung deines Events.

        Bahnhof. Oder meinst du einfach am Ende der Funktion ein return false; rein und fertig?

        Vielleicht hilft das: < http://www.quirksmode.org/js/events_early.html>
        und die vielen anderen hilfreichen Artikel auf quirksmode.org zum Event Modell.

        Gruß!


        1. 0-9 ↩︎

        1. Hallo Christian!

          eher so:

          function onlynum(e){
              var foo = e.charCode || e.keyCode;
              var bar = String.fromCharCode(foo);
              if(!bar.match(/[1]$/)) {
                 e.preventDefault(); // je nach Browser und Eventregistrierung
              }
          }

            
          Also zunächst besteht immer noch das Problem, dass die if Abfrage erst nach dem 2ten falschen Zeichen greift. Das erscheint mir mittlerweile auch logisch weil der EventHandler greift bevor der Inhalt geschrieben wird. Also wird z.B. beim ersten Tastendruck mit onkeypress="onlynum(this.value)" nichts übertragen, später dann immer der Wert den ich eigentlich abfangen wollte.  
            
          Ein anderes Problem ist jetzt, dass preventDevault() keine Funktion ist.  
          Bis auf diese Meldung in der Fehlerkonsole bei einem falschen Zeichen passiert erstmal gar nichts mehr.  
            
          Also 1 Problem gelöst, 2 neue :(  
            
          
          > Vielleicht hilft das: <http://www.quirksmode.org/js/events_early.html>  
          > und die [vielen anderen hilfreichen Artikel auf quirksmode.org zum Event Modell](http://www.quirksmode.org/js/contents.html#events).  
            
          Ich versuch mich zu belesen, danke!  
            
          Grüße, Matze
          

          1. 0-9 ↩︎

          1. Hallo Christian!

            eher so:

            function onlynum(e){
                var foo = e.charCode || e.keyCode;
                var bar = String.fromCharCode(foo);
                if(!bar.match(/[1]$/)) {
                   e.preventDefault(); // je nach Browser und Eventregistrierung
                }
            }

              
            Ich muss mich korrigieren, ich hatte einen Tippfehler.  
            Bei jedem Tastendruck, egal ob Buchstabe oder Zahl trift jetzt die If-Abfrage zu :( Es wäre also alles falsch.  
              
              
            Danke für deine Hilfe!  
              
            Grüße, Matze  
              
              
            PS: Mit englischen Seiten kann ich nicht so viel anfangen :( Trotzdem danke für die Links. hm...
            

            1. 0-9 ↩︎

  3. Hallo Matze,

    Im Moment versuch ich mich daran ein Eingabefeld für Datumsangaben "aufzupeppen". Wie der Titel bereits aussagt, möchte ich alles was nicht 0-9 entspricht "on-the-fly" unterbinden.

    keydown wurde ja schon angesprochen. Dir ist aber klar das du neben den Zahlen zumindest noch "Backspace" zum löschen und die Cursortasten zulassen solltest? Und wenns richtig funktionieren soll muss du auch noch das einfügen (Strg+V) unterbinden. Einen Ansatz findest du hier:

    http://electric-lemon.de/self/input.html

    HTH

    Jochen

    --
    Kritzeln statt texten: Scribbleboard
    1. Hallo Jochen!

      keydown wurde ja schon angesprochen. Dir ist aber klar das du neben den Zahlen zumindest noch "Backspace" zum löschen und die Cursortasten zulassen solltest? Und wenns richtig funktionieren soll muss du auch noch das einfügen (Strg+V) unterbinden. Einen Ansatz findest du hier:
      http://electric-lemon.de/self/input.html

      Danke! Im ersten Moment dachte ich "kopieren und fertig". Das ist genau das, was ich haben will.
      Ich hab aber keine Ahnung wie das Script auf das Input-Element zugreift.
      Im Script taucht weder der Elmentname, noch ein "input" auf. Einen Eventhandler gibts im input-Tag auch nicht.
      Welchem Element würde das Script eigentlich nur Zahlen erlauben wenn ich mehrere Input-Elemente habe?

      Aber du hast recht, Cursortasten wären nicht schlecht. Insgesamt ist es sicher nur noch Copy und Paste was erlaubt sein darf und was nicht.
      Ich krieg aber noch nicht einmal das Abfragen und Ersetzen/Löschen hin :(

      Ich habe jetzt noch das gefunden:

        
      function onlynum(self) {  
        var val = self.value.replace(/[^\.^,\d]/g, '');  
        self.value = val;  
      }  
      
      

      Dabei wird aber das falsche Zeichen erst mit dem nächsten Tastendruck gelöscht. Dafür sind aber . und , erlaubt. Hm..

      Dann hab ich noch das versucht aber da kann ich wieder nicht on-the-fly prüfen :(
      http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#is_nan

      Man man, kann doch nicht so schwer sein. Seit 7 Stunden das selbe Problem... *arg *doh *narf

      Danke für eure Hilfe!

      Grüße, Matze

      1. Hallo Matze

        http://electric-lemon.de/self/input.html

        Ich hab aber keine Ahnung wie das Script auf das Input-Element zugreift.

        Im Code findest du irgendwo ein document.onkeydown = myKeydown;
        Diesen eventhandler baust du einfach ins <input> ein. Also: <input onkeydown="myKeydown()" type=text ...>

        Grüße,

        Jochen

        --
        Kritzeln statt texten: Scribbleboard
        1. Hallo Jochen!

          Im Code findest du irgendwo ein document.onkeydown = myKeydown;
          Diesen eventhandler baust du einfach ins <input> ein. Also: <input onkeydown="myKeydown()" type=text ...>

          Erzeugt den Fehler "event ist nicht definiert" Zeile 4

          Zeile 4: evt = (code) ? code : ((event) ? event : null);

          Frustrierend.

          Danke und Grüße, Matze

          1. Hi,

            Diesen eventhandler baust du einfach ins <input> ein. Also: <input onkeydown="myKeydown()" type=text ...>

            Erzeugt den Fehler "event ist nicht definiert" Zeile 4

            Zeile 4: evt = (code) ? code : ((event) ? event : null);

            code ist ja auch schon undefined, weil du es nicht mit übergibst.
            (warum auch immer der Autor die Variable code genannt hat, weil es ist das Event Objekt eigentlich).

            richtig also:

            <input onkeydown="myKeydown(event)" type=text ...>

            function myKeydown(evt)
              {
              ...

            }

            if (evt)
            {
            }

            kannst du dir dann auch sparen.

            Gruß!

            1. Ach ja, und bei disem Code wird onkeydown event verwendet.

              Ich würde lieber onkeypress verwenden, da dieses Event, den tatsächlichen Wert beinhaltet, nicht die Taste.

              Daher kann man auch keine Zahlen über das NumPad eingeben im Beispiel, da einfach nur die obere Zahlenleiste abgefragt wird.

              Und dann den Wert über String.fromCharCode holen und über einen Regexp auswerten.

              Gruß

              1. Hallo nochmal ^^

                Sorry, ich will nicht spammen aber es wurmt mich, dass ich nicht auf die Lösung komme. Ich glaub ich fang doch noch an zu verstehen...

                Hier steht "Konqueror 3.1 kennt die Eigenschaft keyCode noch nicht. Mozilla Firefox 1.0 kennt die Eigenschaft keyCode zwar, sie enthält jedoch nur bei den Ereignissen keyup und keydown sinnvolle Werte. Bei keypress-Ereignissen hat die Eigenschaft bei normalen Tasten, z.B. Buchstaben, immer den Wert 0. Die Eigenschaft nach unten which liefert immer den korrekten Tastencode, daher sollte Sie zunächst die Existenz jener Eigenschaft abfragen."

                Also nehm ich auch which denk ich mir. Oder ist das falsch? Das wird aber wieder nicht vom Browser unterstützt laut der Liste hier.

                Also doch wieder zurück zu keyCode.
                und damit angefangen:

                  
                funktion onlyNum(key) {  
                   var key = key.keyCode /* ... */  
                
                

                keyCode  wird laut der Liste aber nicht vom FF unterstützt also wieder zum which und das berücksichtigt:

                  
                funktion onlyNum(key) {  
                   var key = key.keyCode || key.which;  
                   // Jetzt wo ich den Dezimal-Code habe wird das Zeichen wieder in Unicode umgewandelt  
                   var key = String.fromCharCode(key);  
                
                

                Jetzt müsste meiner Meinung die Abfrage mit einer Regexp kommen, die mir mein Zeichen erlaubt oder verbietet, also:

                  
                funktion onlyNum(key) {  
                   var key = key.keyCode || key.which;  
                   // Jetzt wo ich den Dezimal-Code habe wird das Zeichen wieder in Unicode umgewandelt  
                   var key = String.fromCharCode(key);  
                   if(!key.match(/^\d$/)){     // sollte eintreten wenn etwas ausser 0-9 getippt wurde  
                      /* Tja, was mach ich jetzt hier....? */  
                   }  
                
                

                Komm ich der Sache jetzt langsam näher?
                Wie unterdrück ich jetzt den Eintrag der gedrückten Taste in das Formularfeld? Mit return false; meintest du?
                Ich hab zum ersten mal heut das Gefühl, dass ich einigermaßen dahinter gestiegen bin.
                Zumindest einen kleinen Schritt... aber immerhin.

                Grüße, Matze

                1. Hi

                  Hier steht "Konqueror 3.1 kennt die Eigenschaft keyCode noch nicht. Mozilla Firefox 1.0 kennt die Eigenschaft keyCode zwar, sie enthält jedoch nur bei den Ereignissen keyup und keydown sinnvolle Werte. Bei keypress-Ereignissen hat die Eigenschaft bei normalen Tasten, z.B. Buchstaben, immer den Wert 0. Die Eigenschaft nach unten which liefert immer den korrekten Tastencode, daher sollte Sie zunächst die Existenz jener Eigenschaft abfragen."

                  Also:

                  Die Liste welcher Browser welche Eigenschaft unterstützt, findest du hier. Dazu brauchst du auch kein englisch, imo.

                  keyCode unterstützen beim keydown/up Event eigentlich alle modernen Browser.

                  Beim keypress steckt der CharacterCode in charCode (FF) oder in keyCode (IE).

                  which kennt auch FF, und ist soweit ich weiß nur so das Überbleibsel aus Netscape 4 Zeiten.

                  Mag sein, dass z.B. alte Konquerer Browser auch which kennen.

                  "Konqueror 3.1 kennt die Eigenschaft keyCode noch nicht." passt nicht ganz mit der Tabelle auf quirksmode.org.
                  Hab da jetzt auch keine Ahnung.

                  charCode scheint in SelfHTML gar nicht dokumentiert zu sein (?).

                  Generell ist es so, dass beim keydown event der Tastencode übergeben wird, und beim keypress der Character code.

                  D.h. wenn du die 1 oben tippst, und dann die 1 auf dem NumPad, dann sind es verschiedene Tasten (verschiedener Tastencode), aber gleich Werte (charCode).

                  Also nehm ich auch which denk ich mir. Oder ist das falsch? Das wird aber wieder nicht vom Browser unterstützt laut der Liste hier.

                  nicht vom IE, ja.

                  Also doch wieder zurück zu keyCode.
                  und damit angefangen:

                  funktion onlyNum(key) {
                     var key = key.keyCode /* ... */

                  
                  >   
                  > [keyCode](http://de.selfhtml.org/javascript/objekte/event.htm#key_code)  wird laut der Liste aber nicht vom FF unterstützt also wieder zum [which](http://de.selfhtml.org/javascript/objekte/event.htm#which) und das berücksichtigt:  
                    
                  Zitat:  
                  ==  
                  Mozilla Firefox 1.0 kennt die Eigenschaft keyCode zwar, sie enthält jedoch nur bei den Ereignissen keyup und keydown sinnvolle Werte.  
                  ==  
                    
                  Ja, und beim keypress steckt der sinnvolle Wert in charCode bzw. which.  
                    
                    
                  
                  >    if(!key.match(/^\d$/)){     // sollte eintreten wenn etwas ausser 0-9 getippt wurde  
                  >       /\* Tja, was mach ich jetzt hier....? \*/  
                  >    }  
                    
                  "Hier" musst du dann das Standardverhalten des Browsers, der auch auf das Event reagiert, in dem ein Zeichen in die Textbox schreibt, verhindern.  
                    
                  
                  > Komm ich der Sache jetzt langsam näher?  
                  
                  vielleicht :-)  
                    
                  
                  > Wie unterdrück ich jetzt den Eintrag der gedrückten Taste in das Formularfeld? Mit return false; meintest du?  
                    
                  Es gibt eigentlich 3 Arten der Eventregistrierung:  
                    
                  1\. inline im HTML Code als Attribut:  
                  onkeypress="test(event)"  
                    
                  Hier ist das EventObjekt bei allen Browsern in der Variablen "event", die auch immer so heißen muss.  
                    
                  2\. im JavaScript Code auf klassische Art  
                  document.onkeypress = function(e)  
                  {  
                     e = e || window.event;  
                  };  
                    
                  Hier steckt des Event Objekt automatisch als erstes Argument in der Funktion.  
                  IE hat es allerding in window.event. Daher die Abfrage.  
                    
                  3\. im JavaScript Code über addEventListener/attachEvent  
                  document.addEventListener("keypress", function(e)  
                  {  
                  }  
                  ,false);  
                    
                  Das ist der standard. Das Event Objekt wird auch hier wieder automatisch übergeben. false gibt an, dass das event in der Bubbling-Phase verarbeitet wird... nimms einfach so hin ;-)  
                    
                  document.attachEvent("onkeypress", function(e)  
                  {  
                  }  
                  );  
                    
                  Das versteht der IE. "on" muss vor das event noch. Das Event Objekt wird auch hier übergeben.  
                    
                    
                  Bei 1. und 2. nimmst du return false.  
                  Bei 1. dann aber auch onkeypress="return funktion()" schreiben.  
                    
                  Bei 3. nimmst du e.preventDefault() (standard) oder e.returnValue = false (IE).  
                    
                  klar?  
                    
                  Das EventHandling ist halt leider das komplizierteste in der ClientProgrammierung... weil es so vieles gibt, und dann noch die Browser unterschiede hinzukommen. Aber ist wohl historisch so gewachsen.  
                    
                    
                    
                  Gruß!
                  
                  1. Hallo!

                    Komm ich der Sache jetzt langsam näher?
                    vielleicht :-)

                    Oh ja :))

                      
                    <input <!-- ... --> onkeypress="return myKey(event)" />  
                    
                    
                      
                    function myKey(key) {  
                       // key enthält den Dezimalcode der gedrückten Taste  
                       var key = key.keyCode || key.charCode;  
                       // unikey enthält das Unicode Zeichen der gedrückten Taste  
                       var unikey = String.fromCharCode(key);  
                       // tritt ein wenn etwas ausser 0-9 getippt wurde  
                       if(!unikey.match(/^\d$/)){  
                       // Einfügen des Zeichens in das Feld verhindern  
                          return false;  
                       }  
                    }  
                    
                    

                    Et voilâ :D
                    (Damit keine Missverständnisse auftreten: der JS-Teil kommt natürlich vor dem HTML-Teil)

                    klar?

                    Geht so. Ich versuch hinterher zu kommen :)
                    Aber ich les es mir auf jeden Fall nochmal durch.

                    Natürlich müsste ich jetzt die Regexp noch erweitern. Mein versuch war

                      
                    if(!unikey.match(/^\d$/) && !key.match(/^[35-39]$/)) /* ... */  
                    
                    

                    Damit würde ich zumindest erst einmal ein paar Tasten einschließen.
                    Fehlen würden dann (glaube - nicht wissen) nur noch 8 und 9 oder?

                    Leider funktioniert mein && !key.match.... nicht. In der Konsole steht ein Fehler "Out of Range".
                    Schade ich war so nah dran... :)

                    Riesen Dank für deine Hilfe!

                    Grüße, Matze

                    1. if(!unikey.match(/^\d$/) && !key.match(/[1]$/)) /* ... */

                        
                        
                      Weiß gerade nicht, ob [35-39] ein gültiger Ausdruck ist, ob das nur für einziffrige zeichen gilt.  
                        
                      Problem ist noch, dass du den keyCode von Tab, Delete, usw. nicht im keypress kriegst, zumindest nicht im Firefox. Da ist er halt immer 0.  
                        
                      Gruß!
                      

                      1. 35-39 ↩︎

                      1. Guten Abend Christian!

                        Weiß gerade nicht, ob [35-39] ein gültiger Ausdruck ist, ob das nur für einziffrige zeichen gilt.

                        Sollte meiner Erfahrung nach nur für 0-9 gültig sein. Ich bin schon etwas müde, aber ich versuch die Regexp dafür grad zusammen zu schustern. Bin da leider nicht so fit drin.

                        Problem ist noch, dass du den keyCode von Tab, Delete, usw. nicht im keypress kriegst, zumindest nicht im Firefox. Da ist er halt immer 0.

                        Sagt wer? Wir haben doch grad dafür gesorgt, dass der FF auch bedient wird:

                        function myKey(key) {
                           var key = key.keyCode || key.charCode;
                           var unikey = String.fromCharCode(key);
                           if(!unikey.match(/^\d$/)){
                              alert(key);
                           }
                        }

                        Probier es aus! Tab ist z.B. 9
                        :D

                        Danke und Grüße, Matze

                        1. Hi

                          Sagt wer? Wir haben doch grad dafür gesorgt, dass der FF auch bedient wird:

                          Ja für den charCode... Aber eigentlich dachte ich keyCode ist immer 0 im Firefox im keypress Event.
                          Und charCode stecken Steuerzeichen nicht drin, dachte ich zumindest.

                          Gruß

                          1. Hallo!

                            Ja für den charCode... Aber eigentlich dachte ich keyCode ist immer 0 im Firefox im keypress Event.
                            Und charCode stecken Steuerzeichen nicht drin, dachte ich zumindest.

                            Ein neues Feature!?

                            Grüße, Matze

                      2. Hallo und Guten Morgen Christian!

                        Ich krieg es mit 2 RegExp nicht hin. Meine unschöne Lösung lautet jetzt:

                          
                        function myKey(key) {  
                           var key = key.keyCode || key.charCode;  
                           var unikey = String.fromCharCode(key);  
                           // ende 35 - pos1 36 - links 37 - rechts 39 - back 8 - tab 9 - del 46  
                           if(!unikey.match(/^\d$/) && (key != 8 && key != 9 && key != 35 && key != 36 && key != 37 && key != 39 && key != 46)){  
                           return false;  
                           }  
                        }  
                        
                        

                        Gefällt mir gar nicht, aber wenn ich z.B. schreibe

                        ]  
                           // ende 35 - pos1 36 - links 37 - rechts 39 - back 8 - tab 9 - del 46  
                           // sollte 35-37 finden  
                           if(!unikey.match(/^\d$/) && !key.match(/^3[5-7]$/)){  
                           return false;  
                           }  
                        
                        

                        steht in der Fehlerkonsole !key.match(...) ist keine Funktion.
                        Wenn ich da also noch eine RegExp für die Zahlen 8, 9, 35, 36, 37, 39, 46 zum laufen kriegen würde, wär ich glücklich.

                        Ich hab es bis jetzt im Opera und FF getestet aber wundere mich jetzt schon über den geringen Code im Gegensatz zum, weiter oben irgendwo, verlinkten Beispiel.

                        Danke und Grüße, Matze

                        1. Hi

                          function myKey(key) {
                             var key = key.keyCode || key.charCode;
                             var unikey = String.fromCharCode(key);
                             // ende 35 - pos1 36 - links 37 - rechts 39 - back 8 - tab 9 - del 46
                             if(!unikey.match(/^\d$/) && (key != 8 && key != 9 && key != 35 && key != 36 && key != 37 && key != 39 && key != 46)){
                             return false;
                             }
                          }

                            
                          So unschön ists ja auch nicht.  
                            
                          
                          > Gefällt mir gar nicht, aber wenn ich z.B. schreibe  
                          > ~~~javascript
                          
                          ]  
                          
                          >    // ende 35 - pos1 36 - links 37 - rechts 39 - back 8 - tab 9 - del 46  
                          >    // sollte 35-37 finden  
                          >    if(!unikey.match(/^\d$/) && !key.match(/^3[5-7]$/)){  
                          >    return false;  
                          >    }  
                          > 
                          
                          

                          steht in der Fehlerkonsole !key.match(...) ist keine Funktion.

                          weil key vom Type Number ist. match ist aber nur beim Typ String definiert.

                          => key.toString().match(...)

                          Wenn ich da also noch eine RegExp für die Zahlen 8, 9, 35, 36, 37, 39, 46 zum laufen kriegen würde, wär ich glücklich.

                          /^8|9|3[5-7]|39|46$/

                          38 willst du nicht??

                          Gruß!

                          1. Hallo Christian!

                            weil key vom Type Number ist. match ist aber nur beim Typ String definiert.

                            => key.toString().match(...)

                            Achso, danke schön!

                            Ich hatte jetzt /^8$|^9$|^35$|^36$|^37$|^39$|^46$/ aber

                            /^8|9|3[5-7]|39|46$/

                            sieht natürlich besser aus.

                            38 willst du nicht??

                            Wenn ich mich jetzt nicht irre, ist es die "Pfeil-nach-unten-Taste", 40 müsste der Pfeil nach oben sein. Ich wüsste nicht, wozu ich das in einem einzeiligen Inputfeld bräuchte. Die RegExp ließe sich natürlich ein kleines Stück verkürzen ;)

                            Riesen Dank, endlich komplett geschafft :D

                            Grüße, Matze

                            1. @@Matze:

                              /^8|9|3[5-7]|39|46$/
                              sieht natürlich besser aus.

                              Nicht wirklich.

                              Es ist unperformant, anstatt mit Zahlen zu rechnen, diese erst in Strings umzuwandeln und dann noch einen regulären Ausdruck (immer langsam!) darauf anzuwenden.

                              Bleib bei if(!unikey.match(/^\d$/) && (key != 8 && key != 9 && key != 35 && key != 36 && key != 37 && key != 39 && key != 46))

                              Live long and prosper,
                              Gunnar

                              --
                              Erwebsregel 208: Manchmal ist das einzige, was gefährlicher als eine Frage ist, eine Antwort.
                              1. Hi,

                                Nicht wirklich.

                                Es ist unperformant, anstatt mit Zahlen zu rechnen, diese erst in Strings umzuwandeln und dann noch einen regulären Ausdruck (immer langsam!) darauf anzuwenden.

                                Bleib bei if(!unikey.match(/^\d$/) && (key != 8 && key != 9 && key != 35 && key != 36 && key != 37 && key != 39 && key != 46))

                                Ja, da hat Gunnar natürlich recht!

                                Es wird sich zwar nur in einigen Millisekunden unterscheiden, und ist für diese Anwendung irrelevant, aber grundsätzlich sollte man dann lieber ein paar Zeichen mehr tippen, wenn man die Performance steigern kann.

                                Gruß!

                                1. Hallo Gunnar!

                                  Es ist unperformant, anstatt mit Zahlen zu rechnen, diese erst in Strings umzuwandeln und dann noch einen regulären Ausdruck (immer langsam!) darauf anzuwenden.
                                  Bleib bei if(!unikey.match(/^\d$/) && (key != 8 && key != 9 && key != 35 && key != 36 && key != 37 && key != 39 && key != 46))

                                  Das eine RegExp in dem Fall eine riesen Keule ist, dachte ich mir schon. Ich dachte mit abnehmender zu prüfender Stringlänge vernachlässigt sich das Problem und 2 Byte sollten schnell zu prüfen sein. Danke für deinen Hinweis!

                                  Hoffen wir mal, dass bald diese tollen WebForms Standard werden und wir solche Probleme nicht mehr haben. Spätestens dann entfällt in dem Bereich auch die Diskussion ob YYYY-MM-TT o. TT-MM-YYYY.
                                  Das Script find ich trotzdem nicht so übel, man könnte es problemlos um Trennzeichen erweitern und so auch für Telefonnummern, Datumseingaben in der Form 24.03.2008 oder 2008.03.24 verwenden. Feines kleines Script find ich XD

                                  Hallo Christian!

                                  Es wird sich zwar nur in einigen Millisekunden unterscheiden, und ist für diese Anwendung irrelevant, aber grundsätzlich sollte man dann lieber ein paar Zeichen mehr tippen, wenn man die Performance steigern kann.

                                  Gut, dann haben wir es ja endlich geschafft :)

                                  Danke und Grüße, Matze

            2. Hallo Christian!

              <input onkeydown="myKeydown(event)" type=text ...>

              Ja, danke! Das "event" hat gefehlt.

              if (evt)
              {
              }
              kannst du dir dann auch sparen.

              Ja irgendwie unlogisch weil die Bedingung tritt sowieso ein.

              Danke schön! Hätte ja nicht gedacht, das ich es heut noch hin kriege!!

              Was mich jetzt aber ärgert, ist der "Diebstahl" des Codes. Ich wollte es eigentlich halbwegs allein hin kriegen :( Dachte ein paar Hinweise auf die richtige(n) Funktion(en) und den Rest mach ich dann schon.

              Dafür werd ich mir jetzt aber Mühe geben den Code wenigstens zu verstehen.

              Danke nochmals!

              Grüße, Matze

              1. Hi.

                Ja irgendwie unlogisch weil die Bedingung tritt sowieso ein.

                Ja, zumindest ist mir kein Browser bekannt, der kein Event Objekt kennt.

                Danke schön! Hätte ja nicht gedacht, das ich es heut noch hin kriege!!

                Was mich jetzt aber ärgert, ist der "Diebstahl" des Codes. Ich wollte es eigentlich halbwegs allein hin kriegen :( Dachte ein paar Hinweise auf die richtige(n) Funktion(en) und den Rest mach ich dann schon.

                Die Hinweise haben wir dir wohl gegegeben.

                keypress
                preventDefault
                fromCharCode

                Dafür werd ich mir jetzt aber Mühe geben den Code wenigstens zu verstehen.

                Grundlagenverständnis über EventHandling wären am besten:

                Eventregistrierung (inline oder über addEventListener/attachEvent)
                Events canceln (stopPropagtion/cancelBubble)
                Default verhalten verhindern (return false bei inline, oder preventDefault/returnValue=false bei der anderen Eventregistrierung)
                Unterschiede im IE-Modell

                Btw. beim onkeypress kann es wiederum sein, dass du Cursortasten und Backspace und Tab nicht richtig bekommst => Ausprobieren.

                In meiner Lösung hatte ich daher onkeydown UND onkeypress implementiert.
                Im keydown dann geprüft ob es eine der Steuertasten war, das Ergebnis gemerkt, und in keypress noch verarbeitet.
                keydown wird vor keypress ausgeführt, zumindest nach meinen Erfahrungen.

                Gruß
                Christian

                1. Hallo!

                  Die Hinweise haben wir dir wohl gegegeben.

                  keypress
                  preventDefault
                  fromCharCode

                  Ich brauch wohl nicht nur das Auto sondern auch ein paar Fahrstunden um ans Ziel zu kommen ;)

                  Grundlagenverständnis über EventHandling wären am besten:

                  Eventregistrierung (inline oder über addEventListener/attachEvent)

                  Ok, was heißt das?

                  Events canceln (stopPropagtion/cancelBubble)

                  Also den EventHandler deaktivieren/entfernen/stoppen?

                  Default verhalten verhindern (return false bei inline, oder preventDefault/returnValue=false bei der anderen Eventregistrierung)

                  Was heißt "bei inline" und "preventDefault/returnValue=false bei der anderen Eventregistrierung"? Was ist eine Eventregistrierung?

                  In meiner Lösung hatte ich daher onkeydown UND onkeypress implementiert.
                  Im keydown dann geprüft ob es eine der Steuertasten war, das Ergebnis gemerkt, und in keypress noch verarbeitet.
                  keydown wird vor keypress ausgeführt, zumindest nach meinen Erfahrungen.

                  Ich bin mir immer weniger sicher ob ich meine Finger nicht einfach davon lassen sollte. Ich versuch irgend einen Zusammenhang und eine Logik mit keypress, preventDefault und fromCharCode zu verstehen aber das ist mir grad zu viel auf einmal. Ich versteh auch nicht was die Funktionen (?) genau machen oder finde es nicht ausreichend deutsch dokumentiert.

                  Die Idee mit den Web Forms 2.0 gefällt mir immer besser.

                  Tut mir leid für eure vergebene Mühe :/

                  Danke und Grüße, Matze

  4. Hallo alle und nochmals danke für eure Hilfe und Vorschläge!

    Ich hab mich jetzt für folgende Lösung entschieden:
    <input type="date" name="myDate">.

    Warum soll ich mir solche Mühe machen wenn es in 1-2 Jahren völlig überflüssig sein wird?
    Ältere Browser kriegen von mir ein normales Input-Feld vorgesetzt mit dem sich der User dann quälen soll ^^ Gemeint ist ein Feld mit zulässigen Zeichen im Bereich von 0-9,./ und - . Das sollte reichen.

    Die Auswertung erfolgt dann Serverseitig wobei ich die Daten aus dem Text-Feld anhand des Trennzeichens zerlege und anhand der Position der Jahreszahl auf YYYY-MM-TT o. TT-MM-YYYY schließen kann. Wie das Datum beim Date-Feld übertragen wird würde mich mal interessieren. Ich glaub das werd ich gleich mal testen.

    Vielleicht muss ich ältere Browser auch gar nicht berücksichtigen, da sie ein Feld vom type="date" einfach als normales Textfeld behandeln. Muss ich erstmal noch raus finden...

    Danke für eure Hilfe!

    Grüße, Matze

    1. Hallo.

      Ich hab mich jetzt für folgende Lösung entschieden:
      <input type="date" name="myDate">.

      Dann achte bitte auch auf die Angabe des korrekten Dokumententyps.
      MfG, at