ดังนั้นฉันชอบคำตอบของ Temani Afif เกี่ยวกับการใช้มาสก์รูปวาด คิดว่ามันยอดเยี่ยม ฉันต้องการเสนอวิธีแก้ปัญหาอื่น (สง่างามน้อยกว่าเล็กน้อย) ฉันใช้ Firefox เพื่อทดสอบปัญหานี้และการคลิกที่นอกพื้นที่ข้อความ (ไม่ได้โฟกัส) จะไม่ทำให้ตัวเลขที่ 1 ปรากฏขึ้นอีกครั้งหรือสตริงกลับไปเป็นปกติในการป้อนข้อความที่นั่น
ฉันเชื่อว่าปัญหาคือตัวอักษร css ที่คุณตั้งไว้:letter-spacing: 31px;
และความจริงที่ว่าฉันเชื่อว่านี่จะใช้กับเครื่องหมายตก "กะพริบ" ที่เบราว์เซอร์ส่วนใหญ่มี การใช้ Chrome ดูเหมือนว่าจะลบสิ่งนี้เมื่อไม่มีการโฟกัสในขณะที่ Firefox ยังคงรักษาสิ่งนี้ไว้แม้จะไม่ได้โฟกัส
วิธีที่หนึ่งคือใช้การเรียกฟังก์ชั่นเบลอ () ด้วยตนเองเพื่อให้อินพุตสูญเสียโฟกัส สิ่งนี้ใช้ได้ใน Chrome (โดยใช้ฟังก์ชั่นไม่ระบุชื่อซึ่งทำงานด้วยตนเอง):
<input type="text" id="number_text" maxlength="6" onkeyup="(function()
{
var x = document.getElementById('number_text');
let value = x.value
if (value.length >= 6){
x.blur()
return false
}
})();"
pattern="\d{6}" value="1234" >
หรือแม้กระทั่งเป็นฟังก์ชั่นที่กำหนดเรียกโดยอินพุต number_text ดังนี้:
<script>
handleMaxInput = function(){
var x = document.getElementById('number_text');
let value = x.value
if (value.length >= 6){
x.blur()
return false
}
};
</script>
<input ... id='number_text' ... onkeyup="handleMaxInput()" ... >
คุณจะสังเกตเห็นความล่าช้าเล็กน้อยใน Chrome แต่การเรียกสิ่งนี้ใน Firefox จะไม่สามารถแก้ไขปัญหาได้
เราสามารถบังคับพฤติกรรมนี้ใน Firefox ได้ หลังจากเล่นไปแล้วฉันคิดว่า Chrome กำลังรีเฟรช / คำนวณระยะห่างของตัวอักษรใหม่บนความเบลอ เซสชันการเล่นของฉันแสดงให้เห็นว่าคุณสามารถบังคับให้ Firefox คำนวณค่านี้ใหม่โดยทางโปรแกรม:
- เปลี่ยนรูปแบบอินไลน์ของแอตทริบิวต์การเว้นวรรคตัวอักษรของอินพุตเป็นค่าอื่น (เนื่องจากเราไม่สามารถแก้ไขคลาส CSS ของ number_text โดยทางโปรแกรมโดยไม่ต้องใช้ความพยายามมากเช่นการเขียนแท็กสไตล์ทั้งหมดในส่วนสไตล์ของเอกสาร)
- ลบคลาส number_text ออกจากอินพุต
- 1 และ 2 สามารถใช้แทนกันได้คุณต้องใช้ Firefox เพื่อย้อนกลับไปสู่รูปแบบอินไลน์ที่คุณตั้งไว้โดยไม่ต้องบันทึกแอตทริบิวต์ของคลาส 'ในหน่วยความจำ'
- ลบ inline-style และนำคลาส CSS number_text ไปใช้ใหม่ สิ่งนี้จะบังคับให้เบราว์เซอร์คำนวณการแยกจดหมายตามที่เราต้องการ
ในรหัสมันจะดูเหมือนฟังก์ชั่น JavaScript ต่อไปนี้:
handleMaxInput = function(){
var x = document.getElementById('number_text');
let value = x.value
if (value.length >= 6){ // if the input is 6 or more characters
x.classList.remove('number_text') // remove the class
x.style.letterSpacing = '0px' // reset the spacing
setTimeout(function() { // set time to let browser refresh updates
x.classList.add('number_text') // Re-add class after browser refresh
setTimeout(function() { // Remove inline-style after more reculculations
x.style.removeProperty('letter-spacing') // Remove inline style to let class styles apply
x.blur // optional, will force input field to lose focus. Else comment out to avoid that.
}, (1)); // waits 1 millisecond
}, (1)); // waits 1 millisecond
}
}
มันจะมีการสั่นไหวเหมือนกันใน Firefox เช่นเดียวกับ Chrome และทุกอย่างจะดี
หมายเหตุ : ฟังก์ชั่นการหมดเวลาคือการให้เวลาเบราว์เซอร์ในการรีเฟรชและปรับปรุงสิ่งที่เราต้องการ
หมายเหตุ : คุณสามารถเลือกที่จะโทร. blur () ในฟังก์ชั่นเพื่อทำให้กล่องข้อความเสียโฟกัสหรือตัดออกและพวกเขาจะยังคงอยู่ในช่องป้อนข้อมูลโดยไม่มีข้อผิดพลาดกับตัวเลข
หวังว่าสิ่งนี้จะช่วยให้คุณเข้าใจความคิดรวบยอดรวมถึงการแก้ไขปัญหา บุคคลอื่นให้คำตอบที่ดีซึ่งหลีกเลี่ยงการสั่นไหวทั้งหมดและทำงานได้ทั้ง Firefox และ Chrome!