Podoba mi się więc odpowiedź Temani Afifa na temat używania maski przycinającej. Pomyśl, że to świetnie. Chciałem zaproponować inne rozwiązanie (nieco mniej eleganckie). Użyłem również Firefoksa, aby przetestować ten problem, a kliknięcie poza obszarem tekstowym (utrata fokusu) nie powoduje ponownego pojawienia się pierwszej cyfry lub powrotu łańcucha do normalnego poziomu podczas wprowadzania tekstu.
Wydaje mi się, że problemem jest ustawiony przez Ciebie atrybut css odstępów między literami: letter-spacing: 31px;
i fakt, że uważam, że dotyczyłoby to „migającego” karetki, którą ma większość przeglądarek. W przypadku Chrome wydaje się to usuwać, gdy traci ostrość, a Firefox zachowuje to nawet po utracie ostrości.
Pierwszym rozwiązaniem było ręczne wywołanie funkcji blur (), aby utraciła ostrość na wejściu. Działa to w Chrome (przy użyciu samodzielnie wykonującej się funkcji anonimowej):
<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" >
lub nawet jako funkcję zdefiniowaną wywoływaną przez wejście numer_tekst w taki sposób:
<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()" ... >
Zauważysz niewielkie opóźnienie w przeglądarce Chrome, ale wywołanie tego w przeglądarce Firefox nie rozwiąże problemu.
Możemy zasadniczo wymusić to samo zachowanie w przeglądarce Firefox. Po krótkiej zabawie doszedłem do wniosku, że Chrome odświeża / przelicza odstępy między literami na rozmyciu. Moja sesja odtwarzania pokazała, że możesz zmusić Firefoksa do ponownego obliczenia tej wartości programowo:
- Zmień styl wstawiania atrybutu odstępu między literami na inną wartość (ponieważ nie możemy programowo edytować klasy CSS tekst_liczb bez większego wysiłku, na przykład przepisując cały znacznik stylu w sekcji stylu dokumentu).
- Usuń tekst tekstowy numer z klasy.
- 1 i 2 są wymienne, potrzebujesz Firefoksa, aby powrócić tylko do ustawionego stylu wbudowanego, bez zapisywania atrybutów klasy „w pamięci”.
- Usuń styl wbudowany i ponownie zastosuj klasę CSS typu number_text. Zmusi to przeglądarkę do ponownego obliczenia separacji liter według potrzeb.
W kodzie wygląda to następująco: funkcja 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
}
}
Będzie miał takie samo migotanie w przeglądarce Firefox jak w przypadku Chrome i wszystko będzie dobrze.
Uwaga : Funkcje limitu czasu mają dać przeglądarce czas na odświeżenie i faktycznie zaktualizować to, czego potrzebujemy.
Uwaga : Możesz wybrać wywołanie funkcji .blur () w funkcji, aby pole tekstowe straciło fokus, lub pominąć to i nadal będą znajdować się w polu wprowadzania bez błędu z cyframi.
Mam nadzieję, że pomoże to w zrozumieniu pojęć, a także w rozwiązaniu problemu. Niektóre inne osoby dały dobre rozwiązania, które unikają migotania i działają zarówno w przeglądarce Firefox, jak i Chrome!