为什么一个输入keypress
的代码会运行两次?我试过keypress
、keydown
和event.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)
它返回到第一个变量声明。这是一个问题,因为通过这种方式,变量fimseg
和seguinte
以错误的值开始该循环。
您似乎有语法错误。即使我在你的问题中包含了没有正确编码的});
,我仍然会在我的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捕获当前框,并使用一些简单的逻辑按顺序跳到下一个框。我还使用正则表达式来验证输入。