Điện thoại: bàn phím số để nhập văn bản


178

Có cách nào để buộc bàn phím số xuất hiện trên điện thoại <input type="text">không? Tôi mới nhận ra rằng <input type="number">trong HTML5 là dành cho các số có dấu phẩy động, nên nó không phù hợp với số thẻ tín dụng, mã ZIP, v.v.

Tôi muốn mô phỏng chức năng bàn phím số của <input type="number">, đối với các đầu vào lấy các giá trị số khác với số dấu phẩy động. Có, có lẽ, một inputloại thích hợp khác mà làm điều đó?


Vẫn chưa có câu trả lời tuyệt vời cho mã bưu chính. Tôi đã hỏi lại câu hỏi này cụ thể cho các mã bưu chính quốc tế tại đây: stackoverflow.com/questions/25425181/
mẹo

Tôi đã tìm ra một cách hackish để làm điều này .. tổng hợp của: stackoverflow.com/a/25599024/1922144
davidcondrey

Vào giữa năm 2015, có một cách tốt hơn để làm điều này: stackoverflow.com/a/31619311/806956
Aaron Gray

Câu trả lời:


206

Bạn có thể làm <input type="text" pattern="\d*">. Điều này sẽ khiến bàn phím số xuất hiện.

Xem tại đây để biết thêm chi tiết: Hướng dẫn lập trình văn bản, web và chỉnh sửa cho iOS

<form>
  <input type="text" pattern="\d*">
  <button type="submit">Submit</button>
</form>


23
Nếu bạn chỉ muốn bàn phím số nhưng không muốn xác thực (chẳng hạn như trong Chrome), bạn có thể đặt thuộc tính novalidate trên biểu mẫu. <mẫu ... novalidate>
Brian

4
Tôi đã tìm thấy rằng \d*không hoạt động và [0-9]được yêu cầu. Lưu ý rằng điều này sẽ làm việc với type='numeric'. Điều này được đề xuất dựa trên tài liệu tham khảo được liên kết cho mã zip.
Brett Ryan

11
Điều này hoạt động miễn là bạn chỉ cần các giá trị số. Số dấu phẩy động yêu cầu '.' (hoặc ',' đối với một số vùng) không thể được nhập vì bàn phím không bao gồm các ký tự này.
DrHall

2
Nếu tôi cần sử dụng. (dấu chấm), làm thế nào tôi có thể sử dụng nó? mẫu này chỉ hiển thị [0-9]

15
<input type = "text" pattern = "\ d *"> không hoạt động trên Android? Tôi đã thử nghiệm trên ios và làm việc thành công nhưng không hoạt động trên Android. làm thế nào tôi có thể giải quyết nó
kamal

158

Vào giữa năm 2015, tôi tin rằng đây là giải pháp tốt nhất:

<input type="number" pattern="[0-9]*" inputmode="numeric">

Điều này sẽ cung cấp cho bạn bàn phím số trên cả Android và iOS:

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

Nó cũng cung cấp cho bạn hành vi máy tính để bàn dự kiến ​​với các nút mũi tên lên / xuống và tăng phím mũi tên lên / xuống thân thiện với bàn phím:

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

Hãy thử nó trong đoạn mã này:

<form>
  <input type="number" pattern="[0-9]*" inputmode="numeric">
  <button type="submit">Submit</button>
</form>

Bằng cách kết hợp cả hai type="number"pattern="[0-9]*, chúng tôi có được một giải pháp hoạt động ở mọi nơi. Và, chuyển tiếp tương thích với inputmodethuộc tính đề xuất HTML 5.1 trong tương lai .

Lưu ý: Sử dụng một mẫu sẽ kích hoạt xác thực mẫu gốc của trình duyệt. Bạn có thể vô hiệu hóa điều này bằng cách sử dụng novalidatethuộc tính hoặc bạn có thể tùy chỉnh thông báo lỗi cho xác thực không thành công bằng cách sử dụng titlethuộc tính.


Nếu bạn cần có thể nhập các số 0, dấu phẩy hoặc chữ cái hàng đầu - ví dụ: mã bưu chính quốc tế - hãy xem biến thể nhỏ này .


Tín dụng và đọc thêm:

http://www.smashingmagazine.com/2015/05/form-inputs-browser-support-su/ http://danielfriesen.name/blog/2013/09/19/input-type-number-and-ios- bàn phím số/


1
HTML5 type="number" đặc tả nói Các thuộc tính nội dung sau đây không được quy định và không áp dụng cho các phần tử: ... inputmode
TGR

2
@Tgr Ahh, bắt tốt. Nó xuất hiện thông số kỹ thuật muốn mọi người sử dụng <input type="text" inputmode="numeric">và nó muốn các trình duyệt di động nhìn vào inputmodeđể xác định xem nó hiển thị bàn phím số hoặc bàn phím đầy đủ. Vì không có trình duyệt hỗ trợ inputmode, tôi không chắc nó sẽ được triển khai như thế nào trên máy tính để bàn so với trình duyệt di động. Ví dụ: Trình duyệt máy tính để bàn có cho phép nhập thư <input type="text" inputmode="numeric">không? Nếu vậy, đó là một vấn đề. <input type="number">ngăn chặn điều này, chỉ cho phép số lượng. Có lẽ chúng ta sẽ phải đợi cho đến khi các trình duyệt bắt đầu thực hiện nó và sau đó chúng ta có thể cập nhật câu trả lời này.
Aaron Gray

2
Hỗ trợ type="number"khá , nhưng nó có thể hiển thị một công cụ quay vòng không có ý nghĩa nhiều, ví dụ như số thẻ tín dụng.
Tgr

2
Có loại = "số" là một nỗi đau ở ass X (. Nếu đầu vào không hợp lệ, bạn sẽ không thể nhận được giá trị của đầu vào trong JS, bạn không thể có được vị trí con trỏ, v.v.
Nicu Surdu

2
This attribute applies when the value of the type attribute is text, search, tel, url, email, or password, otherwise it is ignored.
Michael Laffargue

61

Tôi đã thấy rằng, ít nhất là đối với các trường giống như "mật mã", làm một việc gì đó giống như <input type="tel" />kết thúc việc tạo ra trường xác định số xác thực nhất và nó cũng có lợi ích là không tự động định dạng . Ví dụ, trong một ứng dụng di động mà tôi đã phát triển cho Hilton gần đây, tôi đã kết thúc việc này:

Ứng dụng web trên iPhone hiển thị với thẻ đầu vào Có loại điện thoại tạo ra bàn phím số rất tinh vi đối lập với số loại được tự động định dạng và có cấu hình đầu vào ít trực quan hơn

... và khách hàng của tôi đã rất ấn tượng.

<form>
  <input type="tel" />
  <button type="submit">Submit</button>
</form>


4
Vấn đề đối với tôi không phải là định dạng tự động, mà là xác nhận. Đầu vào của loại numberbuộc các quy tắc nghiêm ngặt cho số trong nhiều trình duyệt. Nếu người dùng thêm không gian (hoặc dấu phẩy) để phân tách hàng nghìn, bạn sẽ không nhận được BẤT K value giá trị nào từ đầu vào. Có, ngay cả trong JavaScript input.valuesẽ trống. Đầu vào của loại telkhông bị hạn chế ở định dạng cụ thể để người dùng vẫn có thể nhập bất cứ thứ gì và xác thực là một quy trình riêng (để nhà phát triển xử lý).
Nux

Làm cách nào tôi có thể sử dụng số thập phân trong bàn phím này
Anto

11

Sử dụng type="email"hoặc type="url"sẽ cung cấp cho bạn một bàn phím trên một số điện thoại, chẳng hạn như iPhone. Đối với số điện thoại, bạn có thể sử dụng type="tel".


9

Có một mối nguy hiểm với việc sử dụng <input type="text" pattern="\d*">để đưa lên bàn phím số. Trên firefox và chrome, biểu thức chính quy có trong mẫu khiến trình duyệt xác thực đầu vào cho biểu thức đó. lỗi sẽ xảy ra nếu nó không khớp với mẫu hoặc để trống. Hãy nhận biết các hành động ngoài ý muốn trong các trình duyệt khác.


6
Thêm một novalidatethuộc tính trên có chứa form elementsẽ giải quyết các vấn đề xác thực tự động. Hãy chắc chắn để thực hiện một số xác nhận trên của riêng bạn.
Justus Romijn


4

Tôi nghĩ type="number"là tốt nhất cho trang web ngữ nghĩa. Nếu bạn chỉ muốn thay đổi bàn phím, bạn có thể sử dụng type="number"hoặc type="tel". Trong cả hai trường hợp, iPhone không hạn chế nhập liệu của người dùng. Người dùng vẫn có thể nhập (hoặc dán) bất kỳ ký tự nào mình muốn. Thay đổi duy nhất là bàn phím hiển thị cho người dùng. Nếu bạn muốn bất kỳ hạn chế nào ngoài điều này, bạn cần sử dụng JavaScript.


8
Vấn đề tôi gặp phải là loại = "số" chỉ được coi là dành cho số dấu phẩy động - vì vậy không có thẻ tín dụng, mã zip hoặc một loạt các số khác chỉ có chuỗi. Tôi đã hy vọng có cả một cách mã hóa ngữ nghĩa cũng như làm cho màn hình bàn phím phù hợp. Loại phù hợp, tôi nghĩ, sẽ là kiểu nhập = "văn bản" nhưng sau đó bàn phím sai sẽ hiển thị. Nếu bạn có thể chỉ cho tôi một số javascript để làm điều đó, điều đó sẽ giải quyết cả hai vấn đề.
Tami

2
type="number"là cho phao. type="text"là cho chuỗi. Những gì bạn thực sự muốn là số nguyên. Tôi nghĩ float gần với số nguyên hơn chuỗi. Bạn nghĩ sao?
Mèo Chen

6
Một điều cần lưu ý với loại = "số" là ít nhất Chrome sẽ buộc đầu vào là một số - sẽ phá vỡ số thẻ tín dụng được nhập bằng dấu cách (ví dụ)
John Carter

8
@therefromhere Nó cũng sẽ biến zip mã như 01920để 1920.
ceejayoz

nó cũng sẽ gây rối nếu người dùng có một ngôn ngữ khác được đặt trong stackoverflow.com/questions/5345095/
lúc 14:30

4

Đối với tôi giải pháp tốt nhất là:

Đối với các số nguyên, sẽ xuất hiện pad 0-9 trên Android và iphone

<label for="ting">
<input id="ting" name="ting" type="number" pattern="[\d]*" />

Bạn cũng có thể muốn làm điều này để ẩn các spinners trong firefox / chrome / safari, hầu hết khách hàng nghĩ rằng họ trông xấu xí

 input[type=number]::-webkit-inner-spin-button,
 input[type=number]::-webkit-outer-spin-button {
      -webkit-appearance: none;
      margin: 0;
 }

 input[type=number] {
      -moz-appearance:textfield;
 }

Và thêm novalidate = 'novalidate' vào phần tử biểu mẫu của bạn, nếu xác thực tùy chỉnh của bạn

Cuối cùng, chỉ trong trường hợp bạn thực sự muốn số dấu phẩy động, bước tới bất kỳ độ chính xác nào bạn thích, sẽ thêm '.' với Android

<label for="ting">
<input id="ting" name="ting" type="number" pattern="[\d\.]*" step="0.01" />

1

Năm 2018:

<input type="number" pattern="\d*">

đang làm việc cho cả Android và iOS.

Tôi đã thử nghiệm trên Android (^ 4.2) và iOS (11.3)


0

Bạn có thể thử như thế này:

<input type="number" name="input">
<input type="submit" value="Next" formnovalidate="formnovalidate">

Nhưng hãy cẩn thận: Nếu đầu vào của bạn chứa thứ gì đó không phải là số, nó sẽ không được truyền đến máy chủ.


0

Tôi không thể tìm thấy loại phù hợp nhất với mình trong mọi tình huống: Tôi cần mặc định cho mục nhập số (ví dụ: mục "7.5") nhưng cũng có lúc cho phép văn bản (ví dụ "vượt qua"). Người dùng muốn có một bàn phím số (ví dụ: mục 7.5) nhưng mục nhập văn bản không thường xuyên được yêu cầu (ví dụ "vượt qua").

Thay vào đó, những gì tôi đã làm là thêm một hộp kiểm vào biểu mẫu và cho phép người dùng chuyển đổi đầu vào của tôi (id = "inputSresult") giữa type = "number" và type = "text".

<input type="number" id="result"... >
<label><input id="cbAllowTextResults" type="checkbox" ...>Allow entry of text results.</label>

Sau đó, tôi đã kết nối một trình xử lý nhấp chuột vào hộp kiểm chuyển đổi loại giữa văn bản và số dựa trên việc hộp kiểm ở trên có được chọn hay không:

$(document).ready(function () {
    var cb = document.getElementById('cbAllowTextResults');
    cb.onclick = function (event) {
        if ($("#cbAllowTextResults").is(":checked"))
            $("#result").attr("type", "text");
        else
            $("#result").attr("type", "number");

    }
});

Điều này làm việc tốt cho chúng tôi.


0
 <input type="text" inputmode="decimal">

nó sẽ cung cấp cho bạn nhập văn bản bằng cách sử dụng bàn phím số


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.