一个enterkeypress运行JavaScript keypress事件处理程序代码两次
为什么输入一个enterkeypress运行JavaScript keypress事件处理程序代码两次,javascript,Javascript,为什么输入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.substr
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
它返回到第一个变量声明。这是一个问题,因为这样变量
fimseg
和seguinte
以错误的值开始该循环 您似乎有语法错误。即使我包括})
您的问题中没有正确地包装代码,我在Firebug控制台中仍然遇到此错误:
SyntaxError: missing ;
before statement alert("1") <----
语法错误:缺少;
在语句警报(“1”)之前,此行为是否持续,您是否将alert()
替换为console.log()
?示例代码有语法错误。请提供完整的代码,以便任何人都可以重现您的实际错误。它不会触发多次。请参见此处:。但是您到处都缺少分号(在演示中也已修复),我添加了完整代码的更新。修剪后的代码中缺少分号@Halcyon:警报只是我的调试助手,切换块只是因为我无法执行此操作:seguinte=inicio+(fim+1);使用sum而不是concatenate(fim+1),我尝试了seguinte=inicio+(parse(fim)+1);和seguinte=inicio+(parseInt(fim)+1);但是他们抛出了错误,如果我可以使这个和工作,我可以避免开关块和函数可能会工作。。。那个开关块只是因为我不能这样做:seguinte=inicio+(fim+1);使用sum而不是concatenate(fim+1),我尝试了seguinte=inicio+(parse(fim)+1);和seguinte=inicio+(parseInt(fim)+1);但是如果我能使这个和起作用,我就能避免开关块,这个函数很可能会起作用,他们就会抛出错误。@mehrlicht检查一下这个不容置疑的基于您的原始样本创建的小提琴:。一旦添加分号,它就可以正常工作。至于你的新代码,它应该做什么?代码与以前完全不同。你预计会发生什么?请注意,您必须按Ctrl+Enter来运行小提琴,然后在右下角的结果窗口中单击以使用它。当它计算出(focado.value.length==0)是否再次开始表示焦点在下一个输入字段中时。@mehrlicht再次问:您希望发生什么?用文字描述您希望代码执行的操作。(写这些词可能需要很多分钟,甚至一个多小时才能得到正确的解释。没关系!需求比代码更重要!)然后描述发生了什么。(记住要包括你是如何得到这种不良行为的——你还在按Enter键吗?当你按Enter键时哪个控件有焦点?)。我们不能在不知道程序外壳应该做什么的情况下调试它。
SyntaxError: missing ;
before statement alert("1") <----