3

Я имел Jquery/HTML код, подобный этому:Форма представлен дважды, используя подать() на KeyUp

<form action="/SomeAction" method="post"> 
    <input id="my-textbox" type="text" placeholder="Write something and press enter to continue..." /> 
</form> 

<script type="text/javascript"> 
$(function() { 
    $('#my-textbox').keyup(function(e) { 
     var $textbox = $(this); 
     if ($textbox.val().length > 0 && e.keyCode == 13) { 
      $textbox.parent('form').submit(); 
     } 
    }); 
}); 
</script> 

Цель состояла в том, чтобы автоматически представить форму, когда пользователь нажал клавишу «Enter». Я регулярно использую Firefox, поэтому все было в порядке для меня, пока я не проверил в Google Chrome и Internet Explorer.

Когда я нажал клавишу Enter в более поздних браузерах, иногда я получал форму, представленную дважды. Это было легко заметить, потому что я получил бы дубликаты записей в моей БД, и я увижу два POST с использованием Fiddler.

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

Мои вопросы:

Почему не браузеры бойко предотвратить вторую форму пост (например, Firefox сделал в моем тестировании)?

Должен ли я ожидать такого поведения во всех основных браузерах на всех платформах?

Есть ли способ улучшить этот код, поэтому я выполняю отправку с использованием JavaScript, но не получаю форму, представленную дважды?

+0

попытаться блокировании событие по умолчанию. – Christoph

+1

У вас есть форма, представленная на клавиатуре. Вы запрашиваете, чтобы JavaScript передавал форму каждый раз, когда в текстовом поле происходит событие keyup. Вы получаете именно то, о чем просите. –

+1

Я не эксперт по jQuery, но я бы привязал ваш код к событию отправки в форме (или зацепил функцию, блокирующую его поведение по умолчанию) – Eineki

ответ

5

Почему браузеры не избегают второго сообщения формы (как это сделал Firefox в моем тестировании)?

Это поведение по умолчанию. Что делать, если у вас не было вашего скрипта, и поведение по умолчанию было таким, чтобы форма не была POST на введите.

Должен ли я ожидать такое поведение во всех основных браузерах на всех платформах?

Да

Есть ли способ улучшить этот код, чтобы я выполнить отправить с помощью JavaScript, но не получает форму, представленные в два раза?

Используйте глобальную переменную mutex и задайте ее после отправки POST-сообщений формы, проверяя ее на последующих POST-сообщениях для проверки. Или верните false из обработчика keyup и остановите распространение события.

1

Добавить переменную boolean, которая будет установлена ​​в true после первого отправки и использования этой переменной в вашем условии if. Это предотвратит случайный двойной щелчок.

Вы также должны предотвратить двойную отправку в бэкэнде приложения (многие веб-фреймворки имеют встроенный механизм для этого, легко придумать собственное решение).

+0

Я пробовал, но в любом случае у меня есть две записи формы: один из моего кода и один из события по умолчанию в браузере. – Meryovi

+0

Возвратите false, когда вы закончите в своем if. –

4

Некоторые браузеры будут интерпретировать кнопку ввода как отправку, если в форме есть только одна кнопка. Только return false в вашей функции, чтобы предотвратить поведение по умолчанию от отправки формы.

if ($textbox.val().length > 0 && e.keyCode == 13) { 
    $textbox.parent('form').submit(); 
    return false; 
} 
+0

Он делает это в keyup, поэтому слишком поздно предотвращать дефолт. См. Пример @ Шейха. – scottheckel

+0

не соответствует действительности. http://stackoverflow.com/questions/2037910/possible-to-prevent-enter-from-submitting-a-form-in-javascript-from-certain-inpu – jbabey

+0

yes true. Я даже включил предупреждение по умолчанию. http://jsfiddle.net/4JcfB/ – scottheckel

2

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

$(function() { 
    $('#my-textbox').keydown(function(e){ 
     if(e.keyCode==13) e.preventDefault(); 
    }); 

    $('#my-textbox').keyup(function(e) { 
     e.preventDefault(); 
     var $textbox = $(this); 
     if($textbox.val().length > 0 && e.keyCode == 13) { 
      $textbox.parent('form').submit(); 
     } 
    }); 
});​ 

A simple test.

+0

Очень приятно, что мой код для события keydown тоже работает. – Meryovi

+0

Надеюсь, что у вас это есть. –

Смежные вопросы