jQuery: cách tốt nhất để hạn chế số lượng đầu vào của dòng ba chiều cho các hộp văn bản là gì? (cho phép điểm thập phân)


228

Cách tốt nhất để hạn chế "số" - chỉ nhập vào các hộp văn bản là gì?

Tôi đang tìm kiếm một cái gì đó cho phép điểm thập phân.

Tôi thấy rất nhiều ví dụ. Nhưng vẫn chưa quyết định sử dụng cái nào.

Cập nhật từ Praveen Jeganathan

Không còn các plugin, jQuery đã triển khai jQuery.isNumeric()bổ sung riêng trong v1.7. Xem: https://stackoverflow.com/a/20186188/66767


3
Đây là một câu hỏi dựa trên ý kiến, nhưng rất hữu ích. Các câu hỏi dựa trên ý kiến ​​nên được cho phép. Người đang tìm kiếm thông tin này chỉ cần lưu ý rằng đây chỉ là một câu trả lời dựa trên ý kiến. Một TAG sẽ là đủ.
Thiago C. S Ventura

đây là một bài viết hay với codepedia
Satinder singh

Câu trả lời:


198

Cập nhật

Có một giải pháp mới và rất đơn giản cho việc này:

Nó cho phép bạn sử dụng bất kỳ loại bộ lọc đầu vào nào trên một văn bản <input>, bao gồm các bộ lọc số khác nhau. Điều này sẽ xử lý chính xác Sao chép + Dán, Kéo + Thả, phím tắt, thao tác menu ngữ cảnh, các phím không thể gõ và tất cả các bố cục bàn phím.

Xem câu trả lời này hoặc tự mình thử nó trên JSFiddle .

plugin jquery.numeric

Tôi đã triển khai thành công nhiều biểu mẫu với plugin jquery.numeric .

$(document).ready(function(){
    $(".numeric").numeric();
});

Hơn nữa, điều này cũng làm việc với textareas!

Tuy nhiên, lưu ý rằng Ctrl + A, Sao chép + Dán (thông qua menu ngữ cảnh) và Kéo + Thả sẽ không hoạt động như mong đợi.

HTML 5

Với sự hỗ trợ rộng hơn cho tiêu chuẩn HTML 5, chúng tôi có thể sử dụng patternthuộc tính và numberloại cho inputcác thành phần để hạn chế chỉ nhập số. Trong một số trình duyệt (đặc biệt là Google Chrome), nó cũng hoạt động để hạn chế dán nội dung không phải là số. Thông tin thêm về numbervà các loại đầu vào mới hơn có sẵn ở đây .


5
Plugin này không cho phép bạn sử dụng backspace trong Opera.
Darryl Hein

6
@Darryl nguồn chỉ dài vài chục dòng, vì vậy tôi chắc chắn sửa đổi nó để cho phép điều đó là tầm thường. Tôi chỉ tìm thấy plugin này và sửa đổi nó để bây giờ có một allowDecimaltùy chọn cho bất cứ khi nào tôi chỉ muốn cho phép các giá trị nguyên .. nguồn rất đơn giản và được viết tốt.
Earlz

1
Điều này không hoạt động khi dán sao chép vào các trường đầu vào type="number".
Tallmaris

@Tallmaris đây thực sự là câu hỏi và câu trả lời rất cũ. Đã có rất nhiều thay đổi đối với HTML và cần được xem xét.
TheVillageIdiot

Xin chào @TheVillageIdiot, bạn đã đúng. Tôi không muốn tỏ ra thô lỗ trong bình luận (có lẽ hơi khô khan) :) Thực tế là tôi đã thấy một số bình luận gần đây, vì vậy tôi chỉ muốn làm rõ rằng đây có lẽ không phải là giải pháp tốt nhất cho vấn đề.
Tallmaris

288

Nếu bạn muốn hạn chế đầu vào (trái ngược với xác nhận), bạn có thể làm việc với các sự kiện chính. đại loại như thế này:

<input type="text" class="numbersOnly" value="" />

Và:

jQuery('.numbersOnly').keyup(function () { 
    this.value = this.value.replace(/[^0-9\.]/g,'');
});

Điều này ngay lập tức cho người dùng biết rằng họ không thể nhập các ký tự alpha, v.v. thay vì muộn hơn trong giai đoạn xác nhận.

Bạn vẫn muốn xác thực vì đầu vào có thể được điền bằng cách cắt và dán bằng chuột hoặc có thể bằng trình tự động hoàn thành biểu mẫu có thể không kích hoạt các sự kiện chính.


4
+1 - Tôi sẽ đề nghị điều tương tự. Đó là một điểm rất tốt để lưu ý rằng hình thức xác nhận này có thể diễn ra trên mỗi lần nhấn phím, thay vì một lần vào cuối. Điều duy nhất tôi muốn thêm là một số hình thức cảnh báo rằng những gì người dùng đang gõ đang bị từ chối. Đơn giản là không hiển thị các chữ cái sẽ khiến nhiều người nghĩ rằng bàn phím của họ bị hỏng. có lẽ khéo léo thay đổi màu nền hoặc màu đường viền .. miễn là người dùng biết rằng ứng dụng của bạn thực sự đang làm gì đó.
nickf

đã đồng ý. tôi có một ví dụ tại tarbuilders.com . nếu bạn nhấp vào "liên hệ", biểu mẫu sẽ kiểm tra đầu vào của người dùng một cách nhanh chóng và nếu nó hợp lệ, có một đường viền màu xanh lá cây và dấu kiểm. không hợp lệ -> đỏ và "x"
Keith Bentrup

5
Xem câu trả lời này để khắc phục vấn đề phím mũi tên.
Hanna

Xin lưu ý rằng bạn vẫn có thể dán các ký tự và chữ cái bằng một nút chuột phải nhấp> dán. Một cách dễ dàng để khắc phục điều này sẽ là:$doc.on('keyup blur input propertychange', 'input[name="price"]', function(){$(this).val($(this).val().replace(/[^0-9\.]/g,''));});
Rens Tillmann

1
CRAP, nếu tôi viết các số tức là "123", sau đó nhấn phím chữ cái, tức là "a", nó sẽ làm trống đầu vào ...
xì phé

102

Tôi nghĩ rằng câu trả lời tốt nhất là câu trả lời ở trên để làm điều này.

jQuery('.numbersOnly').keyup(function () {  
    this.value = this.value.replace(/[^0-9\.]/g,''); 
});

nhưng tôi đồng ý rằng một chút đau đớn là các phím mũi tên và nút xóa sẽ đưa con trỏ đến cuối chuỗi (và do đó, nó đã bị trả lại cho tôi khi kiểm tra)

Tôi đã thêm vào một thay đổi đơn giản

$('.numbersOnly').keyup(function () {
    if (this.value != this.value.replace(/[^0-9\.]/g, '')) {
       this.value = this.value.replace(/[^0-9\.]/g, '');
    }
});

Bằng cách này, nếu có bất kỳ nút nhấn nào sẽ không làm cho văn bản bị thay đổi, hãy bỏ qua nó. Với điều này, bạn có thể nhấn mũi tên và xóa mà không cần nhảy đến cuối nhưng nó sẽ xóa mọi văn bản không phải là số.


27
Để có hiệu suất tốt hơn, hãy tạo một var với kết quả thay thế thay vì chạy nó hai lần.
Tài xếDan

4
keypresscó thể được sử dụng để đơn giản hóa hơn nữa, bởi vì rõ ràng keyupkeydownkích hoạt trên bất kỳ phím bàn phím nào, trong khi keypress chỉ kích hoạt các phím "ký tự" (do đó không kích hoạt trên mũi tên và xóa các phím). Xem câu trả lời này để tham khảo: stackoverflow.com/a/1367720/1298685
Ian Campbell

Nó đang chấp nhận nhiều hơn một số thập phân. Làm thế nào để chỉ chấp nhận một thập phân. Tôi đã áp dụng cho trường văn bản số lượng. Nó cũng đang dùng 12.5.6. Làm thế nào để hạn chế cho một điểm.
niru dyogi

Nhấn phím @IanCampbell có nghĩa là bạn có thể nhập một ký tự để bắt đầu mà không bị xóa. Sẽ không làm việc. Keydown làm điều tương tự. Tôi chỉ có thể làm cho nó hoạt động với keyup.
nickdnk

54

Plugin jquery.numeric có một số lỗi mà tôi đã thông báo cho tác giả. Nó cho phép nhiều điểm thập phân trong Safari và Opera và bạn không thể nhập backspace, phím mũi tên hoặc một số ký tự điều khiển khác trong Opera. Tôi cần đầu vào số nguyên dương vì vậy cuối cùng tôi chỉ tự viết.

$(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});

Hoàn toàn không thể nhập 0 bằng mã này. Đã thử nghiệm với Chrome và FF trên Mac.
jaredstenquist

1
Tôi đã cập nhật thông tin này để chấp nhận 0 chữ số (48 == event.which && ($ (this) .val ()> 0)) || // Không 0 chữ số đầu tiên
aljordan82

Đây là một giải pháp tuyệt vời nhưng nó thiếu số thập phân, chỉ cần thêm (46 == event.which &&! ($ (This) .val (). Bao gồm ("."))) ||
DiamondDrake

Không thể gõ 0 cả.
PJ7

47

Không còn plugin, jQuery đã triển khai jQuery.isNumeric () được thêm vào v1.7.

jQuery.isNumeric( value )

Xác định xem đối số của nó là anumber.

Kết quả mẫu

$.isNumeric( "-10" );     // true
$.isNumeric( 16 );        // true
$.isNumeric( 0xFF );      // true
$.isNumeric( "0xFF" );    // true
$.isNumeric( "8e5" );     // true (exponential notation string)
$.isNumeric( 3.1415 );    // true
$.isNumeric( +10 );       // true
$.isNumeric( 0144 );      // true (octal integer literal)
$.isNumeric( "" );        // false
$.isNumeric({});          // false (empty object)
$.isNumeric( NaN );       // false
$.isNumeric( null );      // false
$.isNumeric( true );      // false
$.isNumeric( Infinity );  // false
$.isNumeric( undefined ); // false

Dưới đây là một ví dụ về cách liên kết isNumeric () với trình nghe sự kiện

$(document).on('keyup', '.numeric-only', function(event) {
   var v = this.value;
   if($.isNumeric(v) === false) {
        //chop off the last char entered
        this.value = this.value.slice(0,-1);
   }
});

+1 không có plugin. Tôi muốn thêm một thay đổi nhỏ để cho phép hàng ngàn dấu phân cách. Thay vì var v = this.value;thay đổi nó để var v = this.value.replace(/,/g,'');. Những con số như vậy 21,345,67.800là quá cân nhắc.
maan81

Có ai biết làm thế nào kiểm tra số này? Nó có sử dụng mã khóa hoặc biểu thức thông thường không? Quan trọng nếu bạn xem xét bố trí bàn phím khác nhau.
Christopher Grigg

2
Điều này rất gần. Tuy nhiên, nếu bạn giữ phím ký tự xuống, nó sẽ không chạy kiểm tra đúng cách. Nhân vật sẽ "chạy." Thay vào đó hãy thử điều này: $(document).on('keyup keypress', '#somethingSomething', function(){ var aValue = $(this).val(); if($.isNumeric(aValue) === false){ $(this).val(aValue.slice(0,-1)); } });
Gwi7d31

34

Plugin số () được đề cập ở trên, không hoạt động trong Opera (bạn không thể xóa lùi, xóa hoặc thậm chí sử dụng các phím lùi hoặc tiến).

Mã bên dưới trong cả JQuery hoặc Javascript sẽ hoạt động hoàn hảo (và chỉ có hai dòng).

JQuery:

$(document).ready(function() {
    $('.key-numeric').keypress(function(e) {
            var verified = (e.which == 8 || e.which == undefined || e.which == 0) ? null : String.fromCharCode(e.which).match(/[^0-9]/);
            if (verified) {e.preventDefault();}
    });
});

Javascript:

function isNumeric(e)
{
    var keynum = (!window.event) ? e.which : e.keyCode;
    return !((keynum == 8 || keynum == undefined || e.which == 0) ? null : String.fromCharCode(keynum).match(/[^0-9]/));
}

Tất nhiên, điều này chỉ dành cho đầu vào số thuần túy (cộng với phím xóa lùi, xóa, tiến / lùi) nhưng có thể dễ dàng thay đổi để bao gồm các điểm và trừ các ký tự.


Numpad cũng không được phép
Graham


18

Không cần mã dài để hạn chế nhập số, chỉ cần thử mã này.

Nó cũng chấp nhận int & float cả hai giá trị hợp lệ.

Phương pháp tiếp cận Javascript

onload =function(){ 
  var ele = document.querySelectorAll('.number-only')[0];
  ele.onkeypress = function(e) {
     if(isNaN(this.value+""+String.fromCharCode(e.charCode)))
        return false;
  }
  ele.onpaste = function(e){
     e.preventDefault();
  }
}
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

Phương pháp tiếp cận jQuery

$(function(){

  $('.number-only').keypress(function(e) {
	if(isNaN(this.value+""+String.fromCharCode(e.charCode))) return false;
  })
  .on("cut copy paste",function(e){
	e.preventDefault();
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

CẬP NHẬT

Các câu trả lời trên dành cho trường hợp sử dụng phổ biến nhất - xác thực đầu vào dưới dạng số.

Nhưng dưới đây là đoạn mã cho các trường hợp sử dụng đặc biệt

  • Cho phép số âm
  • Hiển thị tổ hợp phím không hợp lệ trước khi loại bỏ nó.

$(function(){
      
  $('.number-only').keyup(function(e) {
        if(this.value!='-')
          while(isNaN(this.value))
            this.value = this.value.split('').reverse().join('').replace(/[\D]/i,'')
                                   .split('').reverse().join('');
    })
    .on("cut copy paste",function(e){
    	e.preventDefault();
    });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />


14

Dưới đây là những gì tôi sử dụng để chặn các tổ hợp phím theo nghĩa đen. Điều này chỉ cho phép số 0-9 và dấu thập phân. Dễ thực hiện, không nhiều mã và hoạt động như một nét quyến rũ:

<script>
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode;
    if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
        return false;
    } else {
        return true;
    }      
}
</script>

<input value="" onkeypress="return isNumberKey(event)">

Nếu bất cứ ai đang thắc mắc- bạn có thể hạn chế số thập phân bằng cách xóa charCode != 46khỏi câu lệnh if. Câu trả lời chính xác!
Gaʀʀʏ

Chính xác, tôi đã xóa charCode! = 46 để bỏ qua số thập phân. Cảm ơn kaleazy, câu trả lời này đã làm việc rất tốt cho tôi.
msqar

3
Đây là một giải pháp tồi vì nó không đưa backspace, mũi tên, phím điều khiển và các tổ hợp phím cần thiết khác vào tài khoản.
DriverDan

Tôi vừa đăng một giải pháp tương tự như thế này, nhưng cũng xử lý backspace, mũi tên và không sử dụng mã khóa cứng. Kiểm tra nó ở đây: stackoverflow.com/a/23468513/838608
Håvard Geithus


9

Bạn không thấy bảng chữ cái xuất hiện phép thuật và biến mất trên phím xuống. Điều này hoạt động trên dán chuột quá.

$('#txtInt').bind('input propertychange', function () {
    $(this).val($(this).val().replace(/[^0-9]/g, ''));
});

Mặc dù không cho phép số thập phân, tôi thấy đây là phương pháp đơn giản nhất cho số nguyên.
nickdnk

Đối với số thập phân, có lẽ bạn có thể cập nhật biểu thức chính quy thành một cái gì đó như/[^0-9.]/g
Null Head

Tôi không cần số thập phân. Đó chỉ là vì OP đã làm, nhưng vâng :)
nickdnk

8

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.


6

Cảm ơn vì bài viết Dave Aaron Smith

Tôi đã chỉnh sửa câu trả lời của bạn để chấp nhận dấu thập phân và số từ phần số. Công việc này hoàn hảo cho tôi.

$(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right,decimal(.)in number part, decimal(.) in alphabet
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39,110,190];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (96 <= event.which && event.which <= 106) || // Always 1 through 9 from number section 
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      (96 == event.which && $(this).attr("value")) || // No 0 first digit from number section
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});

6
   window.jQuery.fn.ForceNumericOnly =
       function () {

           return this.each(function () {
               $(this).keydown(function (event) {
                   // Allow: backspace, delete, tab, escape, and enter
                   if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                       // Allow: Ctrl+A
                       (event.keyCode == 65 && event.ctrlKey === true) ||
                       // Allow: home, end, left, right
                       (event.keyCode >= 35 && event.keyCode <= 39)) {
                       // let it happen, don't do anything
                       return;
                   } else {
                       // Ensure that it is a number and stop the keypress
                       if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                           event.preventDefault();
                       }
                   }
               });
           });
       };

Và áp dụng điều này trên tất cả các đầu vào bạn muốn:

$('selector').ForceNumericOnly();

5

HTML5 hỗ trợ số loại đầu vào với trình duyệt toàn cầu hỗ trợ 88% + theo CanIUse kể từ tháng 10 năm 2015.

<input type="number" step="0.01" min="0" name="askedPrice" id="askedPrice" />

Đây không phải là giải pháp liên quan đến JQuery, nhưng ưu điểm là trên điện thoại di động, bàn phím Android sẽ được tối ưu hóa để nhập số.

Ngoài ra, có thể sử dụng văn bản loại đầu vào với "mẫu" tham số mới. Thêm chi tiết trong thông số HTML5.

Tôi nghĩ rằng nó là tốt hơn so với giải pháp jquery, vì trong câu hỏi này cung cấp giải pháp jquery không hỗ trợ hàng ngàn phân cách. Nếu bạn có thể sử dụng html5.

Mã thông báo: https://jsfiddle.net/p1ue8qxj/


4

Chức năng này làm điều tương tự, sử dụng một số ý tưởng ở trên.

$field.keyup(function(){
    var val = $j(this).val();
    if(isNaN(val)){
         val = val.replace(/[^0-9\.]/g,'');
         if(val.split('.').length>2) val =val.replace(/\.+$/,"");
    }
    $j(this).val(val); 
});
  • hiển thị phản hồi trực quan (chữ không chính xác xuất hiện trước khi biến mất)
  • cho phép số thập phân
  • bắt nhiều "."
  • không có vấn đề với del trái / phải, v.v.

4

/ * đây là phiên bản trình duyệt chéo của tôi về Cách chỉ cho phép số (0-9) trong hộp nhập HTML bằng jQuery?
* /

$("#inputPrice").keydown(function(e){
    var keyPressed;
    if (!e) var e = window.event;
    if (e.keyCode) keyPressed = e.keyCode;
    else if (e.which) keyPressed = e.which;
    var hasDecimalPoint = (($(this).val().split('.').length-1)>0);
    if ( keyPressed == 46 || keyPressed == 8 ||((keyPressed == 190||keyPressed == 110)&&(!hasDecimalPoint && !e.shiftKey)) || keyPressed == 9 || keyPressed == 27 || keyPressed == 13 ||
             // Allow: Ctrl+A
            (keyPressed == 65 && e.ctrlKey === true) ||
             // Allow: home, end, left, right
            (keyPressed >= 35 && keyPressed <= 39)) {
                 // let it happen, don't do anything
                 return;
        }
        else {
            // Ensure that it is a number and stop the keypress
            if (e.shiftKey || (keyPressed < 48 || keyPressed > 57) && (keyPressed < 96 || keyPressed > 105 )) {
                e.preventDefault();
            }
        }

  });

3

Chỉ cần chạy nội dung thông qua parseFloat (). Nó sẽ trở lại NaNđầu vào không hợp lệ.


3

Bạn có thể sử dụng autoNumeric từ decorplanit.com . Họ có một hỗ trợ tốt cho số, cũng như tiền tệ, làm tròn, v.v.

Tôi đã sử dụng trong môi trường IE6, với một vài điều chỉnh css và đó là một thành công hợp lý.

Ví dụ: một lớp css numericInput có thể được xác định và nó có thể được sử dụng để trang trí các trường của bạn bằng các mặt nạ nhập số.

điều chỉnh từ trang web autoNumeric:

$('input.numericInput').autoNumeric({aSep: '.', aDec: ','}); // very flexible!

autoNumeric chắc chắn là con đường để đi
Prethen

3

Tôi nghĩ rằng đây là một cách tốt để giải quyết vấn đề này và nó cực kỳ đơn giản:

$(function() {
    var pastValue, pastSelectionStart, pastSelectionEnd;

    $("input").on("keydown", function() {
        pastValue          = this.value;
        pastSelectionStart = this.selectionStart;
        pastSelectionEnd   = this.selectionEnd;
    }).on("input propertychange", function() {
        var regex = /^[0-9]+\.?[0-9]*$/;

        if (this.value.length > 0 && !regex.test(this.value)) {
            this.value          = pastValue;
            this.selectionStart = pastSelectionStart;
            this.selectionEnd   = pastSelectionEnd;
        }
    });
});

Ví dụ: JSFiddle

Kịch bản được bảo hiểm

Hầu hết các khuyến nghị tương tự ở đây đều thất bại ít nhất một trong số này hoặc yêu cầu rất nhiều mã để bao quát tất cả các kịch bản này.

  1. Chỉ cho phép 1 điểm thập phân.
  2. Cho phép home, endarrow phím.
  3. Cho phép deletebackspace được sử dụng tại bất kỳ chỉ mục.
  4. Cho phép chỉnh sửa ở bất kỳ chỉ mục nào (miễn là đầu vào khớp với biểu thức chính quy).
  5. Cho phép ctrl + v và shift + insert cho đầu vào hợp lệ (tương tự với nhấp chuột phải + dán).
  6. Không nhấp nháy giá trị văn bản vì keyupsự kiện này không được sử dụng.
  7. Khôi phục lựa chọn sau khi nhập không hợp lệ.

Kịch bản thất bại

  • Bắt đầu với 0.5và chỉ xóa số 0 sẽ không hoạt động. Điều này có thể được khắc phục bằng cách thay đổi regex thành /^[0-9]*\.?[0-9]*$/và sau đó thêm một sự kiện mờ để thêm vào 0khi hộp văn bản bắt đầu bằng dấu thập phân (nếu muốn). Xem kịch bản nâng cao này để biết rõ hơn về cách khắc phục điều này.

Cắm vào

Tôi đã tạo plugin jquery đơn giản này để làm cho việc này dễ dàng hơn:

$("input").limitRegex(/^[0-9]+\.?[0-9]*$/);

2

Cách tốt nhất là kiểm tra các khía cạnh của hộp văn bản bất cứ khi nào nó mất tiêu điểm.

Bạn có thể kiểm tra xem nội dung có phải là "số" hay không bằng cách sử dụng biểu thức chính quy.

Hoặc bạn có thể sử dụng plugin Xác thực, về cơ bản sẽ tự động thực hiện việc này.


Các biểu hiện thường xuyên sẽ /^\d*\.{0,1}\d+$/
Chetan S

2

Kiểm tra mã tìm này để sử dụng Cơ sở dữ liệu:

function numonly(root){
    >>var reet = root.value;
    var arr1 = reet.length;
    var ruut = reet.charAt(arr1-1);
    >>>if (reet.length > 0){
        var regex = /[0-9]|\./;
        if (!ruut.match(regex)){
            var reet = reet.slice(0, -1);
            $(root).val(reet);
        >>>>}
    }
}
//Then use the even handler onkeyup='numonly(this)'

2

Đây là đoạn trích tôi vừa thực hiện (sử dụng một phần mã của Peter Mortensen / Keith Bentrup) để xác thực phần trăm số nguyên trên trường văn bản (bắt buộc phải có jQuery):

/* This validates that the value of the text box corresponds
 * to a percentage expressed as an integer between 1 and 100,
 * otherwise adjust the text box value for this condition is met. */
$("[id*='percent_textfield']").keyup(function(e){
    if (!isNaN(parseInt(this.value,10))) {
        this.value = parseInt(this.value);
    } else {
        this.value = 0;
    }
    this.value = this.value.replace(/[^0-9]/g, '');
    if (parseInt(this.value,10) > 100) {
        this.value = 100;
        return;
    }
});

Mã này:

  • Cho phép sử dụng các phím số chính và bàn phím số.
  • Xác thực để loại trừ các ký tự Shift-số (ví dụ #, $,%, v.v.)
  • Thay thế giá trị NaN bằng 0
  • Thay thế bằng 100 giá trị cao hơn 100

Tôi hy vọng điều này sẽ giúp những người có nhu cầu.



2

Nếu bạn đang sử dụng HTML5, bạn không cần phải thực hiện bất kỳ thời lượng dài nào để thực hiện xác thực. Chỉ dùng -

<input type="number" step="any" />

Thuộc tính bước cho phép dấu thập phân có giá trị.


2
Không phải vậy, Firefox & Opera cho phép nhập văn bản không phải là số
Michael Fever

@MichaelDeMutis bạn đúng, nó cho phép nhập văn bản không phải là số nhưng không xác thực trong FF (Tôi chưa có cơ hội thử nghiệm trong Opera).
Jay Blanchard

2

Một cách khác để giữ vị trí dấu mũ trên đầu vào:

$(document).ready(function() {
  $('.numbersOnly').on('input', function() {
    var position = this.selectionStart - 1;

    fixed = this.value.replace(/[^0-9\.]/g, '');  //remove all but number and .
    if(fixed.charAt(0) === '.')                  //can't start with .
      fixed = fixed.slice(1);

    var pos = fixed.indexOf(".") + 1;
    if(pos >= 0)
      fixed = fixed.substr(0,pos) + fixed.slice(pos).replace('.', '');  //avoid more than one .

    if (this.value !== fixed) {
      this.value = fixed;
      this.selectionStart = position;
      this.selectionEnd = position;
    }
  });
});

Ưu điểm:

  1. Người dùng có thể sử dụng các phím mũi tên, Xóa lùi, Xóa, ...
  2. Hoạt động khi bạn muốn dán số

Plunker: Demo hoạt động


1

Tôi chỉ tìm thấy một plugin thậm chí còn tốt hơn. Cung cấp cho bạn nhiều quyền kiểm soát hơn. Giả sử bạn có trường DOB nơi bạn cần số đó nhưng cũng chấp nhận các ký tự "/" hoặc "-".

Nó hoạt động rất tốt!

Kiểm tra nó tại http://itgroup.com.ph/alphanumeric/ .


1
    $(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});

Mã này hoạt động khá tốt đối với tôi, tôi chỉ cần thêm 46 trong mảng controlKeys để sử dụng khoảng thời gian, mặc dù tôi không nghĩ là cách tốt nhất để làm điều đó;)


1

Tôi đã sử dụng nó, với kết quả tốt ..

ini=$("#id").val();
a=0;
$("#id").keyup(function(e){
    var charcode = (e.which) ? e.which : e.keyCode;
    // for decimal point
    if(!(charcode===190 || charcode===110))
    {           // for numeric keys andcontrol keys
        if (!((charcode>=33 && charcode<=57) || 
        // for numpad numeric keys
        (charcode>=96 && charcode<=105) 
        // for backspace
        || charcode==8)) 
        {
            alert("Sorry! Only numeric values allowed.");
            $("#id").val(ini);
        }
        // to include decimal point if first one has been deleted.
        if(charcode===8)
        {
            ini=ini.split("").reverse();
            if(ini[0]==".")
            a=0;                 
        }
    }
    else
    {
        if(a==1)
        {
            alert("Sorry! Second decimal point not allowed.");
            $("#id").val(ini);
        }
        a=1;
    }
    ini=$("#id").val();
});


find keycodes at http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes

1

Điều này rất đơn giản là chúng ta đã có một hàm sẵn có javascript "isNaN".

$("#numeric").keydown(function(e){
  if (isNaN(String.fromCharCode(e.which))){ 
    return false; 
  }
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.