Entonces me gusta la respuesta de Temani Afif sobre el uso de la máscara de recorte. Piensa que es genial. Quería proponer otra solución (un poco menos elegante). También utilicé Firefox para probar este problema, y al hacer clic fuera del área de texto (perder el foco) no vuelve a aparecer el primer dígito o la cadena vuelve a la normalidad en la entrada de texto allí.
Creo que el problema es el atributo css de espaciado de letras que establece:letter-spacing: 31px;
y el hecho de que creo que esto se aplicaría al intermitente "parpadeante" que tienen la mayoría de los navegadores. Al usar Chrome, parece eliminar esto cuando pierde el foco, mientras que Firefox lo retiene incluso después de perder el foco.
La primera solución fue utilizar manualmente la función blur () para hacer que la entrada pierda el foco. Esto funciona en Chrome (usando una función anónima autoejecutable):
<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" >
o incluso como una función definida llamada por la entrada number_text así:
<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()" ... >
Notarás un ligero retraso en Chrome, pero llamar a esto en Firefox no resolverá el problema.
Básicamente, podemos forzar este mismo comportamiento en Firefox. Después de jugar un poco, me di cuenta de que Chrome estaba actualizando / volviendo a calcular el espacio entre letras en un desenfoque. Mi sesión de juego mostró que podrías forzar a Firefox a recalcular este valor mediante programación:
- Cambie el estilo en línea del atributo de espacio entre letras de la entrada a un valor diferente (ya que no podemos editar una clase CSS de number_text mediante programación sin mucho esfuerzo, como volver a escribir la etiqueta de estilo completa en la sección de estilo de un documento).
- Elimine la clase number_text de la entrada.
- 1 y 2 son intercambiables, necesita que Firefox recurra solo al estilo en línea que configuró, sin tener los atributos de clase guardados 'en memoria'.
- Elimine el estilo en línea y vuelva a aplicar la clase CSS number_text. Esto obligará al navegador a volver a calcular la separación de letras según lo necesitemos.
En código, se vería como la siguiente función de 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
}
}
Tendrá el mismo parpadeo en Firefox que con Chrome, y todo estará bien.
Nota : Las funciones de tiempo de espera son para darle tiempo al navegador para actualizarse y, de hecho, actualizar lo que necesitamos.
Nota : Puede elegir llamar a .blur () en la función para hacer que el cuadro de texto pierda el foco u omitirlo y seguirán en el campo de entrada sin el error con los dígitos.
Espero que esto ayude a su comprensión conceptual, así como a resolver el problema. ¡Algunas otras personas dieron buenas soluciones que evitan todo el parpadeo y funcionan tanto en Firefox como en Chrome!