焦点会触发键盘事件吗?

时间:2015-04-07 13:08:54

标签: javascript jquery date onkeyup onfocus

我为时间输入制作了3个输入框(hh,mm,ss) 当用户输入2位数字时,它将自动聚焦下一个(mm)字段。同样适用于mm和ss。

我正在使用' keyup'用于绑定输入框的事件。然而这种行为很奇怪:

如果我慢慢输入2位数字,它就可以了。 如果我输入FASTER,它会跳两次。

我怀疑焦点是'事件触发了keyup事件,我不知道如何处理它。我曾尝试过.preventDefault对焦点事件。但没有运气。

以下是代码:

$('#hh').on('keyup', function (e) {
    var hh = $('#hh').val().toString();
    if (hh.length >= 2) {
        $('#mm').focus();
    }
});

$('#mm').on('keyup', function (e) {
    var mm = $('#mm').val().toString();
    if (mm.length >= 2) {
        $('#ss').focus();
    }
});

这是一个演示:

jsfiddlehttp://jsfiddle.net/ch3ksuwa

要重现:在hh字段中快速输入2位数字,它将跳转到ss而不是mm

我试过Chrome和Firefox,同样的问题

2 个答案:

答案 0 :(得分:1)

看起来$('#hh').val()在第二次按键后发生,但我不确定为什么第二个'keyup'事件的目标是#mm。

您可以尝试使用'input'事件而不是'keyup'事件。当输入的值发生变化时,将触发此事件。为此目的更具语义性,并避免在错误的时间触发键盘事件的任何问题。

$('#hh').on('input', function (e) {
  var hh = $('#hh').val().toString();
  if (hh.length >= 2) {
    $('#mm').focus();
  }
});

$('#mm').on('input', function (e) {
  var mm = $('#mm').val().toString();
  if (mm.length >= 2) {
    $('#ss').focus();
  }
});

我还没有检查过哪些浏览器支持这个。它正在为我开发Chrome。

答案 1 :(得分:0)

这很直接。如果你输入快速,事件会触发两次,因为你设置"值"到2位数字。通过这样做来测试:键入' 23',同时按住两个键。然后释放2,它将跳转到第二个输入,然后释放3,它将跳到最后一个。

因此,一旦您在第一个输入中键入两个数字并释放一个键,该事件将被触发一次,而在第二个键盘上,将立即触发下一个事件键,因为第二个输入的值已经是2数字长。

如果用占位符替换它,那么它可以工作。看看这个:

<input type="text" id="ss" class="chained" placeholder="30">

http://jsfiddle.net/ch3ksuwa/4/

编辑:我发布的第一个解决方案以某种方式解决了这个问题,第二次有人想要更改某个值时,会发生同样的错误。

所以我添加了一个名为&#34; comeFromFirst&#34;的变量。一旦keyup事件触发第二个输入上的.focus,它最初为false并且将为true。然后,第一次在第二个输入中触发键盘事件时,它会将值设置为false。现在你也可以使用&#34; value&#34;而不是占位符(占位符在大多数情况下更好,tho)。在这里查看:

http://jsfiddle.net/ch3ksuwa/5/

相关的jQuery:

var comesFromFirst = false;

$('#hh').on('keyup', function (e) {
    var hh = $('#hh').val().toString();
     comesFromFirst = true;
    if (hh.length >= 2) {
        $('#mm').focus();
    }
});

$('#mm').on('keyup', function (e) {
    var mm = $('#mm').val().toString();
    console.log(comesFromFirst);
    if (mm.length >= 2 && comesFromFirst == false) {    
        $('#ss').focus();
    }
    else{
        comesFromFirst = false;  
    }
});