Тому мені подобається відповідь Темані Афіфа щодо використання відсічної маски. Подумайте, що це чудово. Я хотів запропонувати ще одне рішення (трохи менш елегантне). Я також використовував Firefox для тестування цієї проблеми, і натискання за межі області тексту (втрачає фокус) не призводить до повторного відображення першої цифри або після повернення рядка до нормального тексту.
Я вважаю, що проблема полягає у встановленому вами атрибуті 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" >
або навіть як визначена функція, що викликається вводом числа_тексту так:
<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-клас номер_тексту без особливих зусиль, наприклад, переписати весь тег стилів у розділі стилю документа).
- Вийміть із вхідного тексту номер_тексту класу.
- 1 і 2 взаємозамінні, вам потрібно Firefox відновлювати лише встановлений вами стиль вбудованої форми, не зберігаючи атрибути класу "в пам'яті".
- Видаліть вбудований стиль і повторно застосуйте CSS клас номер_тексту. Це змусить браузер перерахувати розділення листів у міру необхідності.
У коді це виглядатиме як така функція 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!