Форма, отправленная дважды в Chrome/Safari

Я стремлюсь выполнить сообщение канонической формы, но следующее отправляет серверу дважды в Chrome и Safari (но ведет себя как ожидалось в Firefox):

<form id="create-deck-form" action="/decks/create" method="post">
  <fieldset>
    <legend>Create new deck</legend>
    <label for="deck-name-field">Name</label>
    <input id="deck-name-field" name="deck-name-field" type="text" value="" maxlength="140" />

    <label for="tag-field">Tags</label>
    <input id="tag-field" name="tag-field" type="text" value="" maxlength="140" />

    <input class="add-button" type="submit" value="Create" />
  </fieldset>
</form>

Я хотел бы использовать onsubmit атрибут для выполнения проверки на полях перед представлением, но везде, где возвращаемое значение true, форма отправлена дважды.

Я стремился связать обработчик jQuery с формой, но здесь также, где поведение по умолчанию не предотвращено, форма отправлена дважды, например:

<script type="text/javascript">
 $(document).ready(function() {
     $("#create-deck-form").submit(function(event){
          if($("#deck-name-field").val() == "") {
            event.preventDefault();
            alert("deck name required");
          }
        });
 });
</script>

В то время как я предполагаю, что существует что-то ослепляюще очевидная несправедливость здесь к новой паре глаз, я глубоко смущен, почему представление, с или без проверки, делает дублирующееся сообщение к серверу в Chrome и Safari. Я был бы благодарен за любое понимание.

7
задан Roman C 13 March 2013 в 18:46
поделиться

4 ответа

Эта проблема на самом деле связана с Facebox ( http://defunkt.github.com/facebox/ ). Инициализация Facebox вызывает второй набор запросов после загрузки вашей страницы. Итак, если вы отправите сообщение в / myaction / create , Facebox запустит второй набор запросов с базовым URL, установленным на / myaction / create . Исправление заключается в перенаправлении на URL-адрес, который обрабатывает запросы на получение после публикации, чтобы вы не выполняли публикацию дважды. Большое спасибо за вашу помощь.

3
ответ дан 7 December 2019 в 14:28
поделиться

Я не уверен на 100%, но попробуйте следующее:

<script type="text/javascript">
   $(document).ready(function() {
      $("#create-deck-form").submit(function(event){
         if(!$("#deck-name-field").val().length) {
           return false;
         }
       });
   });
</script>

если это не сработает, посмотрите

for(e in $("#create-deck-form").data('events'))
    alert(e);

Это предупредит вас обо всех связанных событиях на вашу форму . Может есть еще обработчики событий? В противном случае также на всякий случай также alert / log

$("#create-deck-form").attr('onclick')

и

$("#create-deck-form").attr('onsubmit')

.

1
ответ дан 7 December 2019 в 14:28
поделиться

Можете ли вы попробовать return false; после вашего предупреждения и удалить event.preventDefault();. Возможно, вам также нужно return true; в вашем else-клаузе. Я полагаю, что у меня это где-то работает.

0
ответ дан 7 December 2019 в 14:28
поделиться

Хорошо, не уверен, насколько это поможет, но попробуйте удалить ввод для отправки и отправить форму через javascript. Так, например,

<input id="submit-button" class="add-button" type="button" value="Create" />

Тогда вместо того, чтобы слушать onsubmit, вы можете попробовать

$('#submit-button').click(function(evt) {
    if(validationSuccess(...)) {
        $("#create-deck-form").submit();
    } else {
        //display whatever
    }
});

Теперь вы тоже должны работать ... но таким образом вы можете отлаживать там, где у вас проблема .... Это должно только отправить один раз ... удачи!

0
ответ дан 7 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: