一旦达到 maxlength 值,就聚焦下一个输入

IT技术 javascript jquery iteration counter
2021-03-16 07:14:40

一旦前一个输入达到其 maxlength 值,如何聚焦下一个输入?

a: <input type="text" maxlength="5" />
b: <input type="text" maxlength="5" />
c: <input type="text" maxlength="5" />

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

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

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

6个回答

没有使用 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>

..

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;
            }
        }
    }
}
var target = e.srcElement || e.target;帮助我使用您的解决方案。谢谢!
2021-04-17 07:14:40
我不得不改变maxLengthtarget.maxLength代替parseInt(target.attributes["maxlength"].value, 10),以使其正常工作。但是,我使用的是正确的侦听器,而不是重新定义onkeyup函数:(上面答案中的函数container.addEventListener('keyup', moveToNext)在哪里moveToNext)。
2021-04-30 07:14:40
这仅适用于页面中的第一个容器。修改它以适用于所有人是相对微不足道的,但值得指出以防新手使用它。
2021-05-08 07:14:40
如果添加 maxlength = 2,则无法编辑输入字段。
2021-05-11 07:14:40

您可以观察字段中的输入并测试其值:

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

工作演示

setTimeout是有保证的代码将只运行输入完成和值更新。绑定input确保大多数类型的输入都会触发事件,包括按键、复制/粘贴(甚至来自鼠标)和拖放(尽管在这种情况下,后者将不起作用,因为焦点在可拖动对象上,而不是可丢弃)。

注意:在一些较旧的浏览器上,您可能还需要绑定propertychange.


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

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

$("input").each(function() {
    var $this = $(this);
    $(this).data("maxlength", $this.prop("maxlength"));
    $(this).removeAttr("maxlength");
})

这将删除该属性,但将其保存在 中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);
}

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

确实如此,但是代码需要一种方式来指定“下一个输入”是什么——您不能只搜索页面中的任何输入并使用它,因为这种行为可能会导致问题......整体代码很好,只是.next需要适应每个特定情况的选择部分(在这种情况下,调用)(例如,.nextAll如果它们都在同一个 div 中,或者.parent().next().find如果它们都在自己的 div 中,等等)。
2021-04-18 07:14:40
不推荐使用绑定,使用
2021-05-03 07:14:40
@Bingo 根据这个答案input适用于 Firefox 和propertychange其他人,但从那时起事情可能发生了变化(即input现在每个浏览器都支持)。唯一可以确定的方法是在不同的环境中进行测试。(PS 是propertychange,不是propertyChange- 我已经更正了我的答案)
2021-05-04 07:14:40
这是一个不错的选择,但有问题,例如,如果您在不同的 div 中有每个输入不起作用
2021-05-07 07:14:40
你的小提琴工作完美,+1 但是,绑定是propertyChange强制性的吗?即使没有它,它似乎也能正常工作
2021-05-10 07:14:40

您可以使用纯 JavaScript:

演示

用 来检查字符长度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();
    }
}
使用 keyup 功能可能会产生问题,例如,您必须删除文本框中的某个数字,该事件将不允许删除,因为它是按键操作。而是使用 oninput 事件。它会有所帮助
2021-05-17 07:14:40

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

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

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

$(document).ready(function(){
    $('input').keyup(function(){
        if(this.value.length==$(this).attr("maxlength")){
            $(this).next().focus();
        }
    });
});
更新您的代码以获得更好的解决方案 - jsfiddle.net/ssuryar/DVxDA/224 - DEMO
2021-04-27 07:14:40

let otp = document.querySelector('#otp-screen');

for(let pin of otp.children) {
    pin.onkeyup = function() {
        if(pin.nextElementSibling) {
            pin.nextElementSibling.focus();
        }
    }
}
<div class="otp-screen" id="otp-screen">
    <input type="text" placeholder="0" maxlength="1"/> 
    <input type="text" placeholder="0" maxlength="1"/> 
    <input type="text" placeholder="0" maxlength="1"/> 
    <input type="text" placeholder="0" maxlength="1"/> 
</div>

这仅适用于 maxlength 为 1。问题显然不是假设这样的 maxlength。
2021-04-27 07:14:40