J'apprécie donc la réponse de Temani Afif à propos de l'utilisation du masque d'écrêtage. Je pense que c'est génial. Je voulais proposer une autre solution (un peu moins élégante). J'ai également utilisé Firefox pour tester ce problème, et cliquer en dehors de la zone de texte (perdre le focus) ne fait pas réapparaître le 1er chiffre ou la chaîne revient à la normale dans la saisie de texte.
Je crois que le problème est l'attribut css d'espacement des lettres que vous définissez:letter-spacing: 31px;
et le fait que je pense que cela s'appliquerait au signe d'insertion "clignotant" que la plupart des navigateurs ont. En utilisant Chrome, il semble supprimer cela lorsqu'il perd le focus, tandis que Firefox le conserve même après avoir perdu le focus.
La 1ère solution consistait à appeler manuellement la fonction blur () pour faire perdre la focalisation à l'entrée. Cela fonctionne dans Chrome (en utilisant une fonction anonyme auto-exécutable):
<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 même en tant que fonction définie appelée par l'entrée number_text comme ceci:
<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()" ... >
Vous remarquerez un léger retard dans Chrome, mais l'appeler dans Firefox ne résoudra pas le problème.
Nous pouvons essentiellement forcer ce même comportement dans Firefox. Après avoir joué, j'ai pensé que Chrome rafraîchissait / recalculait l'espacement des lettres sur un flou. Ma session de jeu a montré que vous pouviez forcer Firefox à recalculer cette valeur par programme:
- Modifiez le style en ligne de l'attribut d'espacement des lettres de l'entrée en une valeur différente (car nous ne pouvons pas modifier une classe CSS de number_text par programme sans trop d'effort, comme la réécriture de la balise de style entière dans la section style d'un document).
- Supprimez le Class number_text de l'entrée.
- 1 et 2 sont interchangeables, vous avez besoin de Firefox pour revenir uniquement au style en ligne que vous définissez, sans avoir les attributs de classe enregistrés «en mémoire».
- Supprimez le style en ligne et réappliquez la classe CSS number_text. Cela forcera le navigateur à recalculer la séparation des lettres comme nous en avons besoin.
Dans le code, cela ressemblerait à la fonction JavaScript suivante:
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
}
}
Il aura le même scintillement dans Firefox qu'avec Chrome, et tout ira bien.
Remarque : Les fonctions de délai d'attente permettent au navigateur de se rafraîchir et de mettre à jour ce dont nous avons besoin.
Remarque : Vous pouvez choisir d'appeler .blur () dans la fonction pour faire perdre le focus à la zone de texte, ou l'omettre et ils seront toujours dans le champ de saisie sans l'erreur avec les chiffres.
J'espère que cela aide votre compréhension conceptuelle, ainsi que la résolution du problème. D'autres personnes ont donné de bonnes solutions qui évitent le scintillement et fonctionnent à la fois dans Firefox et Chrome!