简体   繁体   English

ajax提交后如何防止页面刷新

[英]How to prevent page from refreshing after ajax submit

I just started using Ajax function in my work and I'm not very familiar with it.我刚开始在我的工作中使用 Ajax 功能,我对它不是很熟悉。 I have this problem that when I submit data, it submits without refreshing the page, but on a second time when trying to submit, the page refreshes before submitting.我有这个问题,当我提交数据时,它在不刷新页面的情况下提交,但是在第二次尝试提交时,页面在提交前刷新。 I've used the e.preventDefault() to prevent the page from refreshing but it is not working for me.我已经使用 e.preventDefault() 来防止页面刷新,但它对我不起作用。 It just seems there is something I'm not doing right.似乎有些事情我做得不对。

This is my Ajax code这是我的 Ajax 代码

<!--AJAX PROCESS TO SUBMIT CHECKED COURSES-->
    $(document).ready(function(){
        loadNewCourse();
        loadDelTable();
        $('#submit').click(function(){
            $('#form').submit(function(e){ 
            e.preventDefault();
                var in_arr = [],
                    name = ("<?php echo $_SESSION['name']?>"),
                    email = ("<?php echo $_SESSION['email']?>"),
                    regno = ("<?php echo $_SESSION['regno']?>"),
                    level = ("<?php echo $_SESSION['level']?>"),
                    dept = ("<?php echo $_SESSION['dept']?>"),
                    semester = ("<?php echo $_SESSION['semester']?>");
                    $('.inChk').each(function(i){
                        var checked = $(this).is(':checked');
                        if(checked){
                            in_arr.push($(this).val());
                        }
                    });
                    $.ajax({
                    url: 'submit.php',
                    type: 'POST',
                    cache: false,
                    async: false,
                    data: {
                        post_inId : in_arr,
                        name : name,
                        email : email,
                        regno : regno,
                        level : level,
                        dept : dept,
                        semester : semester
                        },
                    success: function(data){
                        loadNewCourse();
                        loadDelTable();
                        // setTimeout(function(){
                        //     $('#regModal').modal('hide');
                        // }, 1000);
                        $('body').removeAttr('style');
                        $('#regModal').removeAttr('style');
                        $('.modal-backdrop').remove();
                        swal({
                            // "Success", "Registration successful", "success"
                            position: "top-end",
                            type: "success",
                            title: "Registration successful",
                            showConfirmButton: false,
                            timer: 2000
                        })
                    },
                    error: function(data){
                        swal("Oops...", "Registration failed.", "error");
                    }
                });
            });
        });

////////////////////////////////////////////////////////////////////////////////////////
// PROCESS AJAX DELETE ON CHECKBOX SELECT
$('#deleteCheck').click(function(){
    $('#delform').submit(function(e){
    e.preventDefault();
        var id_arr = [],
            regno = ("<?php echo $_SESSION['regno']?>"),
            level = ("<?php echo $_SESSION['level']?>");
        $('.delChk').each(function(i){
            var checked = $(this).is(':checked');
            if(checked){
                id_arr.push($(this).val());
            }
        });
        swal({
                title: "Are you sure you want to delete selected courses?",
                text: "You can add these courses by registering again!",
                type: "warning",
                showCancelButton: true,
                confirmButtonText: "Yes, delete!",
                confirmButtonClass: 'btn btn-success',
                cancelButtonClass: 'btn btn-danger',
                closeOnConfirm: false
            },
            function(isConfirm){
                if(isConfirm){
                $.ajax({
                    type: "POST",
                    url: "submit.php",
                    data: {
                        post_id : id_arr,
                        regno : regno,
                        level : level
                        },
                    cache: false,
                    async: false,
                    success: function(data){
                        // console.log(data);
                        loadDelTable();
                        loadNewCourse();
                        swal({
                                // "Success", "Registration successful", "success"
                                position: "top-end",
                                type: "success",
                                title: "Delete successful",
                                showConfirmButton: false,
                                timer: 2000
                            })
                    },
                    error: function(data){
                        swal("Oops...", "Delete failed.", "error");
                    }
                });
            }else{
                // alert('isNotConfirm and is not success');
                swal("Oops...", "Delete failed", "error");
            }
        });
        return false;
///////////////////////////////////////////////////////////////////////////////////////////
    });
});

    function loadNewCourse(){
        $.ajax({
            url: 'processReg.php',
            type: 'POST',
            cache: false,
            async: false,
            data: {
                loadit : 1
            },
            success: function(disp){
                $("#reveal").html(disp).show();
            }
        });
    }
    
    function loadDelTable(){
        $.ajax({
            url: 'delete_tbl.php',
            type: 'POST',
            cache: false,
            async: false,
            data: {
                loadDel : 1
            },
            success: function(deldisp){
                $("#showRegtbl").html(deldisp).show();
            }
        });
    }
});

And this is the page displaying submitted data这是显示提交数据的页面

 <div class="" style="margin:auto;margin-top:0;text-align:center">
            <div class="" >
                <h2 class="#" style="font-family: 'proxima-nova','Helvetica Neue',Helvetica,arial,sans-serif;letter-spacing:5px;font-weight:100;color:#061931;">Welcome!</h2>
                <p style="width:100%;font-size:14px;text-align:center;padding:5px;background:whitesmoke;padding:20px;">If this is your first visit, click on <b>Register Courses</b> to register courses available for you. <br>If you are re-visiting, you can continue where you left off.<br><a href="#regModal" data-toggle="modal" data-target="#regModal"><span class="btn btn-md btn-primary" style="letter-spacing:3px;margin-top:10px;"><b>Register Courses</b></span></a></p>
            </div>
        </div><br>
            <!--Display Courses that are available-->
                <span id="reveal"></span>

            <!--Table to display courses registered-->
                <span id="showRegtbl"></span>
    </div>
</div>

I've been stuck in this for more than 3days now.我已经被困在这里超过 3 天了。 Can anyone here help me out pls?这里有人可以帮我吗?

I think you misunderstood the submission of the form and even handling.我认为您误解了表单的提交甚至处理。

The default action of the form ie submit can be done with input type="submit" or <button>表单的默认操作即提交可以通过input type="submit"<button>

The default默认的

 <h2> Form default action </h2> <form action=""> <input type="hidden" id="someInput" value="hey"> <input type="submit" value="submit"> </form>

To prevent form's default action you can do 2 things.为了防止表单的默认操作,您可以做两件事。

Avoid using type="submit" or button避免使用type="submit"或按钮

Do something like this做这样的事情

 function customForm(){ alert("Hey this is custom handler, dont worry page will not refresh...!"); }
 <h2> Form with custom action </h2> <form action=""> <input type="hidden" id="someInput" value="hey"> <input type="button" value="submit" onclick="customForm()"> </form>

Use event.preventDefault()使用 event.preventDefault()

 $('#myform').submit(function(e){ e.preventDefault(); alert("custom handler with preventDefault(), no reload no worries...!"); })
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <h2> Form with custom handler using preventDefault() </h2> <form id="myform" action=""> <input type="hidden" id="someInput" value="hey"> <input type="submit" value="submit" onsubmit="customForm(this)"> </form>

For any queries comment down.如有任何疑问,请评论。

Calling $("#form").submit(function() { ... }) creates a handler for the next time the form is submitted.调用$("#form").submit(function() { ... })下次提交表单创建一个处理程序。 Doing this inside the handler for $("#submit").click() is not correct.$("#submit").click()的处理程序中执行此操作是不正确的。 Clicking the submit button will establish a handler for the next submission, but then the default action will submit the form immediately, which refreshes the page.单击提交按钮将为下一次提交建立一个处理程序,但默认操作将立即提交表单,从而刷新页面。 Putting e.preventDefault() inside the click handlers would prevent the reload, but then you would have to click twice to submit the form (and this wouldn't actually work, because the default action of a submit button is to trigger the submit event, and you're preventing that).e.preventDefault()放在单击处理程序中会阻止重新加载,但是您必须单击两次才能提交表单(这实际上不起作用,因为提交按钮的默认操作是触发提交事件,而您正在阻止它)。

Just create submit handlers for each form, without doing it inside a click handler.只需为每个表单创建提交处理程序,而无需在点击处理程序中进行。

$(document).ready(function() {
  loadNewCourse();
  loadDelTable();
  $('#form').submit(function(e) {
    e.preventDefault();
    var in_arr = [],
      name = ("<?php echo $_SESSION['name']?>"),
      email = ("<?php echo $_SESSION['email']?>"),
      regno = ("<?php echo $_SESSION['regno']?>"),
      level = ("<?php echo $_SESSION['level']?>"),
      dept = ("<?php echo $_SESSION['dept']?>"),
      semester = ("<?php echo $_SESSION['semester']?>");
    $('.inChk').each(function(i) {
      var checked = $(this).is(':checked');
      if (checked) {
        in_arr.push($(this).val());
      }
    });
    $.ajax({
      url: 'submit.php',
      type: 'POST',
      cache: false,
      async: false,
      data: {
        post_inId: in_arr,
        name: name,
        email: email,
        regno: regno,
        level: level,
        dept: dept,
        semester: semester
      },
      success: function(data) {
        loadNewCourse();
        loadDelTable();
        // setTimeout(function(){
        //     $('#regModal').modal('hide');
        // }, 1000);
        $('body').removeAttr('style');
        $('#regModal').removeAttr('style');
        $('.modal-backdrop').remove();
        swal({
          // "Success", "Registration successful", "success"
          position: "top-end",
          type: "success",
          title: "Registration successful",
          showConfirmButton: false,
          timer: 2000
        })
      },
      error: function(data) {
        swal("Oops...", "Registration failed.", "error");
      }
    });
  });

  ////////////////////////////////////////////////////////////////////////////////////////
  // PROCESS AJAX DELETE ON CHECKBOX SELECT
  $('#delform').submit(function(e) {
    e.preventDefault();
    var id_arr = [],
      regno = ("<?php echo $_SESSION['regno']?>"),
      level = ("<?php echo $_SESSION['level']?>");
    $('.delChk').each(function(i) {
      var checked = $(this).is(':checked');
      if (checked) {
        id_arr.push($(this).val());
      }
    });
    swal({
        title: "Are you sure you want to delete selected courses?",
        text: "You can add these courses by registering again!",
        type: "warning",
        showCancelButton: true,
        confirmButtonText: "Yes, delete!",
        confirmButtonClass: 'btn btn-success',
        cancelButtonClass: 'btn btn-danger',
        closeOnConfirm: false
      },
      function(isConfirm) {
        if (isConfirm) {
          $.ajax({
            type: "POST",
            url: "submit.php",
            data: {
              post_id: id_arr,
              regno: regno,
              level: level
            },
            cache: false,
            async: false,
            success: function(data) {
              // console.log(data);
              loadDelTable();
              loadNewCourse();
              swal({
                // "Success", "Registration successful", "success"
                position: "top-end",
                type: "success",
                title: "Delete successful",
                showConfirmButton: false,
                timer: 2000
              })
            },
            error: function(data) {
              swal("Oops...", "Delete failed.", "error");
            }
          });
        } else {
          // alert('isNotConfirm and is not success');
          swal("Oops...", "Delete failed", "error");
        }
      });
    return false;
    ///////////////////////////////////////////////////////////////////////////////////////////
  });

  function loadNewCourse() {
    $.ajax({
      url: 'processReg.php',
      type: 'POST',
      cache: false,
      async: false,
      data: {
        loadit: 1
      },
      success: function(disp) {
        $("#reveal").html(disp).show();
      }
    });
  }

  function loadDelTable() {
    $.ajax({
      url: 'delete_tbl.php',
      type: 'POST',
      cache: false,
      async: false,
      data: {
        loadDel: 1
      },
      success: function(deldisp) {
        $("#showRegtbl").html(deldisp).show();
      }
    });
  }
});

If you had multiple submit buttons in the same form you would instead assign click handlers to each button, but not create submit handlers for the form.如果您在同一个表单中有多个提交按钮,您应该为每个按钮分配click处理程序,但为表单创建submit处理程序。

Thanks everyone for the assistance.感谢大家的帮助。 I did some debugging on my end and was able to fix the issue by removing the form tags from the Add and Delete scripts and then include them in the page displaying the submitted data.我最后进行了一些调试,通过从添加和删除脚本中删除表单标签,然后将它们包含在显示提交数据的页面中,我能够解决这个问题。 Like this...像这样...

<div class="" style="margin:auto;margin-top:0;text-align:center">
            <div class="" >
                <h2 class="#" style="font-family: 'proxima-nova','Helvetica Neue',Helvetica,arial,sans-serif;letter-spacing:5px;font-weight:100;color:#061931;">Welcome!</h2>
                <p style="width:100%;font-size:14px;text-align:center;padding:5px;background:whitesmoke;padding:20px;">If this is your first visit, click on <b>Register Courses</b> to register courses available for you. <br>If you are re-visiting, you can continue where you left off.<br><a href="#regModal" data-toggle="modal" data-target="#regModal"><span class="btn btn-md btn-primary" style="letter-spacing:3px;margin-top:10px;"><b>Register Courses</b></span></a></p>
            </div>
        </div><br>
  <!--Display Courses that are available-->
<form id='form' action='POST' href='#'>
   <span id="reveal"></span>
</form>

<!--Table to display courses registered-->
<form id='delform' action='POST' href='#'>
   <span id="showRegtbl"></span>
</form>
    </div>
</div>

Is there a more proper way to do this or this is just okay?有没有更合适的方法来做到这一点,或者这没问题? Thank you for the help so far.感谢您到目前为止的帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM