ฉันจะ จำกัด อินพุตที่เป็นไปได้ในองค์ประกอบ“ หมายเลข” HTML5 ได้อย่างไร


359

สำหรับ<input type="number">องค์ประกอบmaxlengthไม่ทำงาน ฉันจะ จำกัดmaxlengthองค์ประกอบจำนวนนั้นได้อย่างไร


5
สำหรับผู้ที่กำลังมองหาทางออกที่ดีกว่าอันนี้ดีที่สุด: stackoverflow.com/questions/9361193/…
Ünsal Korkmaz

4
แอตทริบิวต์สูงสุดไม่ทำงานในเบราว์เซอร์ chrome ในแท็บเล็ต Android
Foreever

4
@ ÜnsalKorkmaz: ว่าการแก้ปัญหามีข้อเสียว่ามันไม่ได้นำมาขึ้นแป้นพิมพ์ตัวเลขบนอุปกรณ์ Android
Will

คำตอบ:


340

และคุณสามารถเพิ่มแอmaxททริบิวที่จะระบุจำนวนสูงสุดที่คุณสามารถแทรกได้

<input type="number" max="999" />

หากคุณเพิ่มทั้ง a maxและminค่าคุณสามารถระบุช่วงของค่าที่อนุญาต:

<input type="number" min="1" max="999" />

ด้านบนจะยังคงไม่หยุดให้ผู้ใช้ป้อนค่านอกช่วงที่กำหนดด้วยตนเอง แต่เขาจะแสดงป๊อปอัพบอกให้เขาป้อนค่าภายในช่วงนี้เมื่อส่งแบบฟอร์มตามที่แสดงในภาพหน้าจอนี้:

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


4
Krister สิ่งนี้ใช้ได้ผล เช่นเดียวกับ @Andy กล่าวว่าฉันได้ใช้ oninput เพื่อลดจำนวนเพิ่มเติม อ้างอิงmathiasbynens.be/notes/oninput
Prasad

7
@Prasad - ถ้าคำตอบของ Andy ถูกต้องให้เลือกแทนที่จะโหวตมากที่สุด
Moshe

81
สิ่งนี้ถูกต้อง แต่ควรสังเกตว่า Andy ระบุว่าสิ่งนี้ไม่ได้ จำกัด อย่างใดอย่างหนึ่งไม่ให้พิมพ์หมายเลขที่ยาวขึ้น ดังนั้นมันจึงไม่เท่ากับความยาวสูงสุดในฟิลด์ข้อความ
ดา

9
หากคุณป้อนโฟลตที่มีความแม่นยำสูงกว่านี้ก็จะแตก เช่น 3.1415926 รับรอบนี้เพราะน้อยกว่า 999 และมากกว่า 1
0112

44
ฉันไม่รู้ว่าทำไมมันถึงได้รับการโหวตและยอมรับเมื่อมันไม่ทำงาน! มันมีผลกับการควบคุม "สปินเนอร์" เท่านั้นและไม่ทำอะไรเลยที่จะหยุดให้ผู้ใช้พิมพ์ตัวเลขยาว ๆ
Codemonkey

115

คุณสามารถระบุminและmaxแอตทริบิวต์ซึ่งจะอนุญาตให้ป้อนข้อมูลภายในช่วงที่ระบุเท่านั้น

<!-- equivalent to maxlength=4 -->
<input type="number" min="-9999" max="9999">

อย่างไรก็ตามวิธีนี้ใช้ได้กับปุ่มควบคุมสปินเนอร์เท่านั้น แม้ว่าผู้ใช้อาจพิมพ์ตัวเลขได้มากกว่าที่อนุญาตmaxแต่จะไม่ส่งแบบฟอร์ม

ข้อความตรวจสอบของ Chrome สำหรับตัวเลขที่มากกว่าจำนวนสูงสุด
ภาพหน้าจอที่นำมาจาก Chrome 15

คุณสามารถใช้oninputเหตุการณ์HTML5 ใน JavaScript เพื่อ จำกัด จำนวนอักขระ:

myInput.oninput = function () {
    if (this.value.length > 4) {
        this.value = this.value.slice(0,4); 
    }
}

11
ปัญหาที่เป็นไปได้หนึ่งข้อด้วยแนวทาง JavaScript นั้น: อาจไม่ทำงานอย่างที่คาดไว้หากจุดแทรกไม่อยู่ที่ท้ายค่า ตัวอย่างเช่นหากคุณป้อนค่า "1234" ในช่องป้อนข้อมูลให้ย้ายจุดแทรกกลับไปที่จุดเริ่มต้นของค่าและพิมพ์ "5" คุณจะจบลงด้วยค่า "5123" สิ่งนี้แตกต่างจากฟิลด์อินพุต type = "text" ที่มีความยาวสูงสุด 4 ซึ่งเบราว์เซอร์จะไม่อนุญาตให้คุณพิมพ์อักขระตัวที่ 5 ลงในฟิลด์ "full" และค่าจะยังคงเป็น "1234"
Jon Schneider

@Andy เห็นได้ชัดว่าคำถามกำลังมองหาวิธีที่ไม่ใช่ JS ที่ต้องทำmaxlength.............
Pacerier

4
@Pacerier: ทำอะไรในคำตอบของฉันหมายความว่าฉันคิดอย่างอื่นหรือไม่ อย่างที่คุณเห็นฉันเสนอวิธีแก้ปัญหาที่ใกล้เคียงที่สุดที่สามารถทำได้โดยใช้ HTML เท่านั้นพร้อมกับข้อเสนอแนะเพิ่มเติมที่ใช้ JavaScript ซึ่ง OP อาจต้องการป้องกันผู้ใช้ที่พิมพ์อักขระมากกว่าที่อนุญาต
Andy E

84

หากคุณกำลังมองหาโซลูชันเว็บสำหรับมือถือที่คุณต้องการให้ผู้ใช้ของคุณเห็นแป้นตัวเลขแทนที่จะเป็นคีย์บอร์ดข้อความแบบเต็ม ใช้ type = "tel" มันจะทำงานร่วมกับ maxlength ซึ่งช่วยให้คุณไม่สร้างจาวาสคริปต์พิเศษ

สูงสุดและต่ำสุดจะยังอนุญาตให้ผู้ใช้พิมพ์ตัวเลขเกินจำนวนสูงสุดและต่ำสุดซึ่งไม่เหมาะสม


3
เยี่ยมมากมันใช้งานได้อย่างมีเสน่ห์ยกนิ้วให้โดยไม่ต้องสร้างจาวาสคริปต์เพิ่มเติม
Diego

9
ฉันพบว่านี่ไม่ใช่ทางออกที่ดีที่สุดสำหรับการป้อนตัวเลขเนื่องจากอินพุต "tel" อนุญาตให้ใช้สัญลักษณ์เพิ่มเติมและแสดงตัวอักษรที่อยู่ด้านข้างแต่ละหมายเลข แป้นพิมพ์ตัวเลขล้วนดูดีกว่ามาก
hawkharris

@hawkharris คุณถูกต้องพิมพ์ = "number" เป็น UI ที่สะอาดกว่า เป็นการง่ายกว่าที่จะพิมพ์ในอักขระที่ไม่ดีโดยไม่ตั้งใจ ดังนั้นจึงต้องมีการตรวจสอบเพิ่มเติมเพื่อให้แน่ใจว่าผู้ใช้จะไม่ป้อนข้อมูลที่ไม่ถูกต้อง แต่ให้พิจารณาด้วยว่าผู้ใช้สามารถป้อนจุดทศนิยมทั้งหมดได้อย่างง่ายดายด้วยแป้นตัวเลข นอกจากนี้ยังไม่ได้แก้คำถามข้างต้นหากไม่มี JavaScript เพิ่มเติม
ดวน

1
ขอบคุณฉันกำลังทำงานกับแอพมือถืออิออนกรอบและนี้แก้ไขปัญหาของฉัน
อาเหม็ด

1
หากใช้กับ pattern = "[0-9] *" สัญลักษณ์พิเศษจะถูกปิดใช้งาน
apereira

71

คุณสามารถรวมสิ่งเหล่านี้ทั้งหมด:

<input name="myinput_drs"
oninput="maxLengthCheck(this)"
type = "number"
maxlength = "3"
min = "1"
max = "999" />

<script>
  // This is an old version, for a more recent version look at
  // https://jsfiddle.net/DRSDavidSoft/zb4ft1qq/2/
  function maxLengthCheck(object)
  {
    if (object.value.length > object.maxLength)
      object.value = object.value.slice(0, object.maxLength)
  }
</script>


ปรับปรุง:
นอกจากนี้คุณยังอาจต้องการที่จะป้องกันไม่ให้ตัวละครที่ไม่ใช่ตัวเลขใด ๆ ที่จะเข้ามาเพราะจะเป็นสตริงที่ว่างเปล่าสำหรับปัจจัยการผลิตจำนวนและดังนั้นจึงมีความยาวของมันจะเป็นobject.length 0ดังนั้นmaxLengthCheckฟังก์ชั่นจะไม่ทำงาน

วิธีแก้ไข:
ดูตัวอย่างนี้หรือสิ่งนี้

การสาธิต - ดูรหัสแบบเต็มได้ที่นี่:
http://jsfiddle.net/DRSDavidSoft/zb4ft1qq/1/

อัปเดต 2:นี่คือรหัสอัปเดต: https://jsfiddle.net/DRSDavidSoft/zb4ft1qq/2/

อัปเดต 3: โปรดทราบว่าการอนุญาตให้ป้อนทศนิยมมากกว่าหนึ่งจุดสามารถทำให้ยุ่งเหยิงด้วยค่าตัวเลข


นี่เป็นวิธีแก้ปัญหาที่ดี แต่ฉันพบว่า object.value.length ส่งคืนค่า 0 หากมีการป้อนค่าที่ไม่ใช่ตัวเลข
แอนดรู

1
@AndrewSpear นั่นเป็นเพราะ object.value จะเป็นสตริงว่างเปล่าหากคุณป้อนค่าที่ไม่ใช่ตัวเลขในอินพุตที่มีชุด 'number' เป็นชุด ดูเอกสารประกอบ นอกจากนี้โปรดอ่านการอัปเดตของฉันเพื่อแก้ไขปัญหานี้
David Refoua

สิ่งนี้จะยังคงแตกถ้าคุณป้อนจุดทศนิยมมากกว่าหนึ่งเช่น 111..1111 อย่าใช้รหัสนี้เพื่อความปลอดภัยเนื่องจากรหัสที่เป็นอันตรายอาจยังคงถูกส่งผ่าน
PieBie

@PieBie Dude รหัสนี้มีไว้สำหรับ 3+ ปีที่ผ่านมา ใช้ jQuery แทน
David Refoua

1
ใช่ฉันรู้ว่า แต่ผู้เริ่มต้นอาจยังคงเพียงแค่คัดลอกวาง
PieBie

26

มันง่ายมากด้วยจาวาสคริปต์ที่คุณสามารถจำลองmaxlengthลองดู:

//maxlength="2"
<input type="number" onKeyDown="if(this.value.length==2) return false;" />

12
ด้วยโซลูชันของคุณคุณจะไม่สามารถใช้ Backspace ได้เมื่อคุณมีอักขระครบ 2 ตัว แต่ฉันคิดถึงบางสิ่งสำหรับวิธีแก้ปัญหาการใช้งาน
Christophe Debove

12
แทน onKeyDown คุณควรใช้ onKeyPress
Rupesh Arora

1
จะไม่ทำงานถ้าคุณเน้นข้อความและกดตัวอักษร (เช่นเพื่อแทนที่เนื้อหาของการป้อนข้อมูล)
Arijoon

ตรวจสอบความถูกต้องนี้หากนี่ไม่ได้มาจากปุ่มดังต่อไปนี้stackoverflow.com/a/2353562/1534925
Akshay

3
ปัญหาkeydownคือคุณไม่สามารถใช้ backspace ได้สูงสุดอักขระ ปัญหาkeypressคือคุณสามารถคัดลอก + วางเกินจำนวนอักขระสูงสุด
Stavm

23

หรือหากค่าสูงสุดของคุณเป็นเช่น 99 และต่ำสุด 0 คุณสามารถเพิ่มสิ่งนี้ในองค์ประกอบอินพุต (ค่าของคุณจะถูกเขียนใหม่โดยค่าสูงสุดของคุณ ฯลฯ )

<input type="number" min="0" max="99" 
   onKeyUp="if(this.value>99){this.value='99';}else if(this.value<0){this.value='0';}"
id="yourid">

จากนั้น (ถ้าคุณต้องการ) คุณสามารถตรวจสอบว่าเป็นหมายเลขที่ป้อนจริงหรือไม่


... เยี่ยมมาก แต่คุณไม่ต้องการเพื่อนขั้นต่ำและสูงสุดอีกต่อไป (แค่บอกว่า)
xoxel

2
@xoxel คุณต้องทำถ้าคุณต้องการให้ข้อความเตือนยังคงแสดงอยู่
DNKROZ

มันดีจริงๆ ... ขอบคุณ
Vincy Oommen

เพื่อประโยชน์ในการวางแนวฉันควรทำonKeyUp="if(this.value>this.max)this.value=this.max;if(this.value<this.min)this.value=this.min;"
oriadam

18

คุณสามารถระบุเป็นข้อความได้ แต่เพิ่ม pettern ที่ตรงกับหมายเลขเท่านั้น:

<input type="text" pattern="\d*" maxlength="2">

มันทำงานได้อย่างสมบูรณ์แบบและบนมือถือ (ทดสอบบน iOS 8 และ Android) จะปรากฏขึ้นแป้นพิมพ์ตัวเลข


แอตทริบิวต์ pattern ไม่ได้รับการสนับสนุนใน IE9 และรุ่นก่อนหน้าและมีการสนับสนุนบางส่วนใน Safari: caniuse.com/#feat=input-pattern
diazdeteran

ใช่ขอบคุณสำหรับการชี้ แต่เราลดการสนับสนุน IE9 (ตัดมัสตาร์ดจากมัน) และฉันชอบมากกว่าวิธีการ JS ขึ้นอยู่กับโครงการ
Chris Panayotoff

2
ผู้ใช้จะไม่ถูกป้องกันจากการป้อนอักขระที่ไม่ใช่ตัวเลขด้วยสิ่งนี้ พวกเขาสามารถป้อน 2 ตัวอักษรใด ๆ patternทำให้เกิดการเน้นการตรวจสอบ
brt

ทดสอบบน Android 9 (Nokia 8) แต่ฉันได้รับแป้นพิมพ์ปกติ :( ความคิดใด ๆ ?
oriadam

14

//For Angular I have attached following snippet.
<div ng-app="">
  <form>
    Enter number: <input type="number" ng-model="number" onKeyPress="if(this.value.length==7) return false;" min="0">
  </form>
  <h1>You entered: {{number}}</h1>
</div>

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


1
ปัญหาที่ฉันเห็นที่นี่คือ: 1. แทนที่ด้วยเลือกข้อความและประเภทไม่ทำงานหากการป้อนข้อมูลได้ถึง 7 ตัวเลข 2. การเพิ่มการป้อนข้อมูลโดย 1 เมื่อฮิตเกิน "boarder" ฮิตทำงาน -> 9999999 และคลิกขึ้น ปุ่ม. ทำลายข้อ จำกัด
Edub

ฉันลองใช้จาวาสคริปต์ที่เรียบง่าย หากคุณต้องการคุณสามารถดูได้โดยใช้รหัสเรียกใช้ เช่นนี้ฉันไม่พบข้อ จำกัด ใด ๆ
Prasad Shinde

1
ไม่พบข้อ จำกัด ใด ๆ มันหยุดที่ 7 หลัก ฉันใช้โซลูชันนี้สำหรับรหัสของฉัน
Claudio

มีข้อ จำกัด คือ เมื่อคุณถึงขีด จำกัด ให้เลือกทั้งหมดและต้องการแทนที่มันไม่ทำงาน การแทนที่ใช้ได้ผลก็ต่อเมื่อฉันเขียนทับค่าด้วย cur หนึ่งก่อนที่ฉันจะคืนค่าเท็จ
Insomnia88

@ Insomnia88, @ edub จะทำอย่างไรถ้าเราเขียนฟังก์ชั่นและตรวจสอบเงื่อนไขที่จำเป็น ...
Prasad Shinde

12

อีกทางเลือกหนึ่งคือเพียงเพิ่มฟังสำหรับสิ่งที่มี maxlength คุณลักษณะและเพิ่มค่าชิ้นไปที่ สมมติว่าผู้ใช้ไม่ต้องการใช้ฟังก์ชันภายในทุกเหตุการณ์ที่เกี่ยวข้องกับอินพุต นี่คือข้อมูลโค้ด ไม่ต้องสนใจโค้ด CSS และ HTML, จาวาสคริปต์เป็นสิ่งสำคัญ

// Reusable Function to Enforce MaxLength
function enforce_maxlength(event) {
  var t = event.target;
  if (t.hasAttribute('maxlength')) {
    t.value = t.value.slice(0, t.getAttribute('maxlength'));
  }
}

// Global Listener for anything with an maxlength attribute.
// I put the listener on the body, put it on whatever.
document.body.addEventListener('input', enforce_maxlength);
label { margin: 10px; font-size: 16px; display: block }
input { margin: 0 10px 10px; padding: 5px; font-size: 24px; width: 100px }
span { margin: 0 10px 10px; display: block; font-size: 12px; color: #666 }
<label for="test_input">Text Input</label>
<input id="test_input" type="text" maxlength="5"/>
<span>set to 5 maxlength</span>

<br>

<label for="test_input">Number Input</label>
<input id="test_input" type="number" min="0" max="99" maxlength="2"/>
<span>set to 2 maxlength, min 0 and max 99</span>


10

ความยาวสูงสุดจะไม่ทำงานด้วย<input type="number"วิธีที่ดีที่สุดที่ฉันรู้คือการใช้oninputเหตุการณ์เพื่อ จำกัด ความยาวสูงสุด โปรดดูรหัสด้านล่างสำหรับการใช้งานที่ง่าย

<input name="somename"
    oninput="javascript: if (this.value.length > this.maxLength) this.value = this.value.slice(0, this.maxLength);"
    type = "number"
    maxlength = "6"
 />

ทำงานเหมือนจับใจ!
SiboVG

9

ให้บอกว่าคุณต้องการค่าสูงสุดที่อนุญาตให้เป็น 1,000 ไม่ว่าจะพิมพ์หรือหมุนด้วย

คุณ จำกัด ค่าสปินเนอร์โดยใช้: type="number" min="0" max="1000"

และ จำกัด สิ่งที่แป้นพิมพ์พิมพ์ด้วยจาวาสคริปต์: onkeyup="if(parseInt(this.value)>1000){ this.value =1000; return false; }"

<input type="number" min="0" max="1000" onkeyup="if(parseInt(this.value)>1000){ this.value =1000; return false; }">

8

ตามที่ผู้อื่นระบุไว้ min / max จะไม่เหมือนกับ maxlength เนื่องจากผู้คนยังสามารถป้อนข้อมูลลอยได้ซึ่งจะมีขนาดใหญ่กว่าความยาวสตริงสูงสุดที่คุณต้องการ ในการเลียนแบบแอ็ตทริบิวต์ maxlength อย่างแท้จริงคุณสามารถทำสิ่งนี้ในการบีบ (นี้เทียบเท่ากับ maxlength = "16"):

<input type="number" oninput="if(value.length>16)value=value.slice(0,16)">

ชิ้นจะลบตัวอักษรโดยไม่ต้องมีความรู้ของผู้ใช้เมื่อแทรกในระหว่าง ในขณะที่ความยาวสูงสุดจะบล็อก
Pradeep Kumar Prabaharan

@PradeepKumarPrabaharan maxlengthไม่รองรับอินพุทตัวเลข ในตัวอย่างของฉันvalue.slice(0,16)จะไม่เตะจนกว่าค่าอินพุตจะมากกว่า 16 อักขระ
thdoan

ใช่ maxlength ไม่รองรับการป้อนตัวเลข .. รหัสนี้เป็น gud แต่รหัสนี้ไม่ตรงกับคุณสมบัติของ maxlength อย่างแน่นอน ..
Pradeep Kumar Prabaharan

@TobiasGaertner type="number"ดูแลเรื่องนี้ :)
thdoan

@ 10basetom ... ขึ้นอยู่กับเบราว์เซอร์ ... เช่นใน FF คุณยังสามารถป้อนอักขระได้และจะไม่หยุดหลังจากขีด จำกัด - แต่เกี่ยวข้องกับแนวคิดของหมายเลขประเภทที่เป็นโซลูชันที่ยอมรับได้
Tobias Gaertner

6

คำตอบของ Maycow Moura เป็นการเริ่มต้นที่ดี อย่างไรก็ตามวิธีการแก้ปัญหาของเขาหมายความว่าเมื่อคุณป้อนตัวเลขตัวที่สองการแก้ไขฟิลด์ทั้งหมดจะหยุดลง ดังนั้นคุณไม่สามารถเปลี่ยนค่าหรือลบอักขระใด ๆ ได้

รหัสต่อไปนี้หยุดที่ 2 แต่อนุญาตให้แก้ไขเพื่อดำเนินการต่อ

//MaxLength 2
onKeyDown="if(this.value.length==2) this.value = this.value.slice(0, - 1);"

2
Nope ลองวางค่า
Qwertiy

6

ฉันมีปัญหานี้มาก่อนและฉันแก้ไขโดยใช้การรวมกันของประเภทหมายเลข html5 และ jQuery

<input maxlength="2" min="0" max="59" name="minutes" value="0" type="number"/>

สคริปต์:

$("input[name='minutes']").on('keyup keypress blur change', function(e) {
    //return false if not 0-9
    if (e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
       return false;
    }else{
        //limit length but allow backspace so that you can still delete the numbers.
        if( $(this).val().length >= parseInt($(this).attr('maxlength')) && (e.which != 8 && e.which != 0)){
            return false;
        }
    }
});

ฉันไม่ทราบว่าเหตุการณ์ต่าง ๆ เกิดขึ้นน้อยเกินไปหรือไม่ แต่มันแก้ปัญหาของฉันได้ไหม JSfiddle


คุณสามารถวางอักขระได้อย่างง่ายดาย
Jessica

4

อินพุต HTML

 <input class="minutesInput" type="number" min="10" max="120" value="" />

jQuery

 $(".minutesInput").on('keyup keypress blur change', function(e) {

    if($(this).val() > 120){
      $(this).val('120');
      return false;
    }

  });

4

วิธีง่ายๆในการตั้งค่าความยาวสูงสุดสำหรับอินพุตตัวเลขคือ:

<input type="number" onkeypress="return this.value.length < 4;" oninput="if(this.value.length>=4) { this.value = this.value.slice(0,4); }" />

ไม่สามารถใช้งานได้บน Android chrome onkeypress มีปัญหาบางอย่างกับสิ่งนี้
Aakash Thakur

3

เช่นเดียวกับtype="number"คุณระบุคุณสมบัติmaxแทนmaxlengthซึ่งเป็นจำนวนสูงสุดที่เป็นไปได้ ดังนั้นด้วย 4 หลักmaxควรจะเป็น99995 หลัก99999เป็นต้น

นอกจากนี้หากคุณต้องการตรวจสอบให้แน่ใจว่ามันเป็นจำนวนบวกคุณสามารถตั้งค่าmin="0"เพื่อให้มั่นใจว่าตัวเลขที่เป็นบวก


3

ฮึ. มันเหมือนมีคนยอมแพ้ครึ่งทางผ่านการใช้งานและคิดว่าไม่มีใครสังเกต

ไม่ว่าจะด้วยเหตุผลใดคำตอบข้างต้นไม่ได้ใช้minและmaxคุณลักษณะ jQuery นี้เสร็จสิ้นแล้ว:

    $('input[type="number"]').on('input change keyup paste', function () {
      if (this.min) this.value = Math.max(parseInt(this.min), parseInt(this.value) || 0);
      if (this.max) this.value = Math.min(parseInt(this.max), parseInt(this.value) || 0);
    });

มันอาจจะทำงานเป็นฟังก์ชั่นที่มีชื่อ "oninput" โดยไม่มี jQuery หากหนึ่งในประเภท "jQuery-is-the-devil" ของคุณ


มันไม่ถูกต้องตอบคำถาม แต่ได้รับการโหวตขึ้นตามที่ได้แก้ปัญหาของฉัน :)
TrOnNe

2

ขณะที่ผมพบคุณไม่สามารถใช้ใด ๆ ของonkeydown, onkeypressหรือonkeyupกิจกรรมสำหรับโซลูชั่นที่สมบูรณ์รวมถึงเบราว์เซอร์มือถือ โดยวิธีonkeypressเลิกใช้แล้วและจะไม่ปรากฏในchrome / operaสำหรับ Android (ดู: UI เหตุการณ์ W3C Working Draft, 04 สิงหาคม 2559 )

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

function checkMaxLength(event) {
	// Prepare to restore the previous value.
	if (this.oldValue === undefined) {
		this.oldValue = this.defaultValue;
	}

	if (this.value.length > this.maxLength) {
		// Set back to the previous value.
		this.value = oldVal;
	}
	else {
		// Store the previous value.
		this.oldValue = this.value;
		
		// Make additional checks for +/- or ./, etc.
		// Also consider to combine 'maxlength'
		// with 'min' and 'max' to prevent wrong submits.
	}
}

ฉันจะแนะนำให้รวมmaxlengthกับminและmaxเพื่อป้องกันการส่งที่ไม่ถูกต้องตามที่ระบุไว้ข้างต้นหลายครั้ง


2
<input type="number" onchange="this.value=Math.max(Math.min(this.value, 100), -100);" />

หรือถ้าคุณต้องการที่จะป้อนอะไร

<input type="number" onchange="this.value=this.value ? Math.max(Math.min(this.value,100),-100) : null" />

1

คุณสามารถลองใช้วิธีนี้เช่นกันสำหรับการป้อนตัวเลขด้วยการจำกัดความยาว

<input type="tel" maxlength="3" />

@tiltdown Sry สำหรับ mistype แก้ไขคำตอบ
shinobi

1

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

(function($) {
 methods = {
    /*
     * addMax will take the applied element and add a javascript behavior
     * that will set the max length
     */
    addMax: function() {
        // set variables
        var
            maxlAttr = $(this).attr("maxlength"),
            maxAttR = $(this).attr("max"),
            x = 0,
            max = "";

        // If the element has maxlength apply the code.
        if (typeof maxlAttr !== typeof undefined && maxlAttr !== false) {

            // create a max equivelant
            if (typeof maxlAttr !== typeof undefined && maxlAttr !== false){
                while (x < maxlAttr) {
                    max += "9";
                    x++;
                }
              maxAttR = max;
            }

            // Permissible Keys that can be used while the input has reached maxlength
            var keys = [
                8, // backspace
                9, // tab
                13, // enter
                46, // delete
                37, 39, 38, 40 // arrow keys<^>v
            ]

            // Apply changes to element
            $(this)
                .attr("max", maxAttR) //add existing max or new max
                .keydown(function(event) {
                    // restrict key press on length reached unless key being used is in keys array or there is highlighted text
                    if ($(this).val().length == maxlAttr && $.inArray(event.which, keys) == -1 && methods.isTextSelected() == false) return false;
                });;
        }
    },
    /*
     * isTextSelected returns true if there is a selection on the page. 
     * This is so that if the user selects text and then presses a number
     * it will behave as normal by replacing the selection with the value
     * of the key pressed.
     */
    isTextSelected: function() {
       // set text variable
        text = "";
        if (window.getSelection) {
            text = window.getSelection().toString();
        } else if (document.selection && document.selection.type != "Control") {
            text = document.selection.createRange().text;
        }
        return (text.length > 0);
    }
};

$.maxlengthNumber = function(){
     // Get all number inputs that have maxlength
     methods.addMax.call($("input[type=number]"));
 }

})($)

// Apply it:
$.maxlengthNumber();

@Phill_t บางทีคุณสามารถสอนฉันได้ไหม ฉันใช้รหัสของคุณและทำงานได้ดีในเงินต้น แต่ "$ (นี้) .attr (" maxlength ")" จะให้ 2 เสมอและทำไมมันจะดีกว่าที่จะใช้ "$ (นี้) .attr (" maxlength ")" ถ้ามันใช้งานได้แทนที่จะเป็น "this.maxlength" ที่ฉันทดสอบและทำงานตามที่คาดไว้และสั้นกว่าและ imho ก็อ่านได้ชัดเจนขึ้น? ฉันคิดถึงอะไรเหรอ?
เครื่องหมายของ

คุณหมายถึง "ส่ง 2"
Philll_t

Phill_t ขอโทษด้วย "this.maxLength" ทำงานในขอบเขตของฟังก์ชั่น keydown เท่านั้น ในฟังก์ชั่น "addMax" "this" เป็นเอกสารแทนที่จะเป็นองค์ประกอบที่คาดหวังและดังนั้นจึงมีค่าแอตทริบิวต์ที่แตกต่างกัน ฉันจะเข้าถึงหมายเลขที่ป้อนแทนได้อย่างไร โค้ดด้านบนใช้งานได้จริงหรือเปล่า ฉันทดสอบกับ Chrome / Opera / Vivaldi, Firefox, Edge, IE และ Safari และมีผลลัพธ์เหมือนกันสำหรับแต่ละเบราว์เซอร์ ตกลงใน Edge maxlegth = "1" และ maxlength = "2" ซึ่งใช้งานได้จริง แต่ "$ (this) .attr (" maxlength ")" จะไม่เพิ่มจำนวนที่สูงขึ้นอีก !! @ anybody: คำแนะนำใด ๆ
markus s

อย่างที่ฉันบอกว่ามันเป็นสองเสมอเพราะมันถูกเรียกในเอกสารมากกว่าในองค์ประกอบที่เป็นปัญหาตามที่ฉันค้นพบเมื่อฉันทำการดีบั๊ก โดยวิธีที่คุณอาจต้องการดูโซลูชันของฉันที่ฉันคิดออกหลังจากศึกษาของคุณ: stackoverflow.com/a/41871960/1312012
markus s


0

นี่อาจช่วยใครซักคน

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

$('input[type=datetime-local]').each(function( index ) {

    $(this).change(function() {
      var today = new Date();
      var date = new Date(this.value);
      var yearFuture = new Date();
      yearFuture.setFullYear(yearFuture.getFullYear()+100);

      if(date.getFullYear() > yearFuture.getFullYear()) {

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