Поэтому мне нравится ответ Темани Афифа об использовании обтравочной маски. Думаю, это здорово. Я хотел предложить другое решение (немного менее элегантное). Я также использовал Firefox для проверки этой проблемы, и нажатие за пределами текстовой области (потеря фокуса) не приводит к повторному появлению 1-й цифры или возвращению строки в нормальное состояние при вводе текста.
Я полагаю, что проблема заключается в заданном вами атрибуте css буквы letter-spacing: 31px;
и том факте, что я считаю, что это применимо к "мигающей" каретке, которую имеет большинство браузеров. Используя Chrome, он, кажется, удаляет это, когда теряет фокус, в то время как Firefox сохраняет это даже после потери фокуса.
Первым решением было использовать вручную вызов функции blur (), чтобы ввод потерял фокус. Это работает в 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 использовал только встроенный стиль, который вы установили, без сохранения атрибутов класса «в памяти».
- Удалите встроенный стиль и повторно примените 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!