2010-01-13 42 views
1

当IE中的onchange事件返回false时,IE焦点停留在该输入框上。无论如何,在Firefox中,焦点始终会转移到下一个字段。在IE和FireFox上的Javascript onchange不同

HTML:

input name="seminar_donation" type="text" id="seminar_donation" 
onchange="return CheckTotal(this);" 

的JavaScript:

function CheckTotal(inputbox) { 
    if (isNaN(parseInt(inputbox.value))) { 
     alert("Please enter only digits 0-9"); 
     inputbox.focus(); 
     return false; 
    } 
    return true; 
} 

在IE中我甚至都不需要inputbox.focus()不幸的是似乎没有做任何事情在Firefox保留焦点在错误的输入框中。我如何让Firefox留在输入框上?

回答

-1

您是否尝试在onchange属性中添加“return”?即

<input name="seminar_donation" type="text" id="seminar_donation" onchange="return CheckTotal(this);"> 

我不完全确定这会工作,但值得一试吗?

编辑:为了澄清,我不确定的原因是,我通常会以不同的方式处理这种情况,并在javascript中绑定事件处理程序而不是html。

+0

噢,是的,我试着用回报,没有区别。 – 2010-01-13 16:43:27

+0

我将源代码改为“返回CheckTotal(this)”为其他查看者的好处 – 2010-01-13 16:54:36

1

尽管这个问题稍有不同,但似乎不再出现在这里的回应暗示了“时机”问题。所以,我用Google搜索“超时”,发现迈克·兰金的博客从2005年这让我改变焦点()来解决这个问题:

var t= setTimeout('document.getElementById("seminar_donation").focus()',1); 

所以会发生什么是火狐还是继续到下一个区域,但1毫秒稍后,此代码将焦点设置回错误字段。这是有道理的,因为如果下一个字段有一个遗忘事件,当超时迫使焦点回来时,onblur将被触发。但它是Firefox中一个长期存在的bug的解决方法。

+0

idem comment like @ Dave.Sol – helios 2010-01-13 17:03:00

+0

您甚至不需要超时长度为1,它可以是0 - 计时器执行已排队直到线程空闲,所以当前触发的事件列表具有优先级 – 2010-01-13 17:08:35

1
setTimeout('document.getElementById("seminar_donation").focus()',1); 
+0

我假设你回答这个是因为Firefox首先调用你的事件处理程序,而NEXT关注下一个输入,重写处理程序中的focus()。是说javascript在稍后执行(1毫秒),Javascript是单线程的,所以它就像“在完成所有这些之后调用”一样。 – helios 2010-01-13 17:02:13

+0

@helios,是的,就像你描述的那样。 – 2010-01-13 17:04:47

相关问题