【发布时间】: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