ทำไมอินพุต html ที่มีประเภท“ number” อนุญาตให้ป้อนตัวอักษร 'e' ในฟิลด์ได้


217

ฉันมีองค์ประกอบอินพุต html5 ต่อไปนี้:

<input type="number">

ทำไมอินพุตนี้อนุญาตให้ป้อนอักขระ 'e' ในฟิลด์อินพุต ไม่สามารถป้อนอักขระตัวอักษรอื่นได้ (ตามที่คาดไว้)

ใช้ chrome v. 44.0.2403.107

หากต้องการดูว่าฉันหมายถึงอะไร: http://www.w3schools.com/html/tryit.asp?filename=tryhtml_input_number


3
นอกจากนี้ยังอนุญาตให้คุณป้อน +, - และ.หลายครั้งในเบราว์เซอร์บางประเภท
nu everest

คำตอบ:


217

เพราะนั่นเป็นสิ่งที่ข้อมูลจำเพาะบอกว่าควรใช้งานได้ดี การป้อนตัวเลขสามารถยอมรับตัวเลขทศนิยมได้รวมถึงสัญลักษณ์เชิงลบและeหรือEอักขระ (โดยเลขชี้กำลังเป็นตัวเลขหลังeหรือE):

หมายเลขเลขทศนิยมประกอบด้วยส่วนต่าง ๆ ดังต่อไปนี้ตามลำดับต่อไปนี้:

  1. ตัวเลือกอักขระแรกอาจเป็น-อักขระ ""
  2. อักขระหนึ่งตัวขึ้นไปในช่วง " 0—9"
  3. เป็นทางเลือกส่วนต่อไปนี้ตามลำดับต่อไปนี้:
    1. เป็น " .ตัวอักษร"
    2. อักขระหนึ่งตัวขึ้นไปในช่วง " 0—9"
  4. เป็นทางเลือกส่วนต่อไปนี้ตามลำดับต่อไปนี้:
    1. เป็น " eตัวอักษร" หรือ " Eตัวอักษร"
    2. เป็นทางเลือก-อักขระ "" หรือ " +"
    3. อักขระหนึ่งตัวขึ้นไปในช่วง " 0—9"

2
อ่าขอบคุณ ฉันกำลังมองหาข้อมูลจำเพาะผิด
Gnarlywhale

4
ฉันยังงงกับสิ่งนี้ก่อนอื่นเลยฉันไม่ใช่นักคณิตศาสตร์ดังนั้น "e" จึงมีความหมายอะไรในบริบทของตัวเลข ที่สองฉันไม่เข้าใจว่าทำไม input.value เป็นสตริงว่างเปล่าทันทีที่คุณเขียน "e" ไว้ในนั้นถึงแม้ว่าจะมีตัวเลขและตัวอักษรที่ได้รับอนุญาต ...
Simon

9
@Simon การใช้ตัวเลือกeนี้มีประโยชน์สำหรับการรวมตัวเป็นจำนวนมากซึ่งอาจไม่น่าไว้วางใจในการพิมพ์ออกมา เป็นตัวอย่างเล็กน้อย2e2 = 2*10^2 = 200
Gnarlywhale

3
@Simon "ทันทีที่ฉันเขียน e"ใช่ "4e" ไม่ใช่ตัวเลขในขณะที่ตัวอย่างเช่น "4e + 0" เป็นตัวเลขที่ถูกต้อง (4) หากคุณมีรหัสจาวาสคริปต์ฝั่งไคลเอ็นต์ "สด" บางส่วนที่ทำงานกับการป้อนข้อมูลผู้ใช้บางส่วนคุณต้องให้เวลาผู้ใช้ในการแก้ไขการป้อนข้อมูลของเขาให้เสร็จสิ้นเพื่อให้คุณค่าเต็มและไม่รบกวนการแก้ไขครึ่งทาง หากคุณมี "ไม่ได้กำหนด" จากอินพุต "4e + 0" ให้แก้ไขตัวแยกวิเคราะห์ "เป็นหมายเลข" ตัวอย่างจากคำถามใช้งานได้ดีรายงาน "4e + 1" เป็นข้อผิดพลาดและ "4e + 0" ถูกส่งคืนอย่างถูกต้องเป็น "4e + 0" (เช่นหมายเลขระหว่าง 1 ถึง 5)
Ped7g

4
@ แอนโทนี่ไม่ใช่eย่อมาจากเลขชี้กำลัง
Scott Marcus

62

เราสามารถทำให้มันเรียบง่ายเหมือนด้านล่าง

<input type="number"  onkeydown="javascript: return event.keyCode == 69 ? false : true" />

อัปเดตคำตอบ

เราสามารถทำให้มันง่ายยิ่งขึ้นตามที่ @ 88 MPG แนะนำ

<input type="number" onkeydown="return event.keyCode !== 69" />


17
ดีกว่าที่จะใช้return event.keyCode !== 69เนื่องจากหลีกเลี่ยงผู้ประกอบการที่ไม่จำเป็น ยังไม่แนะนำให้ใช้อินไลน์
Adam Fratino

5
สิ่งนี้ไม่ได้ป้องกันการคัดลอกeหรือวางEในฟิลด์
molamk

18

ประเภทอินพุต HTML อนุญาตให้ "e / E" เพราะ "e" หมายถึงเลขชี้กำลังซึ่งเป็นสัญลักษณ์ที่เป็นตัวเลข

ตัวอย่าง 200,000 สามารถเขียนเป็น 2e5 ฉันหวังว่านี่จะช่วยขอบคุณสำหรับคำถามนี้          


15

วิธีที่ดีที่สุดในการบังคับใช้ตัวเลขที่ประกอบด้วยตัวเลขเท่านั้น:

<input type="number" onkeydown="javascript: return event.keyCode === 8 ||
event.keyCode === 46 ? true : !isNaN(Number(event.key))" />

สิ่งนี้จะหลีกเลี่ยง 'e', ​​'-', '+', '.' ... ตัวละครทั้งหมดที่ไม่ใช่ตัวเลข!

วิธีอนุญาตให้ใช้ปุ่มตัวเลขเท่านั้น:

isNaN (จำนวน (event.key))

แต่ยอมรับ "Backspace" (keyCode: 8) และ "Delete" (keyCode: 46) ...


11
<input type="number" onkeydown="return FilterInput(event)" onpaste="handlePaste(event)"  >

function FilterInput(event) {
    var keyCode = ('which' in event) ? event.which : event.keyCode;

    isNotWanted = (keyCode == 69 || keyCode == 101);
    return !isNotWanted;
};
function handlePaste (e) {
    var clipboardData, pastedData;

    // Get pasted data via clipboard API
    clipboardData = e.clipboardData || window.clipboardData;
    pastedData = clipboardData.getData('Text').toUpperCase();

    if(pastedData.indexOf('E')>-1) {
        //alert('found an E');
        e.stopPropagation();
        e.preventDefault();
    }
};

2
คุณมั่นใจแค่ไหนที่จะป้องกันการแทรกตัวอักษร 'E' ด้วยฟังก์ชันการคัดลอกและวาง
StephenKelzer

1
เพิ่งตรวจสอบว่าคุณถูกต้องมันไม่ทำงานสำหรับการคัดลอกและวางข้อมูล
Gnarlywhale

คุณถูกต้อง @StephenKelzer ฉันเพิ่มโค้ดเพื่อจัดการมัน
TruthSeeker

4

หากต้องการซ่อนทั้งตัวอักษรeและเครื่องหมายลบ-ให้ไปที่:

onkeydown="return event.keyCode !== 69 && event.keyCode !== 189"

3

การใช้เชิงมุมคุณสามารถทำได้เพื่อ จำกัด การป้อน e, +, -, E

 <input type="number"  (keypress)="numericOnly($event)"/>


  numericOnly(event): boolean { // restrict e,+,-,E characters in  input type number
    debugger
    const charCode = (event.which) ? event.which : event.keyCode;
    if (charCode == 101 || charCode == 69 || charCode == 45 || charCode == 43) {
      return false;
    }
    return true;

  }

2
สิ่งนี้จะ จำกัด ผู้ใช้ให้ป้อนอักขระนั้นหรือไม่?
เอมี่

1
ขอบคุณสำหรับความช่วยเหลือที่ฉันกำลังมองหาวิธีการแก้ปัญหาเดียวกันในเชิงมุม แต่ตอนนี้ฉันมีความคิดว่าจะทำอย่างไรฉันจะสร้างคำสั่งและดำเนินการงานขอบคุณสำหรับการโพสต์ของคุณ
Amy

คุณสามารถสร้างคำสั่งที่เป็นแนวปฏิบัติที่ดีที่สุด เช่นกันคุณยังสามารถทำโดยตรงในไฟล์. ts ของส่วนประกอบของคุณ!
rinku Choudhary

0

เชิงมุม; ด้วยคำสั่ง IDE keyCode ที่เลิกใช้แล้ว

ทำหน้าที่เหมือนกับคำตอบของ rinku แต่มีการป้องกันการเตือน IDE

numericOnly(event): boolean {
    // noinspection JSDeprecatedSymbols
    const charCode = (event.which) ? event.which : event.key || event.keyCode;  // keyCode is deprecated but needed for some browsers
    return !(charCode === 101 || charCode === 69 || charCode === 45 || charCode === 43);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.