Uwaga: to jest zaktualizowana odpowiedź. Komentarze poniżej odnoszą się do starej wersji pomieszanej z kodami klawiszy.
JavaScript
Wypróbuj sam na JSFiddle .
Możesz filtrować wartości wejściowe tekstu <input>
za pomocą następującej setInputFilter
funkcji (obsługuje kopiowanie + wklejanie, przeciąganie + upuszczanie, skróty klawiaturowe, operacje w menu kontekstowym, klawisze niewypełniane, położenie karetki, różne układy klawiatury i wszystkie przeglądarki od wersji IE 9 ) :
// Restricts input for the given textbox to the given inputFilter function.
function setInputFilter(textbox, inputFilter) {
["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
textbox.addEventListener(event, function() {
if (inputFilter(this.value)) {
this.oldValue = this.value;
this.oldSelectionStart = this.selectionStart;
this.oldSelectionEnd = this.selectionEnd;
} else if (this.hasOwnProperty("oldValue")) {
this.value = this.oldValue;
this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
} else {
this.value = "";
}
});
});
}
Możesz teraz użyć tej setInputFilter
funkcji, aby zainstalować filtr wejściowy:
setInputFilter(document.getElementById("myTextBox"), function(value) {
return /^\d*\.?\d*$/.test(value); // Allow digits and '.' only, using a RegExp
});
Zobacz demo JSFiddle, aby uzyskać więcej przykładów filtrów wejściowych. Pamiętaj też, że nadal musisz przeprowadzić weryfikację po stronie serwera!
Maszynopis
Oto jego wersja TypeScript.
function setInputFilter(textbox: Element, inputFilter: (value: string) => boolean): void {
["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
textbox.addEventListener(event, function(this: (HTMLInputElement | HTMLTextAreaElement) & {oldValue: string; oldSelectionStart: number | null, oldSelectionEnd: number | null}) {
if (inputFilter(this.value)) {
this.oldValue = this.value;
this.oldSelectionStart = this.selectionStart;
this.oldSelectionEnd = this.selectionEnd;
} else if (Object.prototype.hasOwnProperty.call(this, 'oldValue')) {
this.value = this.oldValue;
if (this.oldSelectionStart !== null &&
this.oldSelectionEnd !== null) {
this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
}
} else {
this.value = "";
}
});
});
}
jQuery
Istnieje również wersja jQuery. Zobacz tę odpowiedź .
HTML 5
HTML 5 ma natywne rozwiązanie z <input type="number">
(patrz specyfikacja ), ale zauważ, że obsługa przeglądarki jest różna:
- Większość przeglądarek zweryfikuje dane wejściowe tylko podczas przesyłania formularza, a nie podczas pisania.
- Większość przeglądarek mobilnych nie obsługują
step
, min
i max
atrybuty.
- Chrome (wersja 71.0.3578.98) nadal pozwala użytkownikowi wprowadzać znaki
e
i E
pole. Zobacz także to pytanie .
- Firefox (wersja 64.0) i Edge (EdgeHTML wersja 17.17134) nadal pozwalają użytkownikowi wprowadzać dowolny tekst w polu.
Wypróbuj sam na w3schools.com .