โทรศัพท์: แป้นพิมพ์ตัวเลขสำหรับการป้อนข้อความ


178

มีวิธีบังคับให้แป้นพิมพ์ตัวเลขปรากฏขึ้นบนโทรศัพท์<input type="text">หรือไม่? ฉันเพิ่งรู้ว่า<input type="number">ใน HTML5 นั้นใช้สำหรับ "หมายเลขจุดลอยตัว" ดังนั้นจึงไม่เหมาะสำหรับหมายเลขบัตรเครดิตรหัสไปรษณีย์ ฯลฯ

ฉันต้องการเลียนแบบการทำงานของแป้นพิมพ์ตัวเลข<input type="number">สำหรับอินพุตที่รับค่าตัวเลขอื่นที่ไม่ใช่ตัวเลขทศนิยม มีบางทีอีกinputประเภทที่เหมาะสมที่ทำเช่นนั้น?


ยังไม่มีคำตอบที่ดีสำหรับรหัสไปรษณีย์ ฉันถามคำถามนี้ซ้ำสำหรับรหัสไปรษณีย์ระหว่างประเทศโดยเฉพาะที่นี่: stackoverflow.com/questions/25425181/ …
Ryan McGeary

ฉันหาวิธีแฮ็คที่จะทำ .. เรียงจาก: stackoverflow.com/a/25599024/1922144
davidcondrey

ตั้งแต่กลางปี ​​2558 มีวิธีที่ดีกว่าในการทำเช่นนี้: stackoverflow.com/a/31619311/806956
Aaron Gray Gray

คำตอบ:


206

<input type="text" pattern="\d*">คุณสามารถทำได้ นี่จะทำให้แป้นพิมพ์ตัวเลขปรากฏขึ้น

ดูรายละเอียดเพิ่มเติมที่นี่: คู่มือการเขียนข้อความเว็บและการแก้ไขสำหรับ iOS

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


23
หากคุณต้องการแป้นพิมพ์ตัวเลข แต่ไม่ต้องการตรวจสอบ (เช่นใน Chrome) คุณสามารถใส่แอตทริบิวต์ novalidate ในแบบฟอร์ม <form ... novalidate>
Brian

4
ฉันพบว่า\d*ใช้งานไม่ได้และ[0-9]เป็นสิ่งจำเป็น type='numeric'ทราบว่านี้จะทำงานร่วมกับ แนะนำให้อ้างอิงตามเอกสารอ้างอิงที่เชื่อมโยงสำหรับรหัสไปรษณีย์
Brett Ryan

11
ใช้ได้ตราบใดที่คุณต้องการค่าตัวเลขเท่านั้น ตัวเลขทศนิยมที่ต้องใช้ '.' (หรือ ',' สำหรับบางภูมิภาค) ไม่สามารถป้อนได้เนื่องจากแป้นพิมพ์เหล่านั้นไม่มีอักขระเหล่านี้
DrHall

2
ถ้าฉันต้องใช้ (จุด) ฉันจะใช้มันได้อย่างไร รูปแบบนี้แสดงเฉพาะ [0-9]

15
<input type = "text" pattern = "\ d *"> ไม่ทำงานบน android ใช่ไหม ฉันทดสอบบน iOS และทำงานได้สำเร็จ แต่ไม่ได้ทำงานกับ Android ฉันจะแก้มันได้อย่างไร
kamal

158

ตั้งแต่กลางปี ​​2558 ฉันเชื่อว่านี่เป็นทางออกที่ดีที่สุด:

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

สิ่งนี้จะให้แป้นตัวเลขใน Android และ iOS:

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้ยังช่วยให้คุณมีพฤติกรรมบนเดสก์ท็อปที่คาดหวังด้วยปุ่มลูกศรขึ้น / ลงและแป้นพิมพ์ขึ้น / ลงแป้นลูกศรขึ้น:

ป้อนคำอธิบายรูปภาพที่นี่

ลองในตัวอย่างโค้ดนี้:

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

โดยการรวมทั้งสองtype="number"และpattern="[0-9]*เราได้รับการแก้ปัญหาที่ใช้งานได้ทุกที่ และรองรับการใช้งานร่วมกับinputmodeแอตทริบิวต์HTML 5.1 ที่เสนอในอนาคต

หมายเหตุ: การใช้รูปแบบจะทริกเกอร์การตรวจสอบรูปแบบดั้งเดิมของเบราว์เซอร์ คุณสามารถปิดใช้งานสิ่งนี้ได้โดยใช้แอnovalidateททริบิวต์หรือคุณสามารถปรับแต่งข้อความแสดงข้อผิดพลาดสำหรับการตรวจสอบความล้มเหลวโดยใช้แอtitleททริบิวต์


หากคุณต้องการป้อนศูนย์นำหน้าเครื่องหมายจุลภาคหรือตัวอักษร - ตัวอย่างเช่นรหัสไปรษณีย์ระหว่างประเทศ - ตรวจสอบตัวแปรย่อยนี้


เครดิตและการอ่านเพิ่มเติม:

http://www.smashingmagazine.com/2015/05/form-inputs-browser-support-issue/ http://danielfriesen.name/blog/2013/09/19/input-type-number-and-ios- ตัวเลขปุ่มกด /


1
type="number" ข้อมูลจำเพาะ HTML5 พูดว่าต้องไม่ระบุแอตทริบิวต์ของเนื้อหาต่อไปนี้และไม่ใช้กับองค์ประกอบ: ... inputmode
Tgr

2
@Tgr Ahh จับได้ดี ดูเหมือนว่าข้อมูลจำเพาะต้องการให้คนใช้<input type="text" inputmode="numeric">และต้องการให้เบราว์เซอร์มือถือมองดูinputmodeว่ามันแสดงแป้นตัวเลขหรือแป้นพิมพ์แบบเต็ม เนื่องจากไม่สนับสนุนเบราว์เซอร์inputmodeฉันไม่แน่ใจว่าจะนำไปใช้กับเดสก์ท็อปกับเบราว์เซอร์มือถือได้อย่างไร เช่นเบราว์เซอร์เดสก์ท็อปจะอนุญาตให้พิมพ์ตัวอักษรได้<input type="text" inputmode="numeric">หรือไม่? ถ้าเป็นเช่นนั้นนั่นเป็นปัญหา <input type="number">ป้องกันสิ่งนี้อนุญาตให้ตัวเลขเท่านั้น บางทีเราจะต้องรอจนกว่าเบราว์เซอร์จะเริ่มใช้งานและจากนั้นเราสามารถอัปเดตคำตอบนี้ได้
แอรอนเกรย์

2
รองรับtype="number"ได้ดีแต่อาจแสดงปินเนอร์ที่ไม่สมเหตุสมผลเช่นหมายเลขบัตรเครดิต
Tgr

2
มี type = "number" เป็นความเจ็บปวดใน ass X (หากอินพุตไม่ถูกต้องคุณจะไม่สามารถรับค่าของอินพุตใน JS คุณจะไม่สามารถรับตำแหน่งเคอร์เซอร์ ฯลฯ
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

ฉันได้พบว่าอย่างน้อยที่สุดสำหรับฟิลด์ "รหัสผ่าน" การทำสิ่งต่าง ๆ เช่น<input type="tel" />การสร้างฟิลด์หมายเลขที่ถูกต้องที่สุดและมันก็มีประโยชน์ในการไม่จัดรูปแบบอัตโนมัติ ตัวอย่างเช่นในแอพพลิเคชั่นมือถือที่ฉันพัฒนาขึ้นสำหรับฮิลตันเมื่อเร็ว ๆ นี้ฉันลงเอยด้วยการทำสิ่งนี้:

แอปพลิเคชั่นเว็บของ iPhone แสดงพร้อมแท็กอินพุตมีประเภทของ TEL ซึ่งผลิตคีย์บอร์ดตัวเลขที่มีคุณค่ามากซึ่งตรงข้ามกับหมายเลขประเภทซึ่งมีการจัดรูปแบบอัตโนมัติและมีการกำหนดค่าอินพุตที่ใช้งานง่ายค่อนข้างน้อย

... และลูกค้าของฉันประทับใจมาก

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


4
ปัญหาสำหรับฉันไม่ใช่การจัดรูปแบบอัตโนมัติ แต่เป็นการตรวจสอบ อินพุตของประเภทnumberบังคับใช้กฎที่เข้มงวดสำหรับหมายเลขในเบราว์เซอร์จำนวนมาก หากผู้ใช้เพิ่มช่องว่าง (หรือเครื่องหมายจุลภาค) เพื่อแยกหลักพันคุณจะไม่ได้รับค่าใด ๆ จากอินพุต ใช่แม้ใน JavaScript input.valueจะว่างเปล่า ประเภทของอินพุตtelไม่ จำกัด เฉพาะรูปแบบเฉพาะดังนั้นผู้ใช้ยังสามารถป้อนข้อมูลใด ๆ และการตรวจสอบเป็นกระบวนการแยกต่างหาก (สำหรับผู้พัฒนาที่จะจัดการ)
Nux

ฉันจะใช้ตัวเลขทศนิยมในแป้นพิมพ์นี้ได้อย่างไร
Anto

11

การใช้type="email"หรือtype="url"จะให้แป้นพิมพ์บนโทรศัพท์บางรุ่นเป็นอย่างน้อยเช่น iPhone type="tel"สำหรับหมายเลขโทรศัพท์ที่คุณสามารถใช้


9

อาจเป็นอันตรายได้หากใช้ปุ่ม<input type="text" pattern="\d*">เพื่อเรียกแป้นตัวเลข บน firefox และ chrome นิพจน์ทั่วไปที่มีอยู่ภายในรูปแบบทำให้เบราว์เซอร์ตรวจสอบอินพุตกับนิพจน์นั้น ข้อผิดพลาดจะเกิดขึ้นหากไม่ตรงกับรูปแบบหรือเว้นว่างไว้ ระวังการกระทำที่ไม่ได้ตั้งใจในเบราว์เซอร์อื่น


6
การเพิ่มnovalidateคุณสมบัติในการบรรจุform elementควรจัดการกับปัญหาการตรวจสอบอัตโนมัติ ให้แน่ใจว่าได้ทำการตรวจสอบด้วยตัวเอง
Justus Romijn


4

ฉันคิดว่าtype="number"ดีที่สุดสำหรับหน้าเว็บแบบความหมาย ถ้าคุณเพียงต้องการที่จะเปลี่ยนแป้นพิมพ์คุณสามารถใช้หรือtype="number" type="tel"ในทั้งสองกรณี iPhone ไม่ได้ จำกัด การป้อนข้อมูลของผู้ใช้ ผู้ใช้ยังสามารถพิมพ์ (หรือวาง) อักขระที่ต้องการได้ การเปลี่ยนแปลงเพียงอย่างเดียวคือแป้นพิมพ์ที่แสดงต่อผู้ใช้ หากคุณต้องการข้อ จำกัด นอกเหนือจากนี้คุณต้องใช้ JavaScript


8
ปัญหาที่ฉันมีคือ type = "number" ควรจะใช้สำหรับเลขทศนิยมเท่านั้นดังนั้นจึงไม่มีบัตรเครดิตรหัสไปรษณีย์หรือตัวเลขอื่น ๆ ที่ จำกัด เฉพาะสตริง ฉันหวังว่าจะมีทั้งความหมายของการเข้ารหัสและการแสดงแป้นพิมพ์ที่ถูกต้อง ฉันคิดว่าเป็นประเภทที่เหมาะสมน่าจะเป็น input type = "text" แต่จากนั้นแป้นพิมพ์ผิดจะปรากฏขึ้น หากคุณสามารถชี้ให้ฉันเห็นจาวาสคริปต์เพื่อทำสิ่งนั้นก็จะช่วยแก้ปัญหาทั้งสองได้
Tami

2
type="number"สำหรับลอย type="text"สำหรับสตริง สิ่งที่คุณต้องการคือจำนวนเต็ม ฉันคิดว่าลอยใกล้กับจำนวนเต็มกว่าสตริง คุณคิดอย่างไร?
Cat Chen

6
สิ่งหนึ่งที่ต้องระวังด้วย type = "number" คืออย่างน้อย Chrome จะบังคับให้อินพุตเป็นตัวเลข - ซึ่งจะแยกหมายเลขบัตรเครดิตที่ป้อนด้วยช่องว่าง (ตัวอย่าง)
John Carter

8
@therefromhere นอกจากนี้ยังจะเปิดซิปรหัสเหมือนจะ01920 1920
ceejayoz

มันจะยังเลอะหากผู้ใช้มีชุดภาษาที่แตกต่างกันในเบราว์เซอร์ของพวกเขาstackoverflow.com/questions/5345095/...
dalore

4

สำหรับฉันทางออกที่ดีที่สุดคือ:

สำหรับตัวเลขจำนวนเต็มซึ่งแสดงค่า 0-9 pad สำหรับ android และ iphone

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

คุณอาจต้องการทำเช่นนี้เพื่อซ่อนสปินเนอร์ใน firefox / chrome / safari ลูกค้าส่วนใหญ่คิดว่าพวกเขาดูน่าเกลียด

 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;
 }

และเพิ่ม novalidate = 'novalidate' ให้กับองค์ประกอบแบบฟอร์มของคุณหากคุณกำลังทำการตรวจสอบความถูกต้องที่กำหนดเอง

ป.ล. ในกรณีที่คุณต้องการตัวเลขจุดลอยตัวจริง ๆ แล้วทำตามความแม่นยำที่คุณต้องการจะเพิ่ม '.' เพื่อ Android

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

1

ในปี 2561:

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

ใช้งานได้ทั้ง Android และ iOS

ฉันทดสอบบน Android (^ 4.2) และ iOS (11.3)


0

คุณสามารถลองสิ่งนี้:

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

แต่ระวัง: ถ้าข้อมูลของคุณมีบางอย่างที่ไม่ใช่ตัวเลขมันจะไม่ถูกส่งไปยังเซิร์ฟเวอร์


0

ฉันไม่พบประเภทที่ทำงานได้ดีที่สุดสำหรับฉันในทุกสถานการณ์: ฉันต้องใช้ค่าเริ่มต้นเป็นรายการตัวเลข (เช่นรายการ "7.5") แต่ในบางครั้งก็อนุญาตข้อความ (เช่น "pass") ผู้ใช้ต้องการแป้นพิมพ์ตัวเลข (เช่นรายการ 7.5) แต่จำเป็นต้องป้อนข้อความเป็นครั้งคราว (ตัวอย่างเช่น "pass")

สิ่งที่ฉันทำก็คือการเพิ่มช่องทำเครื่องหมายลงในแบบฟอร์มและอนุญาตให้ผู้ใช้สลับการป้อนข้อมูลของฉัน (id = "inputSresult") ระหว่าง type = "number" และ type = "text"

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

จากนั้นฉันวางสายตัวจัดการคลิกไปที่ช่องทำเครื่องหมายที่สลับประเภทระหว่างข้อความและหมายเลขตามว่ามีการทำเครื่องหมายในช่องด้านบนหรือไม่:

$(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");

    }
});

มันทำงานได้ดีสำหรับเรา



0

คุณสามารถใช้inputmodeแอตทริบิวต์ html:

<input type="text" inputmode="numeric" />

สำหรับรายละเอียดเพิ่มเติมตรวจสอบออกเอกสาร MDN ใน inputmode


คำตอบนี้นำเสนอโซลูชันเดียวกับที่ @Ralf de Kleine
xKobalt

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.