一次回车键按下会运行两次JavaScript键按下事件处理程序代码



为什么一个输入keypress的代码会运行两次?我试过keypresskeydownevent.preventdefault()都没有用。

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

        alert("focado " + focado.id + " fim " + fim + " inicio " + inicio + " fimseg " + fimseg + " anterior " + anterior);
    }
});

只有在给出这3条消息两次之后,它才会继续执行剩余的代码(未显示)。

更新:

这是完整的程序:

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

        switch (fim) {
            case "1":
                fimseg = "2"
                break;
            case "2":
                fimseg = "3"
                break;
            case "3":
                fimseg = "4"
                break;
            case "4":
                fimseg = "5"
                break;
        }
      seguinte = inicio + (fimseg);
        if (seguinte == "p5") {
            seguinte = "a1";
        }
        alert("focado " + focado.id + " fim " + fim + " inicio " + inicio + " fimseg " + fimseg + " anterior " + anterior + " seguinte " + seguinte);
        if (focado.value.length == 0) {//enter no vazio
           alert("aqui")
            if (fim != 1) {//se não é p1 nem a1
                alert("1")
                if (document.getElementById(anterior).value.length == 0) {//se anterior vazio
                    alert("2")
                    document.getElementById(anterior).focus()
                } else {//se anterior não vazio
                    alert("3")
                    if (seguinte == "a5") {//se é a4
                        alert("4")
                        document.getElementById("btnSubmit").click();
                    } else {//se nºao é a4
                        alert("5")
                        document.getElementById(seguinte).focus()
                    }
                }
            } else {//é p1 ou a1
                document.getElementById(focado.id).focus()  //foca no próprio
            }
        } 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

当它到达时

if (focado.value.length == 0) 

它返回到第一个变量声明。这是一个问题,因为通过这种方式,变量fimsegseguinte以错误的值开始该循环。

您似乎有语法错误。即使我在你的问题中包含了没有正确编码的});,我仍然会在我的Firebug控制台中收到这个错误:

SyntaxError: missing ;
before statement alert("1") <----

尝试在创建示例http://jsfiddle.net/.那么我们可以帮你更多。

编辑:

好的,我看了你的小提琴。根据你的评论,我认为主要问题是:

  • 这听起来像是某种客户端验证脚本。但是,如果输入是有效的或无效的,您不能确切地解释它应该做什么。我假设你想要一条弹出消息。我认为将"跳转到下一个空框"行为与"验证并提交值"行为区分开来更有意义。所以我在两个不同的处理程序中完成了这项工作
  • 如果您将注意力集中在按钮上(例如,通过切换到该按钮,或按下该按钮,但在释放鼠标按钮之前将鼠标移开),然后按Enter,则会出现错误,因为该按钮的ID与您为文本框设置的ID的预期模式不匹配。因此,我更改了按钮,使其作用与第一个(左上角文本框)上的Enter键相同。我调用event.stopPropagation()来防止它冒泡到文档Enter处理程序中
  • 我更新了Enter处理程序,使其只处理文本框,因为如果只关注文档正文或按钮,然后按Enter键,就会出现错误

以下是更新后的工作代码:https://jsfiddle.net/op96m1Ln/2/.我使用parseInt捕获当前框,并使用一些简单的逻辑按顺序跳到下一个框。我还使用正则表达式来验证输入。

最新更新