页面包含多个表单,应用程序无法确定(或者,据我所知),哪个表单是操作的。
当你在一个输入控件上按下回车键时,浏览器会查找该表单中的第一个提交按钮,并模拟点击它。如果有多个按钮,则在键盘回车时将按下第一个按钮(这并不是铁板钉钉的规定,浏览器可能会有所偏差)。
如果您有两个表单,则被按键触发的表单将被处理并且 它的 第一个提交按钮将被按下。因此,您不需要特殊处理这个问题。只需停止阻碍即可。
您可以在代码中模拟这一过程:
$( 'form' ).bind ('keypress' , function (e ){
if ( e.keyCode == 13 ) {
$( this ).find ( 'input[type=submit]:first' ).click ();
}
});
或窗口(用于大致展示正在发生的事情):
$( window ).bind ('keypress' , function (e ){
if ( $( e.originalTarget ).is ( ':input' ) && e.keyCode == 13 ) {
$( e.originalTarget )
.closest ( 'form' )
.find ( 'input[type=submit]:first' )
.click ();
}
});
当然前提是事件上没有调用.preventDefault()
。
总之,如果你有该事件,你可以从中推断出它来自哪个元素,因此知道它属于哪个表单。即使在这种情况下:
< input type= "button" value = "LOGIN" name= "btnLoginOk" onclick= "submit();">
在这里,submit()
是一个全局函数,但当它被调用时,它的上下文(this
)将是元素,并且您可以执行submit(e){ this.form.submit(); }
。
该应用程序的设计使提交按钮(如 )不可见,而是使用onclick处理。
对我来说,这听起来像设计师并不完全理解DOM/表单事件,并且采取了绕远路的方式来解决问题。另一个可能的原因是该程序很旧,是在这些事情尚未像今天这样稳定或正确记录的时候设计的。
请替换为:
<form action ="/login/" method="POST" >
[...]
<input type ="button" value="LOGIN" name="btnLoginOk" on click="submit();" >
</form>
用这个:
<form action ="/login/" method="POST" >
[...]
<input type ="submit" value="LOGIN" name="btnLoginOk" >
</form>
然后对所有需要的表单添加一个按键处理程序,如果满足某些条件,则检测并抑制按下“回车”键(对于你真正想禁用此功能的表单)。
$( 'form[method=post]:has(:submit:eq(1))' ).bind ('keydown' , function (e ){
if ( e.keyCode == 13 && e.target .tagName == 'INPUT' &&
!/^(button|reset|submit)$/i .test ( e.target .type ) ) {
return false ;
}
});
或者更好的方法是:使用一个表单验证库(或jQuery插件),它知道如何为您执行此操作。