I have inherited a web application where the usual ability to press return in any of the input fields has been disabled for the very good reason that the page contains multiple
page contains multiple forms, and the application would not be able to determine (or, so I am told) which form to action.
When you press enter on an input control the browser seeks the first submit button in that form and simulates a click on it. In the case of multiple buttons, the first one will be pressed on keyboard enter (this is by no means written in stone and browsers may deviate from this).
If you have two forms, the one that got a keypress will have it's first submit button pressed. Therefore you don't really need any special handling of this. You just have to stop being in the way.
You can simulate this in code, on a form:
$( 'form' ).bind('keypress', function(e){
if ( e.keyCode == 13 ) {
$( this ).find( 'input[type=submit]:first' ).click();
}
});
Or window (for a demonstration of what is roughly happening):
$( window ).bind('keypress', function(e){
if ( $( e.originalTarget ).is( ':input' ) && e.keyCode == 13 ) {
$( e.originalTarget )
.closest( 'form' )
.find( 'input[type=submit]:first' )
.click();
}
});
Assuming of course that .preventDefault()
has not been called on the event.
Bottom line: If you have the event you can divine from it what element it came from and therefore which form it belongs to. Even in this case:
Here submit()
is a global function, but when it is called, its context (this
) will be the element and you may do submit(e){ this.form.submit(); }
.
The application has been designed so there are no submit buttons (as in input type="submit") and, instead, the designers have gone for onclick handling.
This sounds to me like the designer doesn't fully comprehend DOM / form events and is going the long way around the problem. Another likely reason could be that the program is old and was designed back when these things weren't quite as stable, or properly documented, as they are today.
Replace this:
With this:
Then add a key handler to all forms that need it, that detects and suppresses enter if some condition is met (for the forms that you actually do want to disable this on).
// 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
}
});
Or better still: Use a form validation library (or jQuery plugin) that knows how to do this for you.