0

首先,这是代码:

 var max = 1;
    $('form').find('span').keydown(function(e){
        if ((e.which > 47 && e.which < 58) || (e.which > 95 && e.which < 106)) {
            if ($(this).html() >= max) {
                e.preventDefault();
                $(this).html($(this).html().substr(0,1));
               if ($(this).is(':last-child')) {
                    $(this).parent().next().find('span:first-of-type').focus();
                }
                else
                {
                    $(this).next().focus();
                }
            }
        }
        else if (e.which != 8  && e.which != 9 && e.which != 46 && e.which != 37 &&    e.which != 38 && e.which != 39 && e.which != 40)

        {
            e.preventDefault();
        }
    });

首先,我确定是否输入了一个数字,然后检查是否输入了多个数字。如果满足这些条件,我会阻止默认值,这样我们就不能输入两个或更多字符并转移焦点到下一个跨度。

我的问题是,在第一次按下焦点没有移动后,我需要按两次按钮才能工作。问题是什么?我认为这是我对事件对象的理解不足,但无论如何我感谢任何帮助。

4

2 回答 2

1

几件事:

  1. 使用keyup而不是keydown. 您想检查何时添加了新数字。

  2. 用于$(this).html().length == max检查何时达到最大位数。现在您不需要substr,只需将焦点更改为下一个元素。

小提琴示例(注意:我在示例中将 span 更改为输入)

更新

这是供将来参考的最终代码:

var max = 1;
$('form').find('input').keydown(function (e) {
    if ((e.which > 47 && e.which < 58) || (e.which > 95 && e.which < 106)) {
        if ($(this).val().length < max) {
            return;
        } else {
            e.preventDefault();
        }
    } else if (e.which != 8 && e.which != 9 && e.which != 46 && e.which != 37 && e.which != 38 && e.which != 39 && e.which != 40) e.preventDefault();
}).keyup(function (e) {
    if ($(this).val().length >= max) {
        if ($(this).is(':last-child'))
            $(this).parent().next().find('input:first-of-type').focus();
        else
            $(this).next().focus();
    }
});
于 2013-07-16T17:10:11.603 回答
0

尝试keyup代替keydown.

于 2013-07-16T17:05:25.050 回答