2014-12-29 2 views
1

В частности, я не хочу использовать уже рекомендованный метод event.preventDefault() при нажатии клавиши ввода, поскольку это нарушает функциональность для каталогов данных, по крайней мере, в Internet Explorer.Как я могу различать нажатие кнопки «Отправить» и нажатие ввести ввод, чтобы отправить форму?

Я пытался что-то вдоль линий

$("#form").submit(function(event){ 
    console.log(event); 
    return false; // Allows me to read the console before the form submits! 
}); 

Чтобы сравнить различия между событиями (нажав кнопку отправки против удара клавишу Enter), и не похоже, чтобы быть чем-то очевидным. Я бы ожидал, что у последнего будет event.keyCode, но это не тот случай.

Долгосрочное обходное решение, о котором я могу думать, похоже, состоит в том, чтобы удалить мою кнопку отправки и заменить ее обычной кнопкой, клик которой связан с отправкой формы. Но в этом случае мне придется записывать нажатия клавиш ввода в вводах и обрабатывать отправку формы с нуля. Уродливый, но выполнимый. Опять же, я делаю NOT хочу применить любые preventDefault() s, если я могу помочь.

+4

Почему вы должны различать между нажатием ввода и нажав на кнопку отправки ? Знание этого может помочь нам придумать решение. –

+0

@KevinB, у меня есть форма, где я не хочу, чтобы ключ ввода отправлял форму. * (Да, я понимаю, что есть значительное количество людей, которые не хотят прерывать собственные операции формы) , Обычная рекомендация - просто применить event.preventDefault(), когда код ключа (или event.which) равен 13. Так что мой код прямо сейчас предотвращаетDefault(), но это означает, что ключ ввода не может использоваться для выбора элемента из datalist в Internet Explorer. * В некоторых входах клавиша ввода удара является ярлыком для других операций (например, при вводе «14-17», добавляет пронумерованные строки в таблицу) – Sheffie

+0

Я бы предложил использовать событие click на кнопку отправки и удалить форму тег, предполагая, что вы отправляете форму с помощью ajax. Это приведет к тому, что нажатие кнопки ввода больше не приведет к отправке без предупреждения поведения по умолчанию. Если вы не используете ajax, у вас все еще может быть скрытая форма, в которую вы просто перемещаете свои входы до вызова метода отправки. –

ответ

2

Своеобразный Hacky решение, но вы можете связать обработчик события к click на кнопку submit, вместо submit в #form. Затем вы можете проверить, были ли ненулевые координаты, связанные с событием. Если это так, нажата кнопка submit, если нет, нажата клавиша ввода. например

$("input[type='submit']").click(function(event){ 
    if (event.screenX === 0) alert("You hit the enter key!"); 
    else alert("You clicked the submit button!"); 

    return false; // Allows me to read the console before the form submits! 
}); 

JSFiddle Here

+0

Это интересно! Я не рассматривал дело с условием внутри события click ... честно, потому что я не знал регистров событий кликов, когда enter попадает в другой вход (я ни разу не нажал кнопку!).Это не имеет никакого условия для того, когда пробел попадает и кнопка выбрана, но это легко добавить. – Sheffie

+0

Двойной комментарий: Это не безупречно, не так ли? Что делать, если кто-то случайно нажал (0, Y)? – Sheffie

+0

Да, точно. Вот почему я сказал, что это хакки. Теоретически, даже если вы проверите против 'event.screenX === 0' AND' event.screenY === 0', теоретически кнопка отправки может быть помещена точно (0, 0) - (screenX, screenY), и событие может происходить именно в том месте, где нажата кнопка отправки. Таким образом, вам просто нужно убедиться, что кнопка никогда не была (0, 0) – bowheart

0

Вы можете использовать mousedown событие вместо этого, который не будет срабатывать, нажав клавишу ввода

$('input[type="submit"]').on('mousedown', function() { 

}); 
Смежные вопросы