1

我有一个文本框,我想让用户只输入 4 位数字,因为我想从用户那里花时间,但我面临着一个奇怪的问题。

小提琴演示

Javascript

function CheckLength(val, key) {
      var keycode = (key.which) ? key.which : key.keyCode;
      if(!(keycode == 8 || keycode == 46) && (keycode < 48 || keycode > 57))
         return false;
      if (val.length < 4)
         console.log(val);
      else
         return false;
}

HTML 标记

 <input type="text" id="timepick" onkeyup="return CheckLength(this.value,event);"  />

谁能帮我?为什么会这样?

感谢您宝贵的时间。

4

3 回答 3

2

您可以收听“keydown”事件而不是“keyup”这是您的Fiddle,(我只更改为 down)。,或通过重置“keyup”事件中的值来删除最后输入的键。

document.getElementById("timepick").addEventListener("keyup", function (e) {
    var keycode = (e.which) ? e.which : e.keyCode;
    if (e.target.value.length <= 4) console.log(e.target.value)
    if (!(keycode == 8 || keycode == 46) && (keycode < 48 || keycode > 57) || e.target.value.length > 3) 
        e.target.value = e.target.value.substr ( 0,4)
});

就像在这个小提琴中

或者您可以使用 2 个单独的事件,一个“keydown”来阻止输入,一个 keyup 来读取值

document.getElementById("timepick").addEventListener("keydown", function (e) {
    var keycode = (e.which) ? e.which : e.keyCode;
    if (!(keycode == 8 || keycode == 46) && ((keycode < 48 || keycode > 57) || e.target.value.length > 3) e.preventDefault()

});
document.getElementById("timepick").addEventListener("keyup", function (e) {
    if (e.target.value.length == 4) console.log(e.target.value)
});

就像在这个小提琴中

更新,关于您的评论您当然可以只使用“keydown”事件,并自行构建您想要的值。

document.getElementById("timepick").addEventListener("keydown", function (e) {
    var keycode = (e.which) ? e.which : e.keyCode;
    if (!(keycode == 8 || keycode == 46) && ((keycode < 48 || keycode > 57) || e.target.value.length > 3)) e.preventDefault()
    if (e.target.value.length == 3) console.log(e.target.value + String.fromCharCode(keycode))

});

就像在这个小提琴中

于 2013-07-10T09:51:47.220 回答
1

希望这对您有所帮助。它防止超过 4 个值并显示输入到日志中的 4 个(在小提琴中,我通过警报更改了 console.log)。

我通过将 4 个值存储到变量中来解决它,如果用户输入超过 4 个值,则使用变量值恢复文本框值:

http://fiddle.jshell.net/6czXu/7/

var vals; 

function CheckLength(val, key) {
   var keycode = (key.which) ? key.which : key.keyCode;

   if (val.length < 5){
     alert(val);
     // Here store the 4 values
     vals = val;
     if((keycode == 8 || keycode == 46) && (keycode < 48 || keycode > 57))
       return false;
     }
     else{
        // Here we have more than 4 digits entered so
        // we restore the prevously stored into vals
        document.getElementById("timepick").value = vals;
        return false;
     }
 }
于 2013-07-10T10:17:10.593 回答
0

改用该onkeypress事件,一切都应该正常工作。onkeyup为时已晚。

<input type="text" id="timepick" onkeypress="return CheckLength(this.value,event);"  />
于 2013-07-10T09:51:47.780 回答