Ich mag die Antwort von Temani Afif über die Verwendung der Schnittmaske. Ich finde es großartig. Ich wollte eine andere Lösung vorschlagen (etwas weniger elegant). Ich habe Firefox auch verwendet, um dieses Problem zu testen. Wenn Sie außerhalb des Textbereichs klicken (Fokus verlieren), wird die erste Ziffer nicht wieder angezeigt oder die Zeichenfolge wird in der Texteingabe dort wieder normal.
Ich glaube, das Problem ist das von Ihnen festgelegte CSS-Attribut für den Buchstabenabstand: letter-spacing: 31px;und die Tatsache, dass dies meiner Meinung nach für das "blinkende" Caret gelten würde, das die meisten Browser haben. Bei Verwendung von Chrome scheint dies zu entfernen, wenn der Fokus verloren geht, während Firefox dies auch nach einem Fokusverlust beibehält.
Die erste Lösung bestand darin, die Funktion blur () manuell aufzurufen, damit die Eingabe den Fokus verliert. Dies funktioniert in Chrome (mithilfe einer selbstausführenden anonymen Funktion):
<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" >
oder sogar als definierte Funktion, die von der Eingabe number_text wie folgt aufgerufen wird:
<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()" ... >
Sie werden eine leichte Verzögerung in Chrome bemerken, aber wenn Sie dies in Firefox aufrufen, wird das Problem nicht behoben.
Wir können im Wesentlichen dasselbe Verhalten in Firefox erzwingen. Nach einigem Herumspielen stellte ich fest, dass Chrome den Buchstabenabstand auf einer Unschärfe aktualisiert / neu berechnet. Meine Spielsitzung hat gezeigt, dass Sie Firefox zwingen können, diesen Wert programmgesteuert neu zu berechnen:
- Ändern Sie den Inline-Stil des Buchstabenabstandsattributs der Eingabe in einen anderen Wert (da wir eine CSS-Klasse von number_text nicht ohne großen Aufwand programmgesteuert bearbeiten können, z. B. das gesamte Stil-Tag im Stilabschnitt eines Dokuments neu schreiben).
- Entfernen Sie die Klasse number_text aus der Eingabe.
- 1 und 2 sind austauschbar. Sie benötigen Firefox, um nur auf den von Ihnen festgelegten Inline-Stil zurückzugreifen, ohne dass die Klassenattribute "im Speicher" gespeichert werden.
- Entfernen Sie den Inline-Stil und wenden Sie die CSS-Klasse number_text erneut an. Dadurch wird der Browser gezwungen, die Buchstabentrennung nach Bedarf neu zu berechnen.
Im Code würde es wie folgt aussehen: JavaScript-Funktion:
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
}
}
In Firefox flackert es genauso wie in Chrome, und alles wird gut.
Hinweis : Die Timeout-Funktionen dienen dazu, dem Browser Zeit zum Aktualisieren zu geben und tatsächlich das zu aktualisieren, was wir benötigen.
Hinweis : Sie können wählen, ob Sie in der Funktion .blur () aufrufen möchten, damit das Textfeld den Fokus verliert, oder dass Sie dies weglassen. Sie befinden sich weiterhin im Eingabefeld, ohne dass der Fehler mit den Ziffern auftritt.
Ich hoffe, dies hilft Ihrem konzeptionellen Verständnis und löst das Problem. Einige andere Personen gaben gute Lösungen, die das ganze Flimmern vermeiden und sowohl in Firefox als auch in Chrome funktionieren!