达到最大长度值后,将下一个输入聚焦

O P*_*O P 29 javascript iteration jquery counter

一旦前一个输入达到最大长度值,如何关注下一个输入?

a: <input type="text" maxlength="5" />
b: <input type="text" maxlength="5" />
c: <input type="text" maxlength="5" />
Run Code Online (Sandbox Code Playgroud)

如果用户粘贴的文本大于maxlength,理想情况下它应该溢出到下一个输入中.

jsFiddle: http ://jsfiddle.net/4m5fg/1/

我必须强调,我希望使用的插件,因为我宁愿学习背后的逻辑,不是使用已经存在的东西.感谢您的理解.

Jos*_*nox 47

没有使用jQuery,是一个非常干净的实现:

  • 从maxlength属性读取.
  • 缩放到容器内的任意数量的输入.
  • 自动查找要关注的下一个输入.
  • 没有jQuery.

http://jsfiddle.net/4m5fg/5/

<div class="container">
a: <input type="text" maxlength="5" />
b: <input type="text" maxlength="5" />
c: <input type="text" maxlength="5" />
</div>
Run Code Online (Sandbox Code Playgroud)

..

var container = document.getElementsByClassName("container")[0];
container.onkeyup = function(e) {
    var target = e.srcElement || e.target;
    var maxLength = parseInt(target.attributes["maxlength"].value, 10);
    var myLength = target.value.length;
    if (myLength >= maxLength) {
        var next = target;
        while (next = next.nextElementSibling) {
            if (next == null)
                break;
            if (next.tagName.toLowerCase() === "input") {
                next.focus();
                break;
            }
        }
    }
    // Move to previous field if empty (user pressed backspace)
    else if (myLength === 0) {
        var previous = target;
        while (previous = previous.previousElementSibling) {
            if (previous == null)
                break;
            if (previous.tagName.toLowerCase() === "input") {
                previous.focus();
                break;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我必须将 `maxLength` 更改为 `target.maxLength` 而不是 `parseInt(target.attributes["maxlength"].value, 10)` 才能使其正常工作。但是,我使用正确的侦听器,而不是重新定义“onkeyup”函数:“container.addEventListener('keyup', moveToNext)”(其中“moveToNext”是上述答案中的函数)。 (4认同)

mgi*_*nbr 25

您可以在字段中查看输入并测试其值:

$("input").bind("input", function() {
    var $this = $(this);
    setTimeout(function() {
        if ( $this.val().length >= parseInt($this.attr("maxlength"),10) )
            $this.next("input").focus();
    },0);
});
Run Code Online (Sandbox Code Playgroud)

工作演示.

setTimeout是为了确保代码只输入完成并更新值才会运行.绑定input确保大多数类型的输入将触发事件,包括按键,复制/粘贴(甚至是鼠标)和拖放(虽然在这种情况下,后者将无法工作,因为焦点在于可拖动,而不是可放开).

注意:在某些旧版浏览器中,您可能还需要绑定propertychange.


如果用户粘贴的文本大于maxlength,理想情况下它应该溢出到下一个输入中.

为此,您可能需要maxlength使用JavaScript 删除该属性(以便能够捕获完整的输入),并自己实现该功能.我做了一个小例子,相关部分如下:

$("input").each(function() {
    var $this = $(this);
    $(this).data("maxlength", $this.prop("maxlength"));
    $(this).removeAttr("maxlength");
})
Run Code Online (Sandbox Code Playgroud)

这将删除该属性,但会将其保存data,以便您以后可以访问它.

function spill($this, val) {
    var maxlength = $this.data("maxlength");
    if ( val.length >= maxlength ) {
        $this.val(val.substring(0, maxlength));
        var next = $this.next("input").focus();
        spill(next, val.substring(maxlength));
    }
    else
        $this.val(val);
}
Run Code Online (Sandbox Code Playgroud)

这里,最大长度逻辑在JavaScript中重新引入,以及获取"丢弃"部分并在递归调用中使用它spill.如果没有下一个元素,则调用data将返回undefined并且循环将停止,因此输入将在最后一个字段中被截断.

  • @Bingo根据[这个答案](http://stackoverflow.com/a/9205280/520779),`input`用于Firefox,`propertychange`用于其他用户,但事情可能已经改变了(也许每个浏览器)现在支持`input`.唯一可以确定的方法是在不同的环境中进行测试.(PS它是`propertychange`,而不是`propertyChange` - 我已经纠正了我的回答) (2认同)

Ant*_*ony 6

您可以使用纯JavaScript:

DEMO.

检查字符长度el.value.length.如果它等于最大值,请使用移至下一个字段focus().将此函数绑定到keyup事件,onkeyup以便在用户键入字符后每次触发该函数.

var a = document.getElementById("a"),
    b = document.getElementById("b"),
    c = document.getElementById("c");

a.onkeyup = function() {
    if (this.value.length === parseInt(this.attributes["maxlength"].value)) {
        b.focus();
    }
}

b.onkeyup = function() {
    if (this.value.length === parseInt(this.attributes["maxlength"].value)) {
        c.focus();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 使用 keyup 函数可能会产生问题,例如您必须删除文本框中的某些数字,该事件将不允许删除,因为它是按键。而是使用 oninput 事件。会有帮助的 (2认同)

bte*_*fik 5

如果你要有很多领域,你可以做这样的事情.

基本上keyup获取输入的长度,然后将其与maxlength进行比较,如果匹配,则将focus其与下一个输入字段进行比较.

http://jsfiddle.net/btevfik/DVxDA/

$(document).ready(function(){
    $('input').keyup(function(){
        if(this.value.length==$(this).attr("maxlength")){
            $(this).next().focus();
        }
    });
});
Run Code Online (Sandbox Code Playgroud)