Làm cách nào để nhận giá trị thô trong trường <input type = “number”>?


117

Làm cách nào để lấy giá trị "thực" của một <input type="number">trường?


Tôi có một inputhộp và tôi đang sử dụng kiểu nhập HTML5 mới hơn number:

<input id="edQuantity" type="number">

Điều này hầu hết được hỗ trợ trong Chrome 29:

nhập mô tả hình ảnh ở đây

Điều tôi cần bây giờ là khả năng đọc giá trị "thô" mà người dùng đã nhập vào hộp nhập liệu. Nếu người dùng đã nhập một số:

nhập mô tả hình ảnh ở đây

sau đó edQuantity.value = 4 , và tất cả đều tốt.

Nhưng nếu người dùng nhập văn bản không hợp lệ, tôi muốn tô màu hộp nhập liệu màu đỏ:

nhập mô tả hình ảnh ở đây

Thật không may, đối với type="number"hộp nhập liệu, nếu giá trị trong hộp văn bản không phải là số thì valuesẽ trả về một chuỗi trống:

edQuantity.value = "" (String);

(ít nhất trong Chrome 29)

Làm cách nào tôi có thể lấy giá trị "thô" của một <input type="number">điều khiển?

tôi đã thử xem qua danh sách các thuộc tính khác của hộp nhập liệu của Chrome:

nhập mô tả hình ảnh ở đây

tôi không thấy bất cứ điều gì giống với đầu vào thực tế.

Tôi cũng không thể tìm cách để biết hộp "trống" hay không. Có lẽ tôi đã có thể suy ra:

value          isEmpty        Conclusion
=============  =============  ================
"4"            false          valid number
""             true           empty box; not a problem
""             false          invalid text; color it red

Lưu ý : Bạn có thể bỏ qua mọi thứ sau quy tắc ngang; nó chỉ là phụ để biện minh cho câu hỏi. Ngoài ra: đừng nhầm lẫn ví dụ với câu hỏi. Mọi người có thể muốn câu trả lời cho câu hỏi này vì những lý do khác ngoài việc tô màu hộp màu đỏ (Một ví dụ: chuyển đổi văn bản "four"sang tiếng Latin"4" biểu tượng trong sự kiện onBlur)

Làm cách nào tôi có thể lấy giá trị "thô" của một <input type="number">điều khiển?

Đọc thêm


2
Giá trị 'thực' của trường nhập số phải là một số. Nếu bạn muốn cho phép đầu vào numberkhông phải là giá trị số, thì không phải là kiểu đầu vào bạn đang tìm kiếm; sử dụng textđầu vào bình thường .
robertc

7
@robertc Chrome là tác nhân cho phép đầu vào không phải là số; tôi chỉ cần biết rằng họ đã nhập những thứ khác ngoài số.
Ian Boyd

1
Kiểm tra validitytrạng thái của trường - tôi mong đợi typeMismatchnhưng tôi chưa tự kiểm tra.
robertc

2
@ int32_t Đọc xuống dòng thứ sáu (nghĩa là "Nhưng nếu người dùng nhập ..." )
Ian Boyd

6
Trường hợp sử dụng của tôi ... Tôi có hai trường số: vĩ độ và kinh độ. Tôi muốn phát hiện xem ai đó dán ở "vĩ độ, kinh độ" và xử lý thích hợp. Điều này hiện là không thể với type = "number". vì "lat, lon" không hợp lệ .. không có cách nào để lấy giá trị "raw" để thực hiện regex. Một trường hợp sử dụng khác: hiển thị lỗi khách hàng: " blahlà một số không hợp lệ".
Brad Kent

Câu trả lời:


55

Theo WHATWG , bạn sẽ không thể nhận được giá trị trừ khi đó là đầu vào số hợp lệ. Thuật toán sanitization của trường số đầu vào cho biết trình duyệt phải đặt giá trị thành một chuỗi trống nếu đầu vào không phải là số dấu phẩy động hợp lệ.

Các thuật toán giá trị thanh trùng cho là như sau: Nếu giá trị của nguyên tố này không phải là một số dấu chấm động có hiệu lực , sau đó đặt nó vào chuỗi rỗng để thay thế.

Bằng cách chỉ định loại ( <input type="number">), bạn đang yêu cầu trình duyệt thực hiện một số công việc cho bạn. Mặt khác, nếu bạn muốn có thể nắm bắt đầu vào không phải là số và làm điều gì đó với nó, bạn phải dựa vào trường nhập văn bản đã được thử và đúng cũ và tự mình phân tích cú pháp nội dung.

Các W3 cũng có thông số kỹ thuật tương tự và cho biết thêm:

Tác nhân người dùng không được cho phép người dùng đặt giá trị thành một chuỗi không trống không phải là số dấu phẩy động hợp lệ.


6
Sẽ rất hữu ích nếu tác nhân người dùng không cho phép người dùng đặt giá trị thành một chuỗi không trống không phải là số dấu phẩy động hợp lệ. Nhưng nếu whatwg nói rằng nó không thể được thực hiện; thì đó là câu trả lời. Giải pháp cho nhu cầu hiện tại của tôi được thêm vào bên dưới.
Ian Boyd

57
Bằng cách chỉ định loại ( <input type="number">), bạn đang yêu cầu trình duyệt thực hiện một số công việc cho bạn. Cá nhân tôi chỉ yêu cầu các trình duyệt di động hiển thị bàn phím số và việc xác nhận là một phần bổ sung khó chịu. Hầu hết các vấn đề này xuất phát từ thực tế là typethuộc tính xác định cả quy tắc xác thực và quy tắc về cơ chế nhập nào sẽ hiển thị, nhưng hoàn toàn có thể muốn hiển thị bàn phím số cho người dùng di động mà không muốn xác thực số được áp dụng cho người dùng máy tính để bàn. HTML 5.1 ít nhất sẽ giải quyết vấn đề này cuối cùng với inputmodethuộc tính.
Mark Amery

4
nhưng khi trình duyệt không hoạt động đủ, tôi muốn có thể hoàn thành nó. chẳng hạn như xóa khoảng trắng trong đầu vào, suy ra dấu thập phân ...
njzk2

1
Ngoài ra, trong các ngôn ngữ khác nhau, chẳng hạn như tiếng Pháp, có 2 từ chỉ số. một cho các số làm định danh, chẳng hạn như số thẻ tín dụng và một để đếm số, chẳng hạn như số dấu phẩy động.
njzk2

1
@MotiKorets không hoạt động để nhập số dấu phẩy động vì iPhone không đặt dấu thập phân trên bàn phím. Đáng tiếc là các nhà phát triển đang khá screwed vào lúc này như xa như cung cấp một đẹp entry điểm nổi UX ...
Andy

50

Nó không trả lời câu hỏi, nhưng giải pháp hữu ích là kiểm tra

edQuantity.validity.valid

Các ValidityStatecủa một đối tượng cung cấp cho các đầu mối về những gì người dùng nhập vào. Xem xét type="number"đầu vào với một minmaxđặt

<input type="number" min="1" max="10">

Chúng tôi luôn muốn sử dụng .validity.valid.

Các thuộc tính khác chỉ cung cấp thông tin thưởng:

User's Input  .value  .valid | .badInput  .rangeUnderflow  .rangeOverflow
============  ======  ====== | =========  ===============  ==============
""            ""      true   | false      false            false  ;valid because field not marked required
"1"           "1"     true   | false      false            false  
"10"          "10"    true   | false      false            false
"0"           "0"     false  | false      true             false  ;invalid because below min
"11"          "11"    false  | false      false            true   ;invalid because above max
"q"           ""      false  | true       false            false  ;invalid because not number
"³"           ""      false  | true       false            false  ;superscript digit 3
"٣"           ""      false  | true       false            false  ;arabic digit 3
"₃"           ""      false  | true       false            false  ;subscript digit 3

Bạn sẽ phải đảm bảo rằng trình duyệt hỗ trợ xác thực HTML5 trước khi sử dụng:

function ValidateElementAsNumber(element)
{
   //Public Domain: no attribution required.
   if ((element.validity) && (!element.validity.valid))
   {
      //if html5 validation says it's bad: it's bad
      return false;
   }

   //Fallback to browsers that don't yet support html5 input validation
   //Or we maybe want to perform additional validations
   var value = StrToInt(element.value);
   if (value != null)
      return true;
   else
      return false;
}

Tặng kem

Spudly có một câu trả lời hữu ích mà anh ấy đã xóa:

Chỉ cần sử dụng :invalidbộ chọn CSS cho việc này.

input[type=number]:invalid {
    background-color: #FFCCCC;
}

Điều này sẽ kích hoạt phần tử của bạn chuyển sang màu đỏ bất cứ khi nào nhập giá trị không phải số.

Hỗ trợ trình duyệt cho <input type='number'>cũng giống như :invalid, vì vậy không có vấn đề gì ở đó.

Đọc thêm về :invalid ở đây .


Không hoạt động trong Opera. Nó cho biết hợp lệ ngay cả khi bạn nhập một chuỗi.
Bergi

Opera hỗ trợ thuộc .validitytính, nhưng không xử lý chính xác .valid?!
Ian Boyd

Nó có, nhưng khi nào một đầu vào số không hợp lệ ? Nó chỉ hoạt động như thể đầu vào trống. Một typeMismatchcó thể có ý nghĩa, nhưng điều đó chỉ dành cho email hoặc url loại ...
Bergi

@Bergi Bảng trên đưa ra các ví dụ trong đó đầu vào số có thể không hợp lệ: "q", "11" (khi đó giá trị lớn nhất là 10), "0" (khi giá trị nhỏ nhất là 1), "" (khi đó là phần tử required)
Ian Boyd

1
@Bergi .badInputđã được thêm vào 20/11/2012 . Nhưng không ai nên nhìn vào badInputđể xem liệu đầu vào có hợp lệ hay không; họ nên xem xét .valid. Có thể (và đúng) .badInputlà sai, và vẫn có đầu vào không hợp lệ. .validđược định nghĩa là không có bất kỳ lỗi xác thực nào (Ví dụ: không khớp, tràn, tràn dưới), trong đó .badInputchỉ là một loại lỗi. Lưu ý rằng biểu đồ ở trên .badInputlà sai, nhưng đầu vào vẫn không hợp lệ.
Ian Boyd


4

Theo dõi tất cả các phím đã nhấn dựa trên mã phím của chúng

Tôi cho rằng người ta có thể nghe các sự kiện keyup và giữ một loạt các ký tự đã nhập, dựa trên mã khóa của họ. Nhưng đó là một nhiệm vụ khá tẻ nhạt và có thể dễ xảy ra lỗi.

http://unixpapa.com/js/key.html

Chọn đầu vào và nhận lựa chọn dưới dạng chuỗi

document.querySelector('input').addEventListener('input', onInput);

function onInput(){
  this.select(); 
  console.log( window.getSelection().toString() )
}
<input type='number'>

Tất cả tín dụng cho: int32_t


Giải pháp đó đã được thử ở nơi khác và không hoạt động . Đặc biệt là khi người sử dụng máy ép Delete, Backspace, Ctrl+X, Ctrl+V, Right-click-cut, Right-click-paste.
Ian Boyd

Tôi đồng ý với bạn, về cơ bản những gì OP yêu cầu là không thể. Tuy nhiên, cả hai bản hack mà tôi đã đề cập (và chúng đều là hack, tôi không phủ nhận điều đó) đều hoạt động ở một mức độ nào đó. Có lẽ chúng có thể hữu ích cho ai đó, trong một số trường hợp?
sandstrom

đáng kinh ngạc, điều lựa chọn dường như hoạt động. Hạn chế của phương pháp đó là gì?
njzk2

Hạn chế: văn bản được chọn trực quan. Nếu sử dụng các loại gì đó nội dung sẽ được đi
fregante

Đã chỉnh sửa bản demo trực tiếp cho thấy phương pháp này tồi tệ như thế nào
vsync
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.