Ajax在表单提交时发送多个请求

3

这里发生的情况是,当我第一次点击按钮时,它不起作用,当我第二次点击时,它会发送ajax请求。如果再次运行,则会发送最后一次请求的*2个请求。

这是我的代码:

 <?php 
$this->load->view("header.php");
$this->load->view("sidebar.php");

?>
<style type="text/css">
  .form-group .error{font-size: 12px;color: red;}
</style>
<div class="content-wrapper">
    <!-- Content Header (Page header) -->
    <section class="content-header">
      <h1>
       User Management

      </h1>
      <ol class="breadcrumb">
        <li><a href="#"><i class="fa fa-dashboard"></i> Home</a></li>
        <li><a href="#">User Management</a></li>
        <li>Add User</li>
      </ol>
    </section>
    <section class="content">
      <div class="row">
      <div class="col-md-6 col-md-offset-3">
      <div class="callout callout-success" style="display: none;" id="cm_main_success">
                <h4>Success!</h4>
                <p id="cm_main_msg"></p>
              </div>
      <div class="callout callout-danger" style="display: none;" id="cm_main_fail">
                <h4>Oh snap!</h4>
                <p id="cm_main_fmsg"></p>
              </div>
              </div>
        <div class="col-md-12">
          <div class="box box-primary">
            <div class="box-header with-border">
              <h3 class="box-title">Add User</h3>
            </div>
            <form role="form" id="add_user" name="add_user" method="post" >
            <div class="row">
              <div class="box-body col-md-12">
              <div class="col-md-6">
                <div class="form-group">
                  <label for="exampleInputFirstName">First Name</label>
                  <input class="form-control" id="first_name" name="first_name" placeholder="Enter First Name" type="text">
                </div>
                <div class="form-group">
                  <label for="exampleInputPassword1">Email address</label>
                  <input class="form-control" id="email_address" name="email_address" placeholder="Enter Email Address" type="email">
                </div>
                <div class="form-group">
                  <label for="exampleInputPassword1">Contact</label>
                  <input class="form-control" id="contact" name="contact" placeholder="Enter Contact Number" type="text">
                </div>
              </div>
              <div class="col-md-6">
                <div class="form-group">
                  <label for="exampleInputLastName">Last Name</label>
                  <input class="form-control" id="last_name" name="last_name" placeholder="Enter Last Name" type="text">
                </div>
                <div class="form-group">
                  <label for="exampleInputPassword1">Password</label>
                  <input class="form-control" id="password" name="password" placeholder="Enter Password" type="password">
                </div>
                <div class="form-group">
                  <label for="exampleInputFile">Profile picture</label>
                  <input id="profile_pic" name="profile_pic" type="file">
                </div>
              </div>
                 </div>
              </div>
              <div class="box-footer" style="text-align: center;">
               <div id="loading"><img src="<?php echo base_url();?>assets/admin/images/hex-loader2.gif" style="display: none;"></div>
                <button type="submit" class="btn btn-primary" id="btn_add_user">Add User</button>
              </div>

            </form>
          </div>
        </div>
      </div>
    </section>
  </div>
<?php 
$this->load->view("footer.php");
?>

AJAX 代码

    $(document).ready(function(){

     $("#add_user").validate({
      rules: {
       first_name: {
        required: true,
        lettersonly: true
      },
      last_name:{
        required: true,
        lettersonly: true
      },
      email_address:{
        required: true,
        email: true
      },
      password:{
        required: true
      },
      contact:{
        required: true,
        digits: true
      },
      profile_pic:{
        extension: "jpg|png|jpeg"
      }
    },
    messages:{
      first_name: {required:"First Name cannot be empty",lettersonly: "Enter valid first name"},
      last_name: {required:"Last Name cannot be empty",lettersonly: "Enter valid last name"},
      email_address:{required:"Email Address cannot be empty",email:"Enter valid email address"},
      password:"Password cannot empty",
      contact:{required: "Contact cannot be empty",digits:"Enter valid contact number"},
      profile_pic:"Please select valid file .jpg, .png, .jpeg are allowed"
    },

    submitHandler: function (form) {
     $('#add_user').on('submit', function(e) { 
       e.preventDefault();  
       var form=document.getElementById('add_user');
       var fdata=new FormData(form); 
       $.ajax({
         type: "POST",
         url: '<?php echo base_url(); ?>Admin/add_members',
         data: fdata,
         processData: false,
          contentType: false,
         beforeSend: function () {
          $('#loading').show();
          $("#btn_add_user").hide();
          $('#cm_main_success').hide();
          $('#cm_main_fail').hide();
        },
        success: function(data){
          if(data == 1)
          {           
            $('#cm_main_success').show();
            $('#cm_main_msg').html("User added successfully");
            $('#cm_main_success').fadeOut(6000);  
            setTimeout(function(){ window.location.href = '<?php echo base_url();?>Admin/view_members'; }, 3000);
          }
          else if(data == 2)
          {
            $('#cm_main_fail').show();
            $('#cm_main_fmsg').html("Email address already exist");
            $('#cm_main_fail').fadeOut(6000);
             me.data('requestRunning', false);
          }
          else
          {
            $('#cm_main_fail').show();
            $('#cm_main_fmsg').html("Something Went Wrong!");
            $('#cm_main_fail').fadeOut(6000); 
          }
        },
        complete: function () {

          $('#loading').hide();
          $("#btn_add_user").show();

        }

      });

    });
    }

 }); 

   });

我尝试了stackoverflow上提供的大多数与此主题相关的ajax解决方案。请任何能够帮助我解决这个问题的人。

4个回答

4
问题出在每次验证成功后您都会进行“绑定(binding)”。您只需要简单地使用“submitHandler”,如下所示:

submitHandler: function (form) { //This is the form element you are already getting. You don't need to get the form again
       var fdata=new FormData(form); 
       $.ajax({
           //do further work

根据您的请求,解决方案尚未完成。 - Astound

1
问题是在成功验证后,$('#add_user').on('submit', function(e) {告诉表单必须再次提交,在提交处理程序只处理表单而不再次提交。
 $(document).ready(function(){

     $("#add_user").validate({
      rules: {
       first_name: {
        required: true,
        lettersonly: true
      },
      last_name:{
        required: true,
        lettersonly: true
      },
      email_address:{
        required: true,
        email: true
      },
      password:{
        required: true
      },
      contact:{
        required: true,
        digits: true
      },
      profile_pic:{
        extension: "jpg|png|jpeg"
      }
    },
    messages:{
      first_name: {required:"First Name cannot be empty",lettersonly: "Enter valid first name"},
      last_name: {required:"Last Name cannot be empty",lettersonly: "Enter valid last name"},
      email_address:{required:"Email Address cannot be empty",email:"Enter valid email address"},
      password:"Password cannot empty",
      contact:{required: "Contact cannot be empty",digits:"Enter valid contact number"},
      profile_pic:"Please select valid file .jpg, .png, .jpeg are allowed"
    },

    submitHandler: submitForm

 }); 

     function submitForm(){


       var form=document.getElementById('add_user');
       var fdata=new FormData(form); 
       $.ajax({
         type: "POST",
         url: '<?php echo base_url(); ?>Admin/add_members',
         data: fdata,
         processData: false,
          contentType: false,
         beforeSend: function () {
          $('#loading').show();
          $("#btn_add_user").hide();
          $('#cm_main_success').hide();
          $('#cm_main_fail').hide();
        },
        success: function(data){
          if(data == 1)
          {           
            $('#cm_main_success').show();
            $('#cm_main_msg').html("User added successfully");
            $('#cm_main_success').fadeOut(6000);  
            setTimeout(function(){ window.location.href = '<?php echo base_url();?>Admin/view_members'; }, 3000);
          }
          else if(data == 2)
          {
            $('#cm_main_fail').show();
            $('#cm_main_fmsg').html("Email address already exist");
            $('#cm_main_fail').fadeOut(6000);
             me.data('requestRunning', false);
          }
          else
          {
            $('#cm_main_fail').show();
            $('#cm_main_fmsg').html("Something Went Wrong!");
            $('#cm_main_fail').fadeOut(6000); 
          }
        },
        complete: function () {

          $('#loading').hide();
          $("#btn_add_user").show();

        }

      });



      return false;
     }

   });

1
这个工作正常,已经测试过。
$(document).ready(function(){

     $("#add_user").validate({
      rules: {
       first_name: {
        required: true,
        lettersonly: true
      },
      last_name:{
        required: true,
        lettersonly: true
      },
      email_address:{
        required: true,
        email: true
      },
      password:{
        required: true
      },
      contact:{
        required: true,
        digits: true
      },
      profile_pic:{
        extension: "jpg|png|jpeg"
      }
    },
    messages:{
      first_name: {required:"First Name cannot be empty",lettersonly: "Enter valid first name"},
      last_name: {required:"Last Name cannot be empty",lettersonly: "Enter valid last name"},
      email_address:{required:"Email Address cannot be empty",email:"Enter valid email address"},
      password:"Password cannot empty",
      contact:{required: "Contact cannot be empty",digits:"Enter valid contact number"},
      profile_pic:"Please select valid file .jpg, .png, .jpeg are allowed"
    },

    submitHandler: function (form) {


       var form=document.getElementById('add_user');
       var fdata=new FormData(form); 
       $.ajax({
         type: "POST",
         url: '<?php echo base_url(); ?>Admin/add_members',
         data: fdata,
         processData: false,
          contentType: false,
         beforeSend: function () {
          $('#loading').show();
          $("#btn_add_user").hide();
          $('#cm_main_success').hide();
          $('#cm_main_fail').hide();
        },
        success: function(data){
          if(data == 1)
          {           
            $('#cm_main_success').show();
            $('#cm_main_msg').html("User added successfully");
            $('#cm_main_success').fadeOut(6000);  
            setTimeout(function(){ window.location.href = '<?php echo base_url();?>Admin/view_members'; }, 3000);
          }
          else if(data == 2)
          {
            $('#cm_main_fail').show();
            $('#cm_main_fmsg').html("Email address already exist");
            $('#cm_main_fail').fadeOut(6000);
             me.data('requestRunning', false);
          }
          else
          {
            $('#cm_main_fail').show();
            $('#cm_main_fmsg').html("Something Went Wrong!");
            $('#cm_main_fail').fadeOut(6000); 
          }
        },
        complete: function () {

          $('#loading').hide();
          $("#btn_add_user").show();

        }

      });


    }

 }); 

   });

请问这段代码 me.data('requestRunning', false); 会不会影响我的程序? - Astound
你的代码完美地运行了,只需点击它就可以发送请求,现在不会出现多次发生的情况了。谢谢啊,你让我感到非常愉快。 - Astound
me.data('requestRunning', false); 这段代码对你的程序并不需要,如果你需要了解如何使用 me.data('requestRunning', false),请访问以下链接:https://dev59.com/aWMl5IYBdhLWcg3wAC2h。该链接可以帮助你理解。 - Dinesh Kumar

-1

我认为这是事件冒泡的情况。带有提交类型的按钮将触发ajax调用并将表单提交到指定的url。

在表单提交函数中添加e.preventDefault(),它应该只发送一次表单


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接