Quindi mi piace la risposta di Temani Afif sull'uso della maschera di ritaglio. Penso che sia fantastico. Volevo proporre un'altra soluzione (un po 'meno elegante). Ho usato Firefox per testare anche questo problema e facendo clic al di fuori dell'area di testo (perdendo lo stato attivo) non riappare la prima cifra o la stringa torna alla normalità nel testo inserito lì.
Credo che il problema sia l'attributo css di spaziatura tra lettere che hai impostato:letter-spacing: 31px; e il fatto che credo si applicherebbe al cursore "lampeggiante" che la maggior parte dei browser ha. Usando Chrome, sembra rimuoverlo quando perde lo stato attivo, mentre Firefox lo mantiene anche dopo aver perso lo stato attivo.
La prima soluzione consisteva nell'utilizzare manualmente la funzione di sfocatura () per far perdere la messa a fuoco dell'ingresso. Funziona in Chrome (usando una funzione anonima auto-eseguita):
<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 anche come una Funzione definita chiamata dall'input number_text in questo modo:
<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()" ... >
Noterai un leggero ritardo in Chrome, ma chiamare questo in Firefox non risolverà il problema.
Possiamo essenzialmente forzare questo stesso comportamento in Firefox. Dopo aver giocato un po ', ho pensato che Chrome stesse rinfrescando / ricalcolando la spaziatura delle lettere su una sfocatura. La mia sessione di gioco ha mostrato che potresti forzare Firefox a ricalcolare questo valore a livello di codice:
- Cambia lo stile incorporato dell'attributo di spaziatura tra lettere in un valore diverso (poiché non possiamo modificare una classe CSS di number_text a livello di codice senza troppi sforzi, come riscrivere l'intero tag di stile nella sezione di stile di un documento).
- Rimuovere la classe number_text dall'input.
- 1 e 2 sono intercambiabili, è necessario che Firefox esegua il fallback solo allo stile inline impostato, senza che gli attributi della classe vengano salvati "in memoria".
- Rimuovi lo stile inline e riapplica la classe CSS number_text. Ciò costringerà il browser a ricalcolare la separazione delle lettere nel momento in cui ne abbiamo bisogno.
Nel codice, sembrerebbe la seguente funzione 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
}
}
Avrà lo stesso sfarfallio in Firefox come con Chrome, e tutto andrà bene.
Nota : le funzioni di timeout consentono di aggiornare il browser e di aggiornare effettivamente ciò di cui abbiamo bisogno.
Nota : è possibile scegliere di chiamare .blur () nella funzione per fare in modo che la casella di testo perda lo stato attivo, oppure ometterlo e rimarranno nel campo di input senza l'errore con le cifre.
Spero che questo aiuti la tua comprensione concettuale, oltre a risolvere il problema. Alcune altre persone hanno dato buone soluzioni che evitano tutto lo sfarfallio e funzionano sia in Firefox che in Chrome!