Então, eu gosto da resposta de Temani Afif sobre o uso da máscara de recorte. Acha ótimo. Eu queria propor outra solução (um pouco menos elegante). Eu usei o Firefox também para testar esse problema, e clicar fora da área de texto (perdendo o foco) não faz o primeiro dígito reaparecer ou a string voltar ao normal na entrada de texto.
Acredito que o problema seja o atributo css de espaçamento entre letras que você definiu: letter-spacing: 31px;
e o fato de acreditar que isso se aplicaria ao cursor "piscante" que a maioria dos navegadores possui. Usando o Chrome, parece remover isso quando ele perde o foco, enquanto o Firefox mantém isso mesmo depois de perder o foco.
A primeira solução foi usar a chamada manual da função blur () para fazer com que a entrada perca o foco. Isso funciona no Chrome (usando uma função anônima de execução automática):
<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" >
ou mesmo como uma Função Definida chamada pela entrada number_text da seguinte maneira:
<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()" ... >
Você notará um pequeno atraso no Chrome, mas chamar isso no Firefox não resolverá o problema.
Podemos essencialmente forçar esse mesmo comportamento no Firefox. Depois de algumas brincadeiras, percebi que o Chrome estava atualizando / recalculando o espaçamento das letras em um borrão. Minha sessão de jogo mostrou que você pode forçar o Firefox a recalcular esse valor programaticamente:
- Altere o estilo embutido do atributo de espaçamento entre letras da entrada para um valor diferente (como não podemos editar uma classe CSS de number_text programaticamente sem muito esforço, como reescrever a marca de estilo inteira na seção de estilo de um documento).
- Remova a classe number_text da entrada.
- 1 e 2 são intercambiáveis, você precisa que o Firefox faça o fallback apenas para o estilo embutido definido, sem ter os atributos de classe salvos 'na memória'.
- Remova o estilo embutido e aplique novamente a classe CSS number_text. Isso forçará o navegador a recalcular a separação de letras conforme necessário.
No código, seria semelhante à seguinte função 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
}
}
Ele terá a mesma cintilação no Firefox e no Chrome, e tudo ficará bem.
Nota : As funções de tempo limite são para dar tempo ao navegador para atualizar e realmente atualizar o que precisamos.
Nota : Você pode optar por chamar .blur () na função para fazer a caixa de texto perder o foco ou omitir isso, e eles ainda estarão no campo de entrada sem o erro dos dígitos.
Espero que isso ajude sua compreensão conceitual, bem como a solução do problema. Outras pessoas deram boas soluções que evitam toda a cintilação e funcionam no Firefox e no Chrome!