Lần đầu tiên tôi đã thử giải quyết vấn đề này bằng jQuery, nhưng tôi không hài lòng về các ký tự không mong muốn (không phải chữ số) thực sự xuất hiện trong trường nhập trước khi bị xóa trên keyup.
Tìm kiếm các giải pháp khác tôi tìm thấy điều này:
Số nguyên (không âm)
<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>
Nguồn: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onkeypress#Example
Ví dụ trực tiếp: http://jsfiddle.net/u8sZq/
Điểm thập phân (không âm)
Để cho phép một dấu thập phân duy nhất, bạn có thể làm một cái gì đó như thế này:
<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>
Nguồn: Chỉ cần viết này. Có vẻ như đang làm việc. Ví dụ trực tiếp: http://jsfiddle.net/tjBsF/
Các tùy chỉnh khác
- Để cho phép nhập nhiều ký hiệu hơn, chỉ cần thêm chúng vào biểu thức chính quy đóng vai trò là bộ lọc mã char cơ bản.
- Để thực hiện các hạn chế theo ngữ cảnh đơn giản, hãy xem nội dung (trạng thái) hiện tại của trường đầu vào (oToCheckField.value)
Một số điều bạn có thể quan tâm để làm:
- Chỉ cho phép một dấu thập phân
- Chỉ cho phép dấu trừ nếu được định vị ở đầu chuỗi. Điều này sẽ cho phép số âm.
Thiếu sót
- Vị trí caret không có sẵn bên trong chức năng. Điều này làm giảm đáng kể các hạn chế theo ngữ cảnh mà bạn có thể thực hiện (ví dụ: không có hai biểu tượng liên tiếp bằng nhau). Không chắc chắn cách tốt nhất để truy cập nó là gì.
Tôi biết tiêu đề yêu cầu các giải pháp jQuery, nhưng hy vọng ai đó sẽ tìm thấy điều này hữu ích.