Nhập văn bản HTML chỉ cho phép nhập số


852

Có cách nào nhanh chóng để đặt đầu vào văn bản HTML ( <input type=text />) chỉ cho phép tổ hợp phím số (cộng với '.') Không?


81
Nhiều giải pháp ở đây chỉ hoạt động khi nhấn phím. Những điều này sẽ thất bại nếu mọi người dán văn bản bằng menu hoặc nếu họ kéo và thả văn bản vào văn bản nhập. Tôi đã bị cắn bởi điều đó trước đây. Hãy cẩn thận!
Bennett McElwee

83
@JuliusA - bạn luôn luôn cần xác nhận server-side anyway.
Stephen P

46
<input type="text" onkeypress='return event.charCode >= 48 && event.charCode <= 57'></input>
Dropogans

14
@Droogans cũng lưu ý rằng cũng vô hiệu hóa bất kỳ khóa nào khác, như TAB để đi đến đầu vào tiếp theo hoặc bất kỳ lối tắt nào khác không liên quan trực tiếp đến đầu vào như cmd + R để làm mới trang web nếu đầu vào được tập trung.
Alejandro Pérez

1
Nếu bạn ổn với Plugin, hãy sử dụng NumericInput. Bản demo: jsfiddle.net/152sumxu/2 Chi tiết khác tại đây stackoverflow.com/a/27561763/82961
Faiz

Câu trả lời:


1137

Lưu ý: Đây là một câu trả lời cập nhật. Nhận xét bên dưới đề cập đến một phiên bản cũ gây rối với mã phím.

JavaScript

Hãy thử nó trên JSFiddle .

Bạn có thể lọc các giá trị đầu vào của văn bản <input>bằng setInputFilterchức năng sau (hỗ trợ Sao chép + Dán, Kéo + Thả, phím tắt, thao tác menu ngữ cảnh, phím không gõ, vị trí dấu mũ, bố cục bàn phím khác nhau và tất cả các trình duyệt kể từ 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 = "";
      }
    });
  });
}

Bây giờ bạn có thể sử dụng setInputFilterchức năng để cài đặt bộ lọc đầu vào:

setInputFilter(document.getElementById("myTextBox"), function(value) {
  return /^\d*\.?\d*$/.test(value); // Allow digits and '.' only, using a RegExp
});

Xem bản demo của JSFiddle để biết thêm các ví dụ về bộ lọc đầu vào. Cũng lưu ý rằng bạn vẫn phải xác nhận phía máy chủ!

TypeScript

Đây là một phiên bản TypeScript này.

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

Ngoài ra còn có một phiên bản jQuery này. Xem câu trả lời này .

HTML 5

HTML 5 có một giải pháp riêng với <input type="number">(xem thông số kỹ thuật ), nhưng lưu ý rằng hỗ trợ trình duyệt khác nhau:

  • Hầu hết các trình duyệt sẽ chỉ xác nhận đầu vào khi gửi biểu mẫu chứ không phải khi nhập.
  • Hầu hết các trình duyệt di động không hỗ trợ step, minmaxcác thuộc tính.
  • Chrome (phiên bản 71.0.3578.98) vẫn cho phép người dùng nhập các ký tự eEvào trường. Cũng xem câu hỏi này .
  • Firefox (phiên bản 64.0) và Edge (EdgeHTML phiên bản 17.17134) vẫn cho phép người dùng nhập bất kỳ văn bản nào vào trường.

Hãy thử nó trên w3schools.com .


4
Mặc dù đây sẽ là một lựa chọn tốt, nhưng điều này vẫn cho phép nhập các ký tự như /, nhiều dấu chấm, toán tử khác, v.v.
Mahendra Liya

6
Vẫn không được Firefox 21 hỗ trợ (Tôi thậm chí không nói về IE9 hoặc phiên bản cũ hơn ...)
JBE

67
Số loại đầu vào không có nghĩa là được sử dụng để làm cho đầu vào của bạn chỉ chấp nhận số. Nó có nghĩa là cho các đầu vào chỉ định 'số lượng mặt hàng'. Ví dụ, Chrome thêm hai mũi tên nhỏ để tăng giảm số lượng một. Một đầu vào chỉ có số thích hợp là một loại thiếu sót vô lý đối với HTML.
Erwin

9
Kiểu = "số" không thực sự ngăn việc nhập văn bản không hợp lệ vào trường; có vẻ như bạn thậm chí có thể cắt và dán dữ liệu rác vào trường, ngay cả trong chrome.
cầu toàn

6
Điều duy nhất tôi muốn thêm vào điều này là thay đổi dòng Ctrl + A để bao gồm người dùng MacOSX:(e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true))
MForMarlon 17/03/2015

281

Sử dụng DOM này

<input type='text' onkeypress='validate(event)' />

Và kịch bản này

function validate(evt) {
  var theEvent = evt || window.event;

  // Handle paste
  if (theEvent.type === 'paste') {
      key = event.clipboardData.getData('text/plain');
  } else {
  // Handle key press
      var key = theEvent.keyCode || theEvent.which;
      key = String.fromCharCode(key);
  }
  var regex = /[0-9]|\./;
  if( !regex.test(key) ) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
  }
}

12
cài đặt tiếng Đức trên eeepc 900. một số phím để sử dụng tốt không hoạt động: - backspace (keyCode: 8) - phím điều hướng sang trái và phải (keyCode: 37, 38) cũng có thể sao chép ...
Michael Piendl

11
Hầu hết mọi người đều quan tâm, có lỗi tập lệnh xuất hiện phản ánh kém trên trang web của bạn.
Robert Jeppesen

14
vài vấn đề với mã này Bạn có thể nhập . nhiều hơn một lần, lần thứ hai nó không cho phép xóa khóa, giải pháp nào?
coure2011

4
Tôi quan tâm đến backspace, xóa và mũi tên không hoạt động. Nếu bạn xóa "theEvent.keycode ||" và thêm: "if (/ [- ~] / &&! Regex.test (key)) {" thì dù sao nó cũng hoạt động tốt hơn (đối với ASCII / UTF). Nhưng sau đó nó sẽ không từ chối các ký tự Trung Quốc! :)
Sam Watkins

4
điều này cho phép ai đó dán nội dung ngẫu nhiên vào đầu vào
Vitim.us

137

Tôi đã tìm kiếm rất lâu để có câu trả lời hay cho vấn đề này và chúng tôi rất cần <input type="number", nhưng ngắn gọn, đây là 2 cách ngắn gọn nhất mà tôi có thể nghĩ ra:

<input type="text" 
       onkeyup="this.value=this.value.replace(/[^\d]/,'')">

Nếu bạn không thích ký tự không được chấp nhận hiển thị trong một giây trước khi bị xóa, phương pháp dưới đây là giải pháp của tôi. Lưu ý nhiều điều kiện bổ sung, điều này là để tránh vô hiệu hóa tất cả các loại điều hướng và phím nóng. Nếu bất cứ ai biết làm thế nào để thu gọn điều này, hãy cho chúng tôi biết!

<input type="text" 
onkeydown="return ( event.ctrlKey || event.altKey 
                    || (47<event.keyCode && event.keyCode<58 && event.shiftKey==false) 
                    || (95<event.keyCode && event.keyCode<106)
                    || (event.keyCode==8) || (event.keyCode==9) 
                    || (event.keyCode>34 && event.keyCode<40) 
                    || (event.keyCode==46) )">

4
input type = "number" sắp có trong HTML 5 - và bạn có thể sử dụng JavaScript dưới dạng polyfill dự phòng ... stevefenton.co.uk/Content/Blog/Date/201105/Blog/iêu
Fenton

5
Phương pháp tốt nhưng có thể bị phá vỡ bằng cách nhấn và giữ một phím không chấp nhận được
Scott Brown

8
Thay đổi regex thành /[^\d+]/và nó hoạt động với việc giữ
boecko

11
@boecko cảm ơn vì điều này, nhưng lưu ý rằng nó nên được /[^\d]+/thay thế. Giải pháp tốt mặc dù. Ngoài ra @ user235859
Mosselman

11
Anh cũng muốn cho phép .. Bạn thực sự nên làm điều đó/[^0-9.]/g
Qsario

94

Đây là một đơn giản cho phép chính xác một thập phân, nhưng không hơn:

<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" />


12
Xử lý: sao chép + dán, kéo thả, chỉ cho phép 1 số thập phân, tab, xóa, xóa lùi - sử dụng cái này
Mathemats

Logic này bên trong oninput có thể được trích xuất để có thể được sử dụng trên toàn cầu không?
ema

@ema - vâng, xem câu trả lời khác của tôi ở đây cho thấy cách bạn có thể áp dụng quy tắc bằng cách sử dụng lớp.
billynoah

nếu bạn sử dụng điều này trên dạng góc, giá trị sẽ không cập nhật trong giá trị điều khiển biểu mẫu.
Ale_info

Tuyệt vời. Tôi thay đổi sự kiện thành this.value = this.value.replace (/ [^ 0-9 .-] / g, '') .replace (/(\..*)\./ g, '$ 1'). thay thế (/ ^ 0 + / g, '') .replace (/ (? <! ^) - / g, ''); Bằng cách này, nó chỉ xử lý một - ở đầu và không cho phép 0 ở đầu số.
brenth

54

Và một ví dụ nữa, hoạt động rất tốt cho tôi:

function validateNumber(event) {
    var key = window.event ? event.keyCode : event.which;
    if (event.keyCode === 8 || event.keyCode === 46) {
        return true;
    } else if ( key < 48 || key > 57 ) {
        return false;
    } else {
        return true;
    }
};

Đồng thời đính kèm với sự kiện nhấn phím

$(document).ready(function(){
    $('[id^=edit]').keypress(validateNumber);
});

Và HTML:

<input type="input" id="edit1" value="0" size="5" maxlength="5" />

Dưới đây là một ví dụ jsFiddle


Những gì về văn bản dán?
Jason Ebersey

Tại sao tôi nhận được "sự kiện không xác định" khi tôi gọi hàm này?
Vincent

1
điều này không hoạt động trên Firefox khi event.keyCode luôn được trả về 0. Tôi đã sửa với mã mới: function validateNumber (event) {var key = event.which || event.charCode | | event.keyCode | | 0; if (key == 8 | | key == 46 || key == 37 || key == 39) {return true; } if if (key <48 | | key> 57) {return false; } trả về đúng; };
Luân Nguyên

1
Như @Jessica đã nói, bạn cam thêm dấu nháy đơn và thậm chí là dấu phần trăm.
Alejandro Nava

1
Rất gần! nhưng không cho phép nhiều hơn một số thập phân.
kross

52

HTML5 có <input type=number>, âm thanh phù hợp với bạn. Hiện tại, chỉ có Opera hỗ trợ nó một cách tự nhiên, nhưng có một dự án có triển khai JavaScript.


Đây là một tài liệu xác định trình duyệt nào hỗ trợ thuộc tính này: caniuse.com/input-number . Khi viết bài này, Chrome và Safari đều hỗ trợ đầy đủ trường loại này. IE 10 có hỗ trợ một phần và Firefox không hỗ trợ.
Nathan Wallace

Vấn đề duy nhất type=numberlà không được IE9 hỗ trợ
J Rod

@JRod Có một polyfill cho IE cũ. Thêm thông tin ở đây .
jkdev 7/07/2016

6
Vấn đề đầu tiên type=numberlà cho phép echar vì nó coi e+10là số. Vấn đề thứ hai là bạn không thể giới hạn số ký tự tối đa trong đầu vào.
Hakan Fıstık

Một vấn đề khác là nếu loại là số thì tôi không thể nhận được lợi ích của việc đặt loại thành, ví dụ: "tel".
ScottyBlades

49

Hầu hết các câu trả lời ở đây đều có điểm yếu là sử dụng các sự kiện chính .

Nhiều câu trả lời sẽ hạn chế khả năng lựa chọn văn bản của bạn với macro bàn phím, sao chép + dán và nhiều hành vi không mong muốn khác, những câu trả lời khác dường như phụ thuộc vào các plugin jQuery cụ thể, đó là giết ruồi bằng súng máy.

Giải pháp đơn giản này dường như hoạt động tốt nhất đối với tôi đa nền tảng, bất kể cơ chế nhập liệu (tổ hợp phím, sao chép + dán, sao chép bên phải + dán, lời nói thành văn bản, v.v.). Tất cả các macro bàn phím chọn văn bản vẫn sẽ hoạt động và thậm chí nó sẽ giới hạn khả năng của một người để đặt giá trị không phải là số theo tập lệnh.

function forceNumeric(){
    var $input = $(this);
    $input.val($input.val().replace(/[^\d]+/g,''));
}
$('body').on('propertychange input', 'input[type="number"]', forceNumeric);

jQuery 1.7+ cần thiết. Đây là một câu trả lời đầy đủ hơn vì nó đưa vào đầu vào tài khoản thông qua "bản sao". Và nó cũng đơn giản hơn!
Memochipan

Một regex thay thế: replace(/[^\d]+/g,'')Thay thế tất cả các chữ số không bằng chuỗi trống. Công cụ sửa đổi "i" (không phân biệt chữ hoa chữ thường) là không cần thiết.
Memochipan

Điều này nên được đặt lên hàng đầu, vì các trình xử lý sự kiện "onkey" trong thẻ không nên được truyền bá nữa ...
gpinkas

Đây chắc chắn là câu trả lời tốt nhất ở đây nhưng nó không cho phép các chữ số có số thập phân. Bất cứ ý tưởng làm thế nào mà có thể làm việc?
Atirag

6
@Atirag Nếu bạn muốn số thập phân, bạn có thể thay đổi biểu thức chính thức/[^\d,.]+/
EJTH

41

Tôi đã chọn sử dụng kết hợp hai câu trả lời được đề cập ở đây tức là

<input type="number" />

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode
    return !(charCode > 31 && (charCode < 48 || charCode > 57));
}

<input type="text" onkeypress="return isNumberKey(event);">


Câu trả lời tuyệt vời ... +1. Bạn cũng có thể giảm câu lệnh if thành: return !(charCode > 31 && (charCode < 48 || charCode > 57));
schadeck

7
Làm thế nào về việc xóa mặc dù? Bạn muốn số nhưng có lẽ bạn muốn mọi người có thể sửa chúng mà không cần làm mới trang ...
Martin Erlic

40

HTML5 hỗ trợ regexes, vì vậy bạn có thể sử dụng điều này:

<input id="numbersOnly" pattern="[0-9.]+" type="text">

Cảnh báo: Một số trình duyệt chưa hỗ trợ này.


7
HTML5 cũng có <input type=number>.
Mathias Bynens

Thật. Bạn nên làm điều này một câu trả lời. Ooops, @ Ms2ger đã có.
james.garriss

<Input type = number> thêm mũi tên để tăng và giảm trong một số trình duyệt nhất định, vì vậy đây có vẻ là một giải pháp tốt khi chúng tôi muốn tránh spinner
Ayrad

35
Mẫu chỉ được kiểm tra khi gửi. Bạn vẫn có thể nhập chữ cái.
Erwin

+nghĩa là gì trong thuộc tính mẫu?
PlanetHackers

18

JavaScript

function validateNumber(evt) {
    var e = evt || window.event;
    var key = e.keyCode || e.which;

    if (!e.shiftKey && !e.altKey && !e.ctrlKey &&
    // numbers   
    key >= 48 && key <= 57 ||
    // Numeric keypad
    key >= 96 && key <= 105 ||
    // Backspace and Tab and Enter
    key == 8 || key == 9 || key == 13 ||
    // Home and End
    key == 35 || key == 36 ||
    // left and right arrows
    key == 37 || key == 39 ||
    // Del and Ins
    key == 46 || key == 45) {
        // input is VALID
    }
    else {
        // input is INVALID
        e.returnValue = false;
        if (e.preventDefault) e.preventDefault();
    }
}

thêm bạn có thể thêm dấu phẩy, dấu chấm và dấu trừ (, .-)

  // comma, period and minus, . on keypad
  key == 190 || key == 188 || key == 109 || key == 110 ||

HTML

<input type="text" onkeydown="validateNumber(event);"/ >

Không hoạt động chính xác trên bàn phím trong đó người ta phải sử dụng phím shift để nhập số (ví dụ: bàn phím AZERTY châu Âu).
Thuyền trưởng Sensible

cảm ơn người đàn ông, bạn thực sự hiểu một câu hỏi! Ví dụ đẹp và xử lý khóa học. hoặc, (mà hầu hết mọi người đều muốn nếu họ làm việc với các số)
real_yggdrasil

Đây là cái duy nhất hoạt động ngăn dán các giá trị không phải là số.
DEREK LEE

16

Quá đơn giản....

// Trong một hàm JavaScript (có thể sử dụng HTML hoặc PHP).

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

Trong mẫu đầu vào của bạn:

<input type=text name=form_number size=20 maxlength=12 onkeypress='return isNumberKey(event)'>

Với đầu vào tối đa. (Những điều trên cho phép số 12 chữ số)


Đừng làm vậy! Điều này chặn tất cả mọi thứ, numpad, phím mũi tên, phím Xóa, phím tắt (ví dụ CTRL + A, CTRL + R), ngay cả phím TAB, nó thực sự anoying!
Korri

@Korri Tôi không theo dõi, điều gì có vẻ là vấn đề? Nó đã làm việc tốt trong trường hợp của tôi.
uneakharsh

dòng đầu tiên phải đổi thành:var charCode = (evt.which) ? evt.which : evt.keyCode;
peiman F.

15

2 giải pháp:

Sử dụng trình xác thực mẫu (ví dụ với plugin xác thực jQuery )

Thực hiện kiểm tra trong sự kiện onblur (tức là khi người dùng rời khỏi trường) của trường đầu vào, với biểu thức chính quy:

<script type="text/javascript">
function testField(field) {
    var regExpr = new RegExp("^\d*\.?\d*$");
    if (!regExpr.test(field.value)) {
      // Case of error
      field.value = "";
    }
}

</script>

<input type="text" ... onblur="testField(this);"/>

Thật thú vị, tôi đã phải đưa ra biểu thức chính là "^ \\ d \\.? \\ d * $", nhưng đó có thể là do trang được chạy qua một biến đổi XSLT.
Paul Tomblin

Tôi nghĩ rằng biểu thức chính quy là không chính xác. Tôi đã sử dụng dòng này:var regExpr = /^\d+(\.\d*)?$/;
costa

@costa không chắc chắn, nếu người dùng muốn nhập .123(thay vì 0.123) chẳng hạn?
Romain Linsolas

@romaintaz. Bạn đã đúng, nhưng sau đó bạn phải thay đổi biểu thức chính quy để đảm bảo rằng trong trường hợp không có chữ số ở phía trước dấu chấm thì có các chữ số sau dấu chấm. Một cái gì đó như thế này : var regExpr = /^\d+(\.\d*)?$|^\.\d+$/;.
costa

14

Một cách tiếp cận an toàn hơn là kiểm tra giá trị của đầu vào, thay vì chiếm quyền điều khiển phím và cố gắng lọc các Mã khóa.

Bằng cách này, người dùng có thể tự do sử dụng mũi tên bàn phím, phím bổ trợ, xóa lùi, xóa, sử dụng bàn phím không chuẩn, sử dụng chuột để dán, sử dụng kéo và thả văn bản, thậm chí sử dụng đầu vào trợ năng.

Kịch bản dưới đây cho phép số dương và số âm

1
10
100.0
100.01
-1
-1.0
-10.00
1.0.0 //not allowed

var input = document.getElementById('number');
input.onkeyup = input.onchange = enforceFloat;

//enforce that only a float can be inputed
function enforceFloat() {
  var valid = /^\-?\d+\.\d*$|^\-?[\d]*$/;
  var number = /\-\d+\.\d*|\-[\d]*|[\d]+\.[\d]*|[\d]+/;
  if (!valid.test(this.value)) {
    var n = this.value.match(number);
    this.value = n ? n[0] : '';
  }
}
<input id="number" value="-3.1415" placeholder="Type a number" autofocus>

EDIT: Tôi đã xóa câu trả lời cũ của tôi bởi vì tôi nghĩ rằng nó là cổ xưa.


Điều này thực sự có vẻ bao trùm hầu hết các trường hợp
Zia Ul Rehman Mughal


13

Vui lòng tìm giải pháp được đề cập dưới đây. Trong thành viên này có thể có thể chỉ nhập numericgiá trị, cũng dùng không thể có thể copy, paste, dragdropở đầu vào.

Nhân vật được phép

0,1,2,3,4,5,6,7,8,9

Không được phép Nhân vật và Nhân vật thông qua các sự kiện

  • Giá trị chữ cái
  • Nhân vật đặc biệt
  • Sao chép
  • Dán
  • Kéo
  • Rơi vãi

$(document).ready(function() {
  $('#number').bind("cut copy paste drag drop", function(e) {
      e.preventDefault();
  });     
});
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" class="form-control" name="number" id="number" onkeypress="return isNumberKey(event)" placeholder="Enter Numeric value only">

Hãy cho tôi biết nếu nó không hoạt động.


11

Nếu bạn muốn đề xuất với thiết bị (có thể là điện thoại di động) giữa alpha hoặc số bạn có thể sử dụng <input type="number">.


11

Một ví dụ nữa trong đó bạn chỉ có thể thêm số trong trường nhập, không thể chữ

<input type="text" class="form-control" id="phone" name="phone" placeholder="PHONE" spellcheck="false" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');">

10

Việc triển khai ngắn và ngọt ngào bằng cách sử dụng jQuery và thay thế () thay vì nhìn vào event.keyCode hoặc event.which:

$('input.numeric').live('keyup', function(e) {
  $(this).val($(this).val().replace(/[^0-9]/g, ''));
});

Chỉ có tác dụng phụ nhỏ mà chữ được gõ xuất hiện trong giây lát và CTRL / CMD + A có vẻ hơi lạ.


9

input type="number" là một thuộc tính HTML5.

Trong trường hợp khác, điều này sẽ giúp bạn:

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

<input type="number" name="somecode" onkeypress="return isNumberKey(event)"/>

dòng đầu tiên phải đổi thành:var charCode = (evt.which) ? evt.which : evt.keyCode;
peiman F.

9

Mã JavaScript:

function validate(evt)
{
    if(evt.keyCode!=8)
    {
        var theEvent = evt || window.event;
        var key = theEvent.keyCode || theEvent.which;
        key = String.fromCharCode(key);
        var regex = /[0-9]|\./;
        if (!regex.test(key))
        {
            theEvent.returnValue = false;

            if (theEvent.preventDefault)
                theEvent.preventDefault();
            }
        }
    }

Mã HTML:

<input type='text' name='price' value='0' onkeypress='validate(event)'/>

hoạt động hoàn hảo vì mã khóa backspace là 8 và biểu thức regex không cho phép, vì vậy đây là cách dễ dàng để vượt qua lỗi :)


9

Một cách dễ dàng để giải quyết vấn đề này là triển khai một hàm jQuery để xác thực bằng regex, các ký tự được nhập vào hộp văn bản chẳng hạn:

Mã html của bạn:

<input class="integerInput" type="text">

Và hàm js sử dụng jQuery

$(function() {
    $('.integerInput').on('input', function() {
      this.value = this.value
        .replace(/[^\d]/g, '');// numbers and decimals only

    });
});

$(function() {
        $('.integerInput').on('input', function() {
          this.value = this.value
            .replace(/[^\d]/g, '');// numbers and decimals only
            
        });
    });
<script
			  src="https://code.jquery.com/jquery-2.2.4.min.js"
			  integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
			  crossorigin="anonymous">
</script>

<input type="text" class="integerInput"/>


		


8

Chỉ là một biến thể khác với jQuery bằng cách sử dụng

$(".numeric").keypress(function() {
    return (/\d/.test(String.fromCharCode(event.which) ))
});

8

chỉ cần sử dụng type = "number" ngay bây giờ thuộc tính này hỗ trợ trong hầu hết các trình duyệt

<input type="number" maxlength="3" ng-bind="first">

Tôi chưa kiểm tra dữ liệu là --1(2 ký tự trừ trước 1).
Ngọc Nam

6

Bạn cũng có thể so sánh giá trị đầu vào (được coi là chuỗi theo mặc định) với chính nó bị ép buộc dưới dạng số, như:

if(event.target.value == event.target.value * 1) {
    // returns true if input value is numeric string
}

Tuy nhiên, bạn cần liên kết nó với sự kiện như keyup, v.v.


6
<input name="amount" type="text" value="Only number in here"/> 

<script>
    $('input[name=amount]').keyup(function(){
        $(this).val($(this).val().replace(/[^\d]/,''));
    });
</script>

6

Tôi đã thấy một số câu trả lời tuyệt vời tuy nhiên tôi thích chúng nhỏ và đơn giản nhất có thể, vì vậy có lẽ ai đó sẽ được hưởng lợi từ nó. Tôi sẽ sử dụng javascript Number()isNaNchức năng như thế này:

if(isNaN(Number(str))) {
   // ... Exception it is NOT a number
} else {
   // ... Do something you have a number
}

Hi vọng điêu nay co ich.


1
Tôi thích điều này! Như một giải pháp tao nhã, không có regex liên quan.
Levi Roberts

Đây không phải là một câu trả lời cho câu hỏi, OP yêu cầu chỉ cho phép văn bản trên một đầu vào, không xác minh sau đó.
Timberman

Vâng, đó là sự thật! Nhưng đã có một câu trả lời được chấp nhận mà tôi nghĩ là tốt, nhưng tôi nghĩ rằng điều này có thể giúp được ai đó, cộng với nó tốt và sạch sẽ.
Sicha

5

Sử dụng DOM này:

<input type = "text" onkeydown = "validate(event)"/>

Và kịch bản này:

validate = function(evt)
{
    if ([8, 46, 37, 39, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 35, 36].indexOf(evt.keyCode || evt.which) == -1)
    {
        evt.returnValue = false;
        if(evt.preventDefault){evt.preventDefault();}
    }
}

... HOẶC tập lệnh này, không có indexOf, sử dụng hai for...

validate = function(evt)
{
    var CharValidate = new Array("08", "046", "039", "948", "235");
    var number_pressed = false;
    for (i = 0; i < 5; i++)
    {
        for (Ncount = 0; Ncount < parseInt(CharValidate[i].substring(0, 1)) + 1; Ncount++)
        {
            if ((evt.keyCode || evt.which) == parseInt(CharValidate[i].substring(1, CharValidate[i].lenght)) + Ncount)
            {
                number_pressed = true;
            }
        }
    }
    if (number_pressed == false)
    {
        evt.returnValue = false;
        if(evt.preventDefault){evt.preventDefault();}
    }
}

Tôi đã sử dụng thuộc tính onkeydown thay vì onkeypress, vì thuộc tính onkeydown được kiểm tra trước thuộc tính onkeypress. Vấn đề sẽ nằm ở trình duyệt Google Chrome.

Với thuộc tính "onkeypress", TAB sẽ không thể kiểm soát được với "notifyDefault" trên google chrome, tuy nhiên, với thuộc tính "onkeydown", TAB trở nên có thể kiểm soát được!

Mã ASCII cho TAB => 9

Tập lệnh đầu tiên có ít mã hơn tập lệnh thứ hai, tuy nhiên, mảng các ký tự ASCII phải có tất cả các khóa.

Kịch bản thứ hai lớn hơn nhiều so với tập lệnh đầu tiên, nhưng mảng không cần tất cả các khóa. Chữ số đầu tiên trong mỗi vị trí của mảng là số lần mỗi vị trí sẽ được đọc. Đối với mỗi lần đọc, sẽ được tăng 1 đến lần tiếp theo. Ví dụ:




NCount = 0

48 + NCount = 48

NCount + +

48 + NCount = 49

NCount + +

...

48 + NCount = 57




Trong trường hợp các phím số chỉ là 10 (0 - 9), nhưng nếu chúng là 1 triệu thì sẽ không có ý nghĩa gì khi tạo một mảng với tất cả các phím này.

Mã ASCII:

  • 8 ==> (Backspace);
  • 46 => (Xóa);
  • 37 => (mũi tên trái);
  • 39 => (mũi tên phải);
  • 48 - 57 => (số);
  • 36 => (nhà);
  • 35 => (kết thúc);

5

Đây là một chức năng được cải thiện:

function validateNumber(evt) {
  var theEvent = evt || window.event;
  var key = theEvent.keyCode || theEvent.which;
  if ((key < 48 || key > 57) && !(key == 8 || key == 9 || key == 13 || key == 37 || key == 39 || key == 46) ){
    theEvent.returnValue = false;
    if (theEvent.preventDefault) theEvent.preventDefault();
  }
}

4

Cách tốt nhất (cho phép TẤT CẢ các loại số - âm thực, dương thực, âm iinteger, dương nguyên) là:

$(input).keypress(function (evt){
    var theEvent = evt || window.event;
    var key = theEvent.keyCode || theEvent.which;
    key = String.fromCharCode( key );
    var regex = /[-\d\.]/; // dowolna liczba (+- ,.) :)
    var objRegex = /^-?\d*[\.]?\d*$/;
    var val = $(evt.target).val();
    if(!regex.test(key) || !objRegex.test(val+key) || 
            !theEvent.keyCode == 46 || !theEvent.keyCode == 8) {
        theEvent.returnValue = false;
        if(theEvent.preventDefault) theEvent.preventDefault();
    };
}); 

4

Đây là phiên bản mở rộng của giải pháp geowa4 . Hỗ trợ minmaxthuộc tính. Nếu số nằm ngoài phạm vi, giá trị trước đó sẽ được hiển thị.

Bạn có thể kiểm tra nó ở đây.

Sử dụng: <input type=text class='number' maxlength=3 min=1 max=500>

function number(e) {
var theEvent = e || window.event;
var key = theEvent.keyCode || theEvent.which;
if(key!=13&&key!=9){//allow enter and tab
  key = String.fromCharCode( key );
  var regex = /[0-9]|\./;
  if( !regex.test(key)) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
    }   
  }
}

$(document).ready(function(){
    $("input[type=text]").filter(".number,.NUMBER").on({
        "focus":function(e){
         $(e.target).data('oldValue',$(e.target).val());
            },
        "keypress":function(e){
                e.target.oldvalue = e.target.value;
                number(e);
            },
        "change":function(e){
            var t = e.target;
            var min = $(t).attr("min");
            var max = $(t).attr("max");
            var val = parseInt($(t).val(),10);          
            if( val<min || max<val)
                {
                    alert("Error!");
                    $(t).val($(t).data('oldValue'));
                }

            }       
    });     
});

Nếu các đầu vào là động sử dụng này:

$(document).ready(function(){
    $("body").on("focus","input[type=text].number,.NUMBER",function(e){
        $(e.target).data('oldValue',$(e.target).val());
    }); 
    $("body").on("keypress","input[type=text].number,.NUMBER",function(e){
        e.target.oldvalue = e.target.value;
        number(e);
    }); 
    $("body").on("change","input[type=text].number,.NUMBER",function(e){
        var t = e.target
        var min = $(t).attr("min");
        var max = $(t).attr("max");
        var val = parseInt($(t).val());         
        if( val<min || max<val)
            {
                alert("Error!");
                $(t).val($(t).data('oldValue'));
            }
    }); 
});

@UserB này không nên xóa bất cứ điều gì.
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.