Jadi saya suka jawaban Temani Afif tentang menggunakan topeng kliping. Berpikir itu hebat. Saya ingin mengusulkan solusi lain (sedikit kurang elegan). Saya menggunakan Firefox untuk juga menguji masalah ini, dan mengklik di luar area teks (kehilangan fokus) tidak membuat digit pertama muncul kembali atau string kembali normal di input teks di sana.
Saya percaya masalahnya adalah atribut spasi huruf css yang Anda tetapkan:, letter-spacing: 31px;dan fakta bahwa saya percaya ini akan berlaku untuk tanda "berkedip" yang dimiliki sebagian besar browser. Menggunakan Chrome, tampaknya menghapus ini ketika kehilangan fokus, sementara Firefox mempertahankan ini bahkan setelah kehilangan fokus.
Solusi pertama adalah menggunakan fungsi panggilan blur () secara manual untuk membuat input kehilangan fokus. Ini berfungsi di Chrome (menggunakan Fungsi Anonim yang Melakukan sendiri):
<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" >
atau bahkan sebagai Fungsi yang Ditentukan yang dipanggil oleh input number_text seperti:
<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()" ... >
Anda akan melihat sedikit keterlambatan di Chrome, tetapi memanggil ini di Firefox tidak akan menyelesaikan masalah.
Kami pada dasarnya dapat memaksa perilaku yang sama ini di Firefox. Setelah beberapa bermain-main, saya pikir Chrome sedang menyegarkan / menghitung ulang jarak huruf pada blur. Sesi permainan saya menunjukkan bahwa Anda dapat memaksa Firefox untuk menghitung ulang nilai ini secara terprogram:
- Ubah style inline dari atribut spasi huruf input ke nilai yang berbeda (karena kita tidak dapat mengedit kelas CSS number_text secara terprogram tanpa banyak usaha, seperti menulis ulang seluruh style tag di bagian style dari dokumen).
- Hapus Class number_text dari input.
- 1 dan 2 dapat dipertukarkan, Anda perlu Firefox untuk mundur ke hanya gaya inline yang Anda atur, tanpa atribut kelas disimpan 'dalam memori'.
- Hapus inline-style dan terapkan kembali kelas CSS number_text. Ini akan memaksa browser untuk menghitung ulang surat-pemisahan seperti yang kita inginkan.
Dalam kode, ini akan terlihat seperti fungsi JavaScript berikut:
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
}
}
Ini akan memiliki kedipan yang sama di Firefox dengan Chrome, dan semuanya akan baik-baik saja.
Catatan : Fungsi batas waktu adalah memberi waktu browser untuk menyegarkan, dan benar-benar memperbarui apa yang kita butuhkan.
Catatan : Anda dapat memilih untuk memanggil .blur () dalam fungsi untuk membuat kotak teks kehilangan fokus, atau menghilangkannya dan mereka akan tetap berada di bidang input tanpa kesalahan dengan digit.
Semoga ini bisa membantu pemahaman konseptual Anda, serta menyelesaikan masalah. Beberapa orang lain memberikan solusi bagus yang menghindari keseluruhan flicker, dan bekerja di Firefox dan Chrome!