Jquery: отправка формы дважды

Я создаю регистрационную форму для клиента для события, которое они проводят. Основные данные пользователя передаются сторонней системе (например, имя, адрес электронной почты и т.д.), Но остальные поля должны быть отправлены по электронной почте клиенту.

Мне нужно что-то подобное:

  • Элемент списка
  • Пользователь заполняет форму
  • jquery bvalidator проверяет форму для обязательных полей Форма
  • отправляется (через ajax) на отдельную страницу, где электронное письмо отправляется клиенту Форма
  • затем отправляется (обычный метод POST) в стороннюю систему.
  • по успеху пользователь возвращается к URL-адресу "спасибо".

Вот код, который я пытался использовать, но он попадает в цикл, который повторно отправляет себя на страницу "электронная почта" и никогда не подчиняется внешнему URL-адресу.

Если я заменил $('#form1').submit(); на предупреждение, он отправляется только один раз на страницу электронной почты и затем корректно отображает предупреждение.

var myvalidator = $('#form1').bValidator(optionsGrey);

$('#form1').submit(function() {
  if (myvalidator.isValid()) {

    $.ajax({
      data: $('#form1').serialize(),
      type: "POST",
      url: "email_send.asp",
      success: function() {
        $('#form1').submit();
      }
    });
  }
  return false;
});

Любые предложения относительно того, как я могу это исправить?

Ответ 1

Try:


$('#form1').unbind('submit').submit();

Ответ 2

попробуйте отменить отправку события на ваш успех: метод вашего вызова ajax, вызвав unbind

$('#form1').unbind('submit'); 
$('#form1')[0].submit(); // call native submit

http://api.jquery.com/unbind/

Ответ 3

Вы можете использовать unbind(), чтобы вернуться к поведению по умолчанию.

var myvalidator = $('#form1').bValidator(optionsGrey);

$('#form1').submit(function() {

    if(myvalidator.isValid()) {

        $.ajax({
            data: $('#form1').serialize(),
            type: "POST",
            url: "email_send.asp",
            success: function(){
                $('#form1').unbind('submit');
                $('#form1').submit();
            }
        });

    }

    return false;

});

Ответ 4

Я не уверен, что понимаю. Вы всегда отправляете email_send.asp, так что с каждым успехом он делает это, поэтому кажется довольно понятным, почему вы застреваете в цикле.

Если я правильно понял, второй submit должен быть другим URL-адресом с другим обработчиком успеха, правильно?

Итак, вместо отправки формы снова вы можете просто написать базовую функцию ajax:

$('#form1').submit(function () {
  if (myvalidator.isValid()) {
    $.ajax({
      data: $('#form1').serialize(),
      type: "POST",
      url: "email_send.asp",
      success: function(){
        $.ajax({
          data: $('#form1').serialize(),
          type: 'POST',
          url: 'third_party.asp',
          success: function () {
            //display thank you message
          }            
        });
      }
    });
  }    
});

РЕДАКТИРОВАТЬ Здесь обновленный ответ в соответствии с вашим комментарием:

var myvalidator = $('#form1').bValidator(optionsGrey);

$('#form1').submit(function(){      
  if(myvalidator.isValid()){
    $.ajax({
      data: $('#form1').serialize(),
      type: "POST",
      url: "email_send.asp",
      success: function(){
        $('#form1').unbind('submit').submit();
      }
    });
  }
  return false;
});

Ответ 5

Вы можете использовать плагин jquery.form для отправки формы через ajax. Оформить заказ по следующему URL: http://jquery.malsup.com/form/

Затем в js script попробуйте что-то вроде этого

var myvalidator = $('#form1').bValidator(optionsGrey);

$('#form1').submit(function(){
    if(myvalidator.isValid()){
      $(this).unbind('submit').submit();

});

Ответ 6

У вас есть причина использовать метод submit? Причина, по которой он вводит бесконечный цикл, состоит в том, что он снова вызывает тот же приемник событий отправки.

Если нет, вы можете просто поставить две очереди ajax-отправлений, одну на страницу электронной почты и еще раз клиенту.

Наконец, вы можете отменить прослушиватель событий. Малоизвестный способ развязать прослушиватель событий - передать объект события в unbind -call. Это приведет к отключению только текущего прослушивателя событий:

$('#form1').submit(function(e){
    if(myvalidator.isValid()){
$form = $('#form1');
$.ajax({
    data: $form.serialize(),
               type: "POST",
               url: "email_send.asp",
               success: function(){
                 $form.unbind(e).submit();
               }
             });
    }
    return false;
});

Ответ 7

Вот пример кода отправки формы дважды для разных URL-адресов без перенаправления. Дважды нажмите кнопку "Тест".

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="ISO-8859-1">
    <title>Insert title here</title>
    <script type="text/javascript" src="jQuery.js"></script>
    <script type="text/javascript">
    $(document).ready(function() {
        $("#testBtn").click(function() {
            $("#form").submit();
            $("#form").submit(function() {
                $("#form").attr("action", "download");
            });
        });
    });
    </script>
    </head>
    <body>
        <form id="form" enctype="multipart/form-data" method="post"
            action="upload" target="myIFrame">
            <input type="hidden" name="FileName" />
            <input type="file" name="FileDialog" size="100" />
            <input type="submit" /> <input name="txt" type="text" />
        </form>
        <input id="testBtn" type="button" value="Test" />

        <iframe style="display: none;" src="javascript:''" id="myIFrame">
            <html>
                <head></head>
                <body></body>
            </html>
        </iframe>
    </body>
    </html>

Ответ 8

У меня была та же проблема. Затем я заметил, что я случайно связал свой файл javascript дважды, поэтому форма была отправлена ​​дважды двумя сценариями. Проблема была решена путем удаления одного нижнего колонтитула страницы script страницы.

<script src="<?php echo base_path; ?>/js/custom.js"></script>
<script src="<?php echo base_path; ?>/js/custom.js"></script>