страница содержит несколько форм, а
приложение не сможет
определить (или, как мне сказали), который
Форма к действию.
Когда вы нажимаете ввод на элементе управления вводом, браузер ищет первую кнопку отправки в этой форме и имитирует щелчок по ней. В случае нескольких кнопок первая будет нажата при вводе с клавиатуры (это ни в коем случае не написано на камне, и браузеры могут отклоняться от этого).
Если у вас есть две формы, та, которая получила нажатие клавиши, будет иметь , это первая нажатая кнопка отправки. Поэтому вам не нужно особой обработки этого. Вы просто должны перестать мешать.
Вы можете смоделировать это в коде, на форме:
$( '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(); }
.
Приложение разработано таким образом, что нет кнопок отправки (как при вводе
type = "submit"), и, вместо этого, дизайнеры пошли на обработку по клику.
Для меня это звучит так, будто дизайнер не в полной мере понимает события 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), которая знает, как это сделать.