Mensen,
ik heb een input field die een bepaald format als invoer verwacht. Dit zijn barcodes op plastic pasjes.
Format: 6064-3653-1234-1234-123 (eerste 8 cijfers zijn altijd hetzelfde, de rest is numeriek)
Voorheen gebruikten we 5 input velden achter elkaar en verplaatsten we de focus naar het volgende veld, op het moment dat het huidige veld vol was. Dit heeft echter altijd gedoe opgeleverd in de verschillende browsers en we hebben nooit een waterdichte oplossing kunnen bedenken. Dus we hebben laatst besloten de 5 input velden te vervangen door 1 input.
Het format zou je normaal gesproken met een regular expression kunnen afvangen, maar het probleem is dat sommige gebruikers een handscanner gebruiken om de barcodes te scannen. Deze scanners plaatsen de streepjes niet.
Dus hebben we 2 opties:
- een mask op het veld.
- met javascript de streepjes plaatsen.
Omdat ik nog nooit een degelijke masked-input heb kunnen vinden die in alle browsers fatsoenlijk werkt (ie8, ie9, chrome, ff en sinds kort ook ie10) hebben we besloten om voor optie 2 te gaan, met javascript de streepjes plaatsen.
Dus je typt 4 cijfers, javascript zet een streepje, je typt de volgende 4, javascript zet een streepje.
Dit doe ik door bij elk keyup event het aantal karakers te tellen en vervolgens te bepalen of het veld een streepje nodig heeft.
code
probleem is nu, dat als ik het veld volledig vul en vervolgens in blok 3 cijfers begin te verwijderen (bijvoorbeeld omdat ik verkeerd ingevoerde cijfers heb) hij op een gegeven moment langs case 14 komt en dus een streepje zet en naar het eind van het veld springt.
Hoe zou ik dat kunnen voorkomen?
ik heb een input field die een bepaald format als invoer verwacht. Dit zijn barcodes op plastic pasjes.
Format: 6064-3653-1234-1234-123 (eerste 8 cijfers zijn altijd hetzelfde, de rest is numeriek)
Voorheen gebruikten we 5 input velden achter elkaar en verplaatsten we de focus naar het volgende veld, op het moment dat het huidige veld vol was. Dit heeft echter altijd gedoe opgeleverd in de verschillende browsers en we hebben nooit een waterdichte oplossing kunnen bedenken. Dus we hebben laatst besloten de 5 input velden te vervangen door 1 input.
Het format zou je normaal gesproken met een regular expression kunnen afvangen, maar het probleem is dat sommige gebruikers een handscanner gebruiken om de barcodes te scannen. Deze scanners plaatsen de streepjes niet.
Dus hebben we 2 opties:
- een mask op het veld.
- met javascript de streepjes plaatsen.
Omdat ik nog nooit een degelijke masked-input heb kunnen vinden die in alle browsers fatsoenlijk werkt (ie8, ie9, chrome, ff en sinds kort ook ie10) hebben we besloten om voor optie 2 te gaan, met javascript de streepjes plaatsen.
Dus je typt 4 cijfers, javascript zet een streepje, je typt de volgende 4, javascript zet een streepje.
Dit doe ik door bij elk keyup event het aantal karakers te tellen en vervolgens te bepalen of het veld een streepje nodig heeft.
code
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| var startSequence = "6064-3653-"; //mandatory string at start of input var control = $('#<%= tbBoncode.ClientID%>'); // textbox input var hiddenControl = $('#hfBoncode'); // hidden field for history of textbox input var splitChar = "-"; //split character for input //KeyUp event on textbox input control.keyup(function (e) { var curValue = control.val(); //current input value var hiddenValue = hiddenControl.val(); //current hiddenfield value var isCorrectStartSequence = curValue.substring(0, 10) == startSequence; //current value contains correct start sequence var textLength = curValue.length; //length of input text var hiddenTextLength = hiddenValue.length; //length of hidden field text var lastChar = curValue.substr(curValue.length - 1); //last character of current value var lastHiddenChar = hiddenValue.substr(hiddenValue.length - 1); //last character of hiddenfield switch (textLength) { case 4: case 9: case 14: case 19: //if input doesn't end with split character, add splitcharacter. if (lastHiddenChar != splitChar && lastChar != splitChar) { control.val(curValue + splitChar); } break; case 5: case 10: case 15: case 20: //if input ends with split character, set focus to end of field. ! Doesn't work in FireFox if (lastHiddenChar == splitChar && lastChar == splitChar) { if (e.keyCode != 37 && e.keyCode != 39) { control.val(control.val()); } } else if (lastChar != splitChar) { //if input doesn't end with split character, but text requires a split character add it and move last character to end. control.val(control.val().substring(0, textLength - 1) + splitChar + lastChar); } break; } //copy current value of control to hiddenfield hiddenControl.val(control.val()); |
probleem is nu, dat als ik het veld volledig vul en vervolgens in blok 3 cijfers begin te verwijderen (bijvoorbeeld omdat ik verkeerd ingevoerde cijfers heb) hij op een gegeven moment langs case 14 komt en dus een streepje zet en naar het eind van het veld springt.
Hoe zou ik dat kunnen voorkomen?