Предотвращение "Enter" от отправки формы, но разрешить ее по полям textarea (jQuery)

$(window).keydown(function(event){
    if(event.keyCode == 13) {
      event.preventDefault();
      return false;
    }
  });

Вышеупомянутый код, который я получил, который эффективно убивает ключ "enter" как отправителя формы по всей системе, и это именно то, что я хочу. Тем не менее, клавиша ввода также отключена в тегах textarea, которые пользователи могут ударить, чтобы войти в следующую строку. Итак, есть способ изменить приведенный выше код, чтобы обнаружить, что вход поступает из тега textarea, он не запускает event.preventDefault(); линия?

У меня так много форм на всем сайте - их индивидуальное конфигурирование было бы кошмаром и, вероятно, не имеет смысла - там должен быть универсальный способ. Вышеприведенный код запускается на каждой странице сайта, чтобы предотвратить случайные отправки, нажав "enter". enter code here

Ответ 1

Я предпочел бы событие keyup... использовать свойство event.target

$(window).keydown(function(event){
    if((event.which== 13) && ($(event.target)[0]!=$("textarea")[0])) {
      event.preventDefault();
      return false;
    }
  });

демонстрация

Ответ 2

Вы можете попробовать это

$(document).ready(function(){
    $(window).keydown(function(event){
        if(event.keyCode == 13 && event.target.nodeName!='TEXTAREA')
        {
          event.preventDefault();
          return false;
        }
    });
});

Скрипка здесь.

Ответ 3

@3nigma решение будет работать очень хорошо, но вот еще один способ достижения такого поведения:

$(function(){
    $('#myform').find('input,select').keydown(function(event){
        if ( event.keyCode == 13 ){
            event.preventDefault();
        }
    });
});

Ответ 4

$('#form_editar').keypress(function(e) {
    var allowEnter = {"textarea": true, "div": true};
    var nodeName = e.target.nodeName.toLowerCase();

    if (e.keyCode == 13 && allowEnter[nodeName] !== true) {
        e.preventDefault();
    }
});

Я редактирую из @The Alpha немного, я использую div для редакторов wysiwyg:)...

Ответ 5

Это кажется хорошей возможностью использовать объект события и подобный скальпелю подход к этому москиту, а не подход, похожий на пушки.

Другими словами, что-то вроде этого:

...
// Only watch for a bad type of submission when a submission is requested.
$('form .contact-form').submit(function(e){
    // If a submit is requested, and it done via keyboard enter, stop it.
    if ((e.keyCode || e.which) == 13) ? ;){ // Try to use normalized enter key code
        e.preventDefault(); // Prevent the submit.
    }
    // All other mouse actions just go through.
});

Преимущество здесь должно быть относительно очевидным, если вы попадаете в любое место, которое не отправляет форму, этот код не знает, не заботится, не вызывает проблем.

Ответ 6

Я нашел, что это работает лучше всего. Особенно, если вы хотите использовать поведение клавиш ввода в других элементах, чтобы просто не отправить форму обратно. Я просто расширяю ответ на 3nigma.

 $("form").keypress(function (event) {
            if (event.keyCode == 13 && ($(event.target)[0]!=$("textarea")[0])) {
                return false;
            }
        });

Ответ 7

Почему бы просто не заблокировать событие формы submit от запуска?

$('form').submit(function(event){
  event.preventDefault();
});