【问题标题】:recieving two enters when handling enter keypress event处理回车按键事件时接收两个回车
【发布时间】:2015-10-29 14:29:41
【问题描述】:

我正在尝试根据一些规则使光标在代码栏上跳转或手动代码输入到下一个字段(下一个字段不一定是下一个字段...)

按回车触发该功能(代码栏的末尾也给了我需要的回车)。

问题在于,当只提交一个回车键(一个手动或一个带有代码栏)时,该函数的工作方式就好像它在执行过程中得到了第二个...... 它将重新评估哪个输入处于活动状态。 我什至插入了一些警报消息,发现它确实运行了两次!

无法弄清楚我使用不同的方法从头开始重写了代码,但结果是相同的。同样的错误。

我也试过 e.preventdefault() 但不是这样。

这里是两个版本的代码:

$(document).keypress(function (e) {
    if (e.which == 13) {
        var focado = document.getElementById(document.activeElement.id);
        var fim = focado.id.substring(1);
        var inicio = focado.id.substring(0, 1);

        var anterior = inicio + (fim - 1);

        switch (fim) {
            case "1":
                fimseg = "2"
            case "2":
                fimseg = "3"
            case "3":
                fimseg = "4"
            case "4":
                fimseg = "5"
        }
                    var seguinte = inicio + (fimseg);

                    if (seguinte == "p5") {
                          seguinte = "a1";
                    }

        if (focado.value.length == 0) {

            if (fim != 1) {

                document.getElementById(focado.id).focus()
            } else {

                if (anterior.value.length == 0) {

                    document.getElementById(anterior).focus()
                } else {

                    if (seguinte == "a5") {

                        document.getElementById("btnSubmit").click();
                    } else {

                        document.getElementById(seguinte).focus()
                    }
                }
            }
        } else {

            if (focado.value.length < 7 || (isNaN(focado.value))) {

                document.getElementById(focado.id).innerHtml = "";
                if (anterior.value.length == 0) {

                    document.getElementById(anterior).focus()
                } else {

                    document.getElementById(focado).focus()
                }
            } else {

                if (fim != 1) { //não é p1 nem a1


                    if (anterior.value.length == 0) {

                        document.getElementById(anterior).focus()
                    } else {

                        if (seguinte == "a5") {

                            document.getElementById("btnSubmit").click();
                        } else {

                            document.getElementById(seguinte).focus()
                        }
                    }
                } else {


                    document.getElementById(seguinte).focus()
                }
            }
        }
    } //não é enter
}); //fim função

和另一个有相同错误的版本

$(document).keypress(function (e) {
if (e.which == 13) {

    var focado  = document.getElementById(document.activeElement.id);

    if (focado.value.length >= 7) {

        switch (focado.id) {

            case "p4":

                document.getElementById("a1").focus();
                break;

            case "p3":
                document.getElementById("p4").focus();
                break;

            case "p2":
                document.getElementById("p3").focus();
                break;

            case "p1":

                document.getElementById("p2").focus();

        }

    } else {//menos de 7 algarismos

        var fim = focado.id.substring(1);
        var inicio = focado.id.substring(0, 1);
        var anterior = inicio + (fim - 1);

        if (fim != 1) {//não é p1 nem a1

            if (focado.value.length == 0) {//em branco




                if (document.getElementById(anterior).value.length == 0) {//se anterior em branco

                    document.getElementById(anterior).focus();//então foca no anterior - devia haver um get focus sempre que fosse num vazio ia para o anterior
                } else {//anterior com dados
                    if (document.getElementById(anterior).value.length >= 7) {

                        switch (inicio) {
                            case "p"://se anterior com dados é p1
                                document.getElementById("a1").focus();

                                break;

                            case "a"://se anterior com dados é a1
                                document.getElementById("btnSubmit").click();
                                break;
                        }//final switch

                    } else {//se anterior tem menos de 7 algarismos
                        document.getElementById(anterior).value = "";
                        document.getElementById(anterior).focus();

                    }



                }



            }//final se focado em branco

        }//final não é p1 nem a1

    }//final menos de 7 algarismos

}//não é enter

});

也许用不同的键码或不同的事件处理程序捕获输入? 谢谢

更新: 输入框有:“p1”、“p2”、“p3”、“p4”、“a1”、“a2”、“a3”、“a4”,还有一个“btnSubmit”按钮

【问题讨论】:

  • 当 p1 处于活动状态时触发 enter 时,它应该将焦点跳转到 p2。然后,如果在 p2 中触发第二次输入,而 p2 为空,则焦点应跳转到 a1。发生的情况是代码根据在 p1 中触发的输入正确运行并专注于 p2,但立即重新关注 a1,就好像触发了第二个输入一样。在第二个代码中,它评估第一个 if 为 true,长度 >=7,并将焦点标识为 p1 并重新聚焦在 p2 上,但也在 else 语句 (

标签: javascript html


【解决方案1】:

您可能会发现使用keyDown 会更好。它被设计为只触发一次。 keyPressed 可能会重复。

https://stackoverflow.com/a/15310690/962289

另外,从你的问题中不确定,但如果你在两个不同的地方有$(document).keypress,它应该同时运行它们。你确定他们没有互相干扰吗?

【讨论】:

  • 使用 keydown 问题仍然存在。只有一个代码。我发布了两个具有相同错误的版本。
【解决方案2】:

我的代码有一些错误。

这样就可以了:

$(document).keypress(function (e) {
    if (e.which == 13) {
        var focado = document.getElementById(document.activeElement.id);
        var fim = focado.id.substring(1);
        var inicio = focado.id.substring(0, 1);
        var fimseg = fim;
        var anterior = inicio + (fim - 1);

        switch (fim) {
            case "1":
                fimseg = "2"
                break;
            case "2":
                fimseg = "3"
                break;
            case "3":
                fimseg = "4"
                break;
            case "4":
                fimseg = "5"
                break;
        }
        var seguinte = inicio + (fimseg);

        if (seguinte == "p5") {
            seguinte = "a1";
        }

        if (focado.value.length == 0) {

            if (fim != 1) {

                document.getElementById(focado.id).focus()
            } else {

                if (document.getElementById(anterior).value.length == 0) {

                    document.getElementById(anterior).focus()
                } else {

                    if (seguinte == "a5") {

                        document.getElementById("btnSubmit").click();
                    } else {

                        document.getElementById(seguinte).focus()
                    }
                }
            }
        } else {
                            if (focado.value.length < 7 || (isNaN(focado.value))) {

                document.getElementById(focado.id).innerHtml = "";
                if (anterior.value.length == 0) {

                    document.getElementById(anterior).focus()
                } else {

                    document.getElementById(focado.id).focus()
                }
            } else {

                if (fim != 1) { //não é p1 nem a1


                    if (document.getElementById(anterior).value.length ==0) {

                        document.getElementById(anterior).focus()
                    } else {

                        if (seguinte == "a5") {

                            document.getElementById("btnSubmit").click();
                        } else {

                            document.getElementById(seguinte).focus()

                        }
                    }
                } else {

                    document.getElementById(seguinte).focus()

                }
            }
        }
    } //não é enter
}); //fim função

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多