页面包含多个表单,应用程序将无法确定(或者,我被告知)要执行哪个表单。
当您在输入控件上按 enter 时,浏览器会在该表单中查找第一个提交按钮并模拟单击它。在多个按钮的情况下,第一个将在键盘输入时按下(这绝不是一成不变的,浏览器可能会偏离这一点)。
如果您有两个表单,则获得按键的表单将按下第一个提交按钮。因此,您实际上并不需要对此进行任何特殊处理。你只需要停止挡路。
您可以在代码中以表格形式模拟这一点:
$( '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()
是一个全局函数,但是当它被调用时,它的 context ( this
) 将是元素,你可以这样做submit(e){ this.form.submit(); }
。
应用程序的设计没有提交按钮(如 input type="submit"),相反,设计人员已经进行了 onclick 处理。
在我看来,这听起来像是设计师没有完全理解 DOM / 表单事件,并且正在解决这个问题。另一个可能的原因可能是程序很旧,并且是在这些东西不像今天那样稳定或没有正确记录的时候重新设计的。
替换这个:
<form action="/login/" method="POST">
[...]
<input type="button" value="LOGIN" name="btnLoginOk" onclick="submit();">
</form>
有了这个:
<form action="/login/" method="POST">
[...]
<input type="submit" value="LOGIN" name="btnLoginOk">
</form>
然后向所有需要它的表单添加一个键处理程序,如果满足某些条件,它会检测并禁止输入(对于您实际上确实想要禁用它的表单)。
// for all forms that POST that have 2+ submit buttons
$( 'form[method=post]:has(:submit:eq(1))' ).bind('keydown', function(e){
// if target is an enter key, input element, and not a button
if ( e.keyCode == 13 && e.target.tagName == 'INPUT' &&
!/^(button|reset|submit)$/i.test( e.target.type ) ) {
return false; // kill event
}
});
或者更好的是:使用知道如何为您执行此操作的表单验证库(或 jQuery 插件)。