Najpierw próbowałem rozwiązać ten problem za pomocą jQuery, ale nie cieszyłem się, że niepożądane znaki (niebędące cyframi) faktycznie pojawiały się w polu wejściowym tuż przed ich usunięciem przy kluczowaniu.
Poszukując innych rozwiązań znalazłem to:
Liczby całkowite (nieujemne)
<script>
function numbersOnly(oToCheckField, oKeyEvent) {
return oKeyEvent.charCode === 0 ||
/\d/.test(String.fromCharCode(oKeyEvent.charCode));
}
</script>
<form name="myForm">
<p>Enter numbers only: <input type="text" name="myInput"
onkeypress="return numbersOnly(this, event);"
onpaste="return false;" /></p>
</form>
Źródło: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onkeypress#Example
Przykład na żywo: http://jsfiddle.net/u8sZq/
Kropki dziesiętne (nieujemne)
Aby zezwolić na pojedynczy przecinek dziesiętny, możesz zrobić coś takiego:
<script>
function numbersOnly(oToCheckField, oKeyEvent) {
var s = String.fromCharCode(oKeyEvent.charCode);
var containsDecimalPoint = /\./.test(oToCheckField.value);
return oKeyEvent.charCode === 0 || /\d/.test(s) ||
/\./.test(s) && !containsDecimalPoint;
}
</script>
Źródło: Właśnie to napisałem. Wydaje się, że działa. Przykład na żywo: http://jsfiddle.net/tjBsF/
Inne dostosowania
- Aby umożliwić wpisywanie większej liczby symboli, wystarczy dodać je do wyrażenia regularnego, które działa jako podstawowy filtr kodu char.
- Aby wdrożyć proste ograniczenia kontekstowe, spójrz na bieżącą zawartość (stan) pola wejściowego (oToCheckField.value)
Niektóre rzeczy, które możesz zainteresować:
- Dozwolony jest tylko jeden przecinek dziesiętny
- Zezwalaj na znak minus tylko wtedy, gdy znajduje się na początku łańcucha. Pozwoliłoby to na liczby ujemne.
Niedociągnięcia
- Pozycja karetki nie jest dostępna wewnątrz funkcji. To znacznie zmniejszyło ograniczenia kontekstowe, które można wprowadzić (np. Brak dwóch równych kolejnych symboli). Nie jestem pewien, jaki jest najlepszy sposób na to.
Wiem, że tytuł prosi o rozwiązania jQuery, ale mam nadzieję, że ktoś i tak okaże się przydatny.