วิธีทำให้ type =“ number” เป็นจำนวนบวกเท่านั้น


284

ปัจจุบันฉันมีรหัสต่อไปนี้

<input type="number" />

มันออกมาเป็นแบบนี้

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

สิ่งเล็ก ๆ ที่อยู่ทางด้านขวามือของตัวเลือกอนุญาตให้ตัวเลขไปสู่ลบ ฉันจะป้องกันได้อย่างไร

ฉันมีข้อสงสัยเกี่ยวกับการใช้type="number"มันทำให้เกิดปัญหามากกว่าที่จะแก้ฉันจะตรวจสอบสติอย่างไรก็ตามฉันควรกลับไปใช้type="text"หรือไม่


4
คุณจะต้องตรวจสอบความถูกต้องของค่าบนเซิร์ฟเวอร์ ทุกคนสามารถแทนที่ฟิลด์เพื่อส่งเนื้อหาใดก็ได้ที่พวกเขาต้องการ
zzzzBov

2
@zzzzBov ใช่ฉันตรวจสอบมันด้วย php และใช้คำสั่งเตรียมสิ่งเดียวที่เหลือให้กังวลคือผู้ใช้ที่ข้าวบาร์เลย์รู้วิธีใช้เว็บเบราว์เซอร์ lol
Arian Faurtosh

1
มีความเป็นไปได้ที่ซ้ำกันของวิธีการป้องกัน type input = "number" รับค่าลบหรือไม่?
Vega

คำตอบ:


635

เพิ่มแอตทริบิวต์min

<input type="number" min="0">


36
วิธีนี้ใช้ได้ผลกับลูกศรตัวเลือก แต่อนุญาตให้พิมพ์หมายเลขติดลบได้
David Burton

2
การเปลี่ยนแอตทริบิวต์เป็นmin="0.000001"จะช่วยในกรณีส่วนใหญ่ ทศนิยมมากกว่า 6 ตำแหน่ง JavaScript จะแปลงเป็นรูปแบบเลขชี้กำลัง
MarkMYoung

ตามค่าเริ่มต้นจะอนุญาตเฉพาะจำนวนเต็ม แต่ไม่ใช่ทศนิยม ดูการปล่อยให้ค่าทศนิยม
str

118

ฉันพบวิธีแก้ไขปัญหาอื่นเพื่อป้องกันจำนวนลบ

<input type="number" name="test_name" min="0" oninput="validity.valid||(value='');">

คุณไม่สามารถเพิ่มตัวเลขลอยได้ด้วยสิ่งนี้ นอกจากนี้ stepper เชิงตัวเลขก็ไม่ทำงานเช่นกัน
hamzox

1
oninput="validity.valid||(value='');"หยุดหนึ่งจากการพิมพ์ตัวเลข
สวัสดีจักรวาล

5
ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องเนื่องจากป้องกันการพิมพ์อักขระ "-"
JanBrus

วิธีนี้ใช้งานได้ดีถ้าคุณต้องการจำนวนเต็มจำนวนเต็มทั้งบวกอย่างที่ฉันทำ ขอบคุณ!
Boris

74

ขึ้นอยู่กับว่าคุณต้องการเป็นอย่างไร คุณต้องการรับเฉพาะจำนวนเต็มมากกว่า:

<input type="number" min="1" step="1">

หากคุณต้องการให้มีทศนิยมสองหลักหลังจุดทศนิยม

<input type="number" min="0.01" step="0.01">


ดูเหมือนว่าขณะนี้มันใช้งานได้โดยไม่มีขั้นตอน = "1" ... ฉันควรจะเพิ่มหรือไม่
Arian Faurtosh

@Arian คุณสามารถละเว้นได้ตราบใดที่คุณไม่ได้ระบุmaxค่า
Pavlo

1
ขั้นตอนที่ 1 เป็นค่าเริ่มต้นของเบราว์เซอร์คุณทำได้ดี
Stephan Muller

4
สิ่งนี้ไม่ได้ป้องกันการพิมพ์ในค่าที่ไม่ดี - หากคุณไม่ใช้โครเมี่ยมค่าขั้นตอนจะลดการตรวจสอบความถูกต้องเมื่อพิมพ์ดังนั้นคุณจึงสามารถป้อนค่าที่ไม่ใช่ตัวเลขได้ ด้วยขั้นตอนการตั้งค่าจะช่วยให้คุณพิมพ์ค่านอกช่วง min-max - ยังคงผิด แต่ดีกว่า
David Burton

min = "1" step = "1" ยังให้ฉันพิมพ์ตัวเลขทศนิยมเช่น 1.2 ฉันจะบังคับจำนวนเต็มเท่านั้นได้อย่างไร
Sam

50

คุณสามารถบังคับให้อินพุตมีจำนวนเต็มบวกเท่านั้นโดยเพิ่มonkeypressภายในinputแท็ก

<input type="number" onkeypress="return event.charCode >= 48" min="1" >

ที่นี่event.charCode >= 48ให้ความมั่นใจว่าจะส่งคืนเฉพาะตัวเลขที่มากกว่าหรือเท่ากับ 0 เท่านั้นในขณะที่minแท็กรับประกันว่าคุณจะได้รับอย่างน้อย 1 โดยการเลื่อนภายในแถบป้อนข้อมูล


3
บน Edge คุณสามารถป้อน "A" ในส่วนนี้
Amy Blankenship

10
คุณยังสามารถวางจำนวนลบได้
methyl

5

คุณสามารถใช้สิ่งต่อไปนี้เพื่อให้type="number"ยอมรับตัวเลขที่เป็นบวกเท่านั้น:

input type="number" step="1" pattern="\d+"

2
คุณลองอธิบายสิ่งที่คุณทำและทำไมมันถึงช่วยได้? นอกจากนี้คุณยังมีตัวอย่างสองแบบที่แตกต่างกัน อันไหนที่ถูก?
Aenadon

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


3

ลอง

<input type="number" pattern="^[0-9]" title='Only Number' min="1" step="1">


เมื่อคุณกำหนดประเภทที่คุณต้องการรูปแบบเฉพาะสำหรับบทบาท
Rogerio de Moraes

7
ลองใช้โครเมี่ยมและมันก็ไม่ได้บังคับรูปแบบ
เดวิดเบอร์ตัน

มีวิธีการหรือไม่ถ้าฉันเพิ่ม type = "text" แทน "number"?
Kapil Verma

1

หากต้องการป้อนข้อความลวดลายก็ใช้ได้เช่นกัน

<input type="text" pattern="\d+">

1

ฉันไม่สามารถหาโซลูชันที่สมบูรณ์แบบได้เพราะมีบางงานสำหรับการป้อนข้อมูล แต่ไม่ใช่สำหรับการคัดลอกและวาง วิธีนี้ใช้ได้ผลสำหรับฉัน มันป้องกันจากจำนวนลบ, พิมพ์ "e", คัดลอกและวาง "e" ข้อความ

สร้างฟังก์ชั่น

<script language="JavaScript">

  // this prevents from typing non-number text, including "e".
  function isNumber(evt) {
    evt = (evt) ? evt : window.event;
    let charCode = (evt.which) ? evt.which : evt.keyCode;
    if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
      evt.preventDefault();
    } else {
      return true;
    }
  }
</script>

เพิ่มคุณสมบัติเหล่านี้เพื่อป้อนข้อมูล ทั้งสองนี้ป้องกันจากการคัดลอกและวางข้อความที่ไม่ใช่ตัวเลขรวมถึง "e" คุณต้องมีทั้งสองอย่างร่วมกันจึงจะมีผล

<input type="number" oninput="validity.valid||(value='');" onpress="isNumber(event)" />

หากคุณกำลังใช้ Vue คุณสามารถดูคำตอบได้ที่นี่ ฉันได้แยกมันไปเป็นมิกซ์อินซึ่งสามารถนำกลับมาใช้ใหม่ได้


0

เพิ่มรหัสนี้ในประเภทอินพุตของคุณ

onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57"

ตัวอย่างเช่น:

<input type="text" name="age" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />

1
นี่คือความสับสนสำหรับผู้ที่ไม่เข้าใจว่าเกิดอะไรขึ้น
RozzA

ด้วยวิธีนี้คุณยังสามารถวางสิ่งใดก็ได้บนอินพุตตัวอักษรหรืออักขระพิเศษ
Lê Gia Lễ

0

โซลูชันอื่น ๆ คือการใช้ Js เพื่อทำให้เป็นบวก (ตัวเลือกขั้นต่ำสามารถปิดการใช้งานและไม่ถูกต้องเมื่อผู้ใช้ประเภท smth) ลบหากไม่จำเป็นและเหตุการณ์ ('keydown') ยังสามารถใช้!

let $numberInput =  $('#whatEverId');
$numberInput.on('change', function(){
    let numberInputText = $numberInput.val();
    if(numberInputText.includes('-')){
        $numberInput.val(Math.abs($numberInput.val()));
    }
});

0

ขึ้นอยู่กับว่าคุณต้องการฟิลด์ int หรือ float นี่คือสิ่งที่ทั้งสองจะมีลักษณะ:

<input type="number" name="int-field" id="int-field" placeholder="positive int" min="1" step="1">
<input type="number" name="float-field" id="float-field" placeholder="positive float" min="0">

ฟิลด์ int มีการตรวจสอบความถูกต้องที่แนบมากับมันตั้งแต่ขั้นต่ำของมันคือ 1 สนามลอยรับ 0; เพื่อจัดการกับสิ่งนี้คุณสามารถเพิ่มตัวตรวจสอบข้อ จำกัดอีกหนึ่งตัว:

function checkIsPositive(e) {
  const value = parseFloat(e.target.value);
  if (e.target.value === "" || value > 0) {
    e.target.setCustomValidity("");
  } else {
    e.target.setCustomValidity("Please select a value that is greater than 0.");
  }
}

document.getElementById("float-field").addEventListener("input", checkIsPositive, false);

JSFiddle ที่นี่

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

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


0

ลองสิ่งนี้:

  • ทดสอบในเชิงมุม 8
  • ค่าเป็นบวก
  • รหัสนี้ยัง handels nullและnegitiveค่า
              <input
                type="number"
                min="0"
                (input)="funcCall()" -- Optional
                oninput="value == '' ? value = 0 : value < 0 ? value = value * -1 : false"
                formControlName="RateQty"
                [(value)]="some.variable" -- Optional
              />

0

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

<input type="number" 
    onkeyup="if(this.value<0)this.value=1"
    onblur="if(this.value<0)this.value=1"
>



-2

ด้วยการป้อนข้อความประเภทคุณสามารถใช้สิ่งนี้เพื่อการตรวจสอบที่ดีขึ้น

return (event.keyCode? (event.keyCode == 69 ? false : event.keyCode >= 48 && event.keyCode <= 57) : (event.charCode >= 48 && event.charCode <= 57))? true : event.preventDefault();

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