Отправка формы на «Enter» с помощью jQuery?

427

У меня есть стандартная форма входа в систему - текстовое поле электронной почты, поле пароля и кнопка отправки в проекте AIR, использующем HTML / jQuery. Когда я нажимаю Enter на форме, все содержимое формы исчезает, но форма не отправляется. Кто-нибудь знает, если это проблема Webkit (Adobe AIR использует Webkit для HTML), или я что-то сделал?

Я старался:

$('.input').keypress(function (e) {
  if (e.which == 13) {
    $('form#login').submit();
  }
});

Но это ни остановило очистку поведения, ни отправило форму. С формой не связано никаких действий - может ли это быть проблемой? Могу ли я добавить в действие функцию javascript?

быть холленбеком
источник
3
У вас действительно есть атрибут class = "input" на вашем <input ...? Похоже, это должно быть $ ('input').
Keypress
Классы генерируются программно CMS. Однако, кроме этого, выбор значения $ ('input') повлияет на каждый ввод на странице, независимо от того, хотел я поведение или нет. Извините, это оскорбляет ваши чувства.
быть Холленбеком
15
Чувства не обижаются ни в малейшей степени. Просто подумал, что это могло быть упущением, которое привело к проблеме. Продолжать.
NexusRex
1
К вашему сведению: ваш принятый ответ не совсем точен. Обратитесь к моему ответу ниже.
NoBrainer

Ответы:

399
$('.input').keypress(function (e) {
  if (e.which == 13) {
    $('form#login').submit();
    return false;    //<---- Add this line
  }
});

Посмотрите на этот ответ о переполнении стека : event.preventDefault () против возврата false

По существу, «возвращение ложным» это то же самое , как вызов e.preventDefaultи e.stopPropagation().

NoBrainer
источник
3
Обратите внимание, что они не одинаковы. IE8 не имеет e.preventDefault. Для IE8 используйте event.returnValue = false;
Мбокил
8
@mbokil За исключением того, что при использовании jQuery то же самое в IE8. и IE7. И IE6.
Кевин Б.
Если вы хотите сначала ввести в поля ввода, поставьте «return false;» внутри оператора if.
Juni Brosas
173

Кроме того, чтобы вернуть ложь, как упоминал Джейсон Коэн. Возможно, вам также придется предотвратить дефолт

e.preventDefault();
bendewey
источник
13
как сказал @NoBrainer, это неправильно: return falseв событии, управляемом jQuery, автоматически вызывается e.preventDefault ()
Риккардо Галли
83

Не знаю, поможет ли это, но вы можете попытаться смоделировать нажатие кнопки «Отправить» вместо прямой отправки формы. У меня есть следующий код в производстве, и он отлично работает:

    $('.input').keypress(function(e) {
        if(e.which == 13) {
            jQuery(this).blur();
            jQuery('#submit').focus().click();
        }
    });

Примечание: jQuery ('# submit'). Focus () заставляет кнопку анимироваться при нажатии клавиши ввода.

karim79
источник
2
Прекрасно работает, но мне пришлось добавить «вернуть ложь»; предотвратить двойную форму подачи.
code90
Рабочая | Посмотрите МНОГО результатов, таких как этот разговор о триггере, sendkey и т. Д., До, бла ..., но это единственное, что мне подходит, и действительно нажмите кнопку. Не отправлять (). Таким образом, фокус был в функциях focus (). Click (). БЛАГОДАРЮ ВАС.
m3nda
Работает, но мне пришлось поместить этот код в: $ (document) .ready (function () {...
shasi kanth
61

Вернитесь, falseчтобы предотвратить продолжение нажатия клавиши.

Джейсон Коэн
источник
30

Есть ли какая-то причина, по которой вам нужно подключиться и проверить ключ ввода?

Не могли бы вы просто добавить

<input type="submit" /> 

к вашей форме и естественно ли она будет отправлена ​​при нажатии Enter? Вы даже можете затем перехватить действие формы onsubmitи вызвать оттуда функцию проверки, если хотите ...

Вы даже можете использовать в onsubmitкачестве теста, чтобы увидеть, отправляется ли ваша форма, но она не будет работать, если вы позвоните form.submit().

Зак Человек
источник
1
Полностью согласен. Я всегда предпочел бы использовать встроенную функциональность браузера (входные данные типа = отправка нативно реагируют на нажатие клавиши ввода), а не добавлять дальнейшие скриптовые файлы.
Аарон
1
Проблема в том, что, если вы делаете Ajax, и нет фактической обратной передачи на сервер, но вы хотите, чтобы пользовательский интерфейс вел себя так, как ожидает пользователь?
Devlord
В самом деле ... Я упустил все return false;это.
Devlord
14

Вот способ сделать это как плагин JQuery (на случай, если вы захотите повторно использовать эту функциональность):

$.fn.onEnterKey =
    function( closure ) {
        $(this).keypress(
            function( event ) {
                var code = event.keyCode ? event.keyCode : event.which;

                if (code == 13) {
                    closure();
                    return false;
                }
            } );
    }

Теперь, если вы хотите украсить <input>элемент такой функциональностью, это так просто:

$('#your-input-id').onEnterKey(
    function() {
        // Do stuff here
    } );
bvaughn
источник
12

Вы также можете просто добавить onsubmit="return false"код формы на странице, чтобы предотвратить поведение по умолчанию.

Затем подключите ( .bindили .live) submitсобытие формы к любой функции с jQuery в файле javascript.

Вот пример кода, чтобы помочь:

HTML

<form id="search_form" onsubmit="return false">
   <input type="text" id="search_field"/>
   <input type="button" id="search_btn" value="SEARCH"/>
</form>

Javascript + JQuery

$(document).ready(function() {

    $('#search_form').live("submit", function() {
        any_function()
    });
});

Это работает с 2011-04-13, с Firefox 4.0 и jQuery 1.4.3

GERV
источник
Это не работает в Chrome. В любом случае представим.
Марсело Агимовель
5

Это мой код:

  $("#txtMessage").on( "keypress", function(event) {
    if (event.which == 13 && !event.shiftKey) {
        event.preventDefault();
        $("#frSendMessage").submit();
    }
    });
Hoàng Vũ Tgtt
источник
4

Также, чтобы обеспечить доступность, вы должны использовать это, чтобы определить ваш код ключа:

c = e.which ? e.which : e.keyCode;

if (c == 13) ...
Логан Серман
источник
3

Просто добавление для легкой реализации. Вы можете просто создать форму, а затем скрыть кнопку отправки:

Например:

<form action="submit.php" method="post">
Name : <input type="text" name="test">
<input type="submit" style="display: none;">
</form>
Джоэм Маранан
источник
@cebirci а какая у тебя версия хрома? Я тестировал с ноутбуков на ПК, и мой код просто работает. Попробуйте загрузить новейший хром, прежде чем пометить его в моем ответе.
Джоэм Маранан
2

Сейчас пользуюсь

$("form").submit(function(event){
...
}

Сначала я добавил обработчик событий к кнопке отправки, которая выдала мне ошибку.

faebser
источник
1

Сегодня я обнаружил, что событие нажатия клавиши не срабатывает при нажатии клавиши Enter, поэтому вы можете вместо этого переключиться на keydown () или keyup ().

Мой тестовый скрипт:

        $('.module input').keydown(function (e) {
            var keyCode = e.which;
            console.log("keydown ("+keyCode+")")
            if (keyCode == 13) {
                console.log("enter");
                return false;
            }
        });
        $('.module input').keyup(function (e) {
            var keyCode = e.which;
            console.log("keyup ("+keyCode+")")
            if (keyCode == 13) {
                console.log("enter");
                return false;
            }
        });
        $('.module input').keypress(function (e) {
            var keyCode = e.which;
            console.log("keypress ("+keyCode+")");
            if (keyCode == 13) {
                console.log("Enter");
                return false;
            }
        });

Вывод в консоль при наборе «A Enter B» на клавиатуре:

keydown (65)
keypress (97)
keyup (65)

keydown (13)
enter
keyup (13)
enter

keydown (66)
keypress (98)
keyup (66)

Во второй последовательности вы видите, что «нажатие клавиши» отсутствует, но нажатие / отпускание клавиши зарегистрировано и код регистрационной клавиши «13». Согласно документации jQuery для функции keypress () :

Note: as the keypress event isn't covered by any official specification, the actual behavior encountered when using it may differ across browsers, browser versions, and platforms.

Протестировано на IE11 и FF61 на Server 2012 R2

Piemol
источник
0

В кодах HTML:

<form action="POST" onsubmit="ajax_submit();return false;">
    <b>First Name:</b> <input type="text" name="firstname" id="firstname">
    <br>
    <b>Last Name:</b> <input type="text" name="lastname" id="lastname">
    <br>
    <input type="submit" name="send" onclick="ajax_submit();">
</form>

В кодах Js:

function ajax_submit()
{
    $.ajax({
        url: "submit.php",
        type: "POST",
        data: {
            firstname: $("#firstname").val(),
            lastname: $("#lastname").val()
        },
        dataType: "JSON",
        success: function (jsonStr) {
            // another codes when result is success
        }
    });
}
mghhgm
источник
1
Пожалуйста, не публикуйте одинаковые ответы на несколько вопросов. Отправьте один хороший ответ, затем проголосуйте / пометьте, чтобы закрыть другие вопросы как дубликаты. Если вопрос не является дубликатом, адаптируйте свои ответы на вопрос.
Пол Руб 21
@PaulRoub мой ответ имеет некоторую разницу с другим.
mghhgm
Чем этот ответ отличается от этого или этого ?
Пол Руб 21
@PaulRoub У меня есть эта проблема, и сначала поищите в Google. На этих страницах расскажу об этой проблеме, но не просто. Когда я найду лучший ответ, я решил поделиться этим на страницах, о которых говорят пользователи, чтобы помочь пользователям при поиске, см. Мой ответ на некоторых похожих страницах, связанных со стековым потоком.
Мммм
1
этот ответ вообще не связан с вопросом
Золтан Суле
-4

Попробуй это:

var form = document.formname;

if($(form).length > 0)
{
    $(form).keypress(function (e){
        code = e.keyCode ? e.keyCode : e.which;
        if(code.toString() == 13) 
        {
             formsubmit();
        }
    })
}
nigitza
источник
9
Это смешивает jquery с ванильным javascript неудобным способом и включает в себя действительно странный актерский состав, который просто сбивает с толку
moopet