因此,我喜欢Temani Afif关于使用剪切蒙版的答案。觉得很棒。我想提出另一种解决方案(不太优雅)。我也使用Firefox来测试此问题,并且在文本区域外单击(失去焦点)不会重新显示第一个数字,或者在该区域输入的文本字符串恢复正常。
我认为问题在于您设置的信间距css属性:letter-spacing: 31px;
,并且我相信这将适用于大多数浏览器的“闪烁”插入符号。使用Chrome,似乎在失去焦点时将其删除,而Firefox甚至在失去焦点后也将其保留。
第一种解决方案是使用手动调用blur()函数使输入失去焦点。在Chrome(使用自我执行匿名功能)中可以使用:
<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" >
甚至作为number_text输入调用的定义函数,如下所示:
<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()" ... >
您会注意到Chrome略有延迟,但是在Firefox中调用此方法无法解决问题。
我们基本上可以在Firefox中强制执行相同的行为。经过一番摸索,我发现Chrome正在模糊地刷新/重新计算字母间距。我的播放会话显示您可以强制Firefox以编程方式重新计算该值:
- 将输入的letter-spacing属性的内联样式更改为其他值(因为我们不能费力地以编程方式编辑number_text的CSS类,例如在文档的style部分中重写整个style标签)。
- 从输入中删除类number_text。
- 1和2是可互换的,您需要Firefox退回到仅设置的内联样式,而不必将类属性保存在“内存”中。
- 删除内联样式,然后重新应用number_text CSS类。这将迫使浏览器根据需要重新计算字母分隔符。
在代码中,它将类似于以下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
}
}
它将在Firefox中具有与Chrome相同的闪烁,并且一切都会很好。
注意:超时功能是给浏览器刷新时间,并实际更新我们需要的内容。
注意:您可以选择在函数中调用.blur()以使文本框失去焦点,或者忽略该焦点,它们仍将位于输入字段中,而不会出现数字错误。
希望这有助于您的概念理解以及解决问题。其他一些人给出了很好的解决方案,可以避免整个过程的闪烁,并且可以在Firefox和Chrome中使用!