How to prevent page from reloading after form submit - JQuery

后端 未结 1 1759
深忆病人
深忆病人 2020-11-28 12:17

I am working on a website for my app development class and I have the weirdest issue.

I am using a bit of JQuery to send form data to a php page called \'process.ph

相关标签:
1条回答
  • 2020-11-28 12:47

    The <button> element, when placed in a form, will submit the form automatically unless otherwise specified. You can use the following 2 strategies:

    1. Use <button type="button"> to override default submission behavior
    2. Use event.preventDefault() in the onSubmit event to prevent form submission

    Solution 1:

    • Advantage: simple change to markup
    • Disadvantage: subverts default form behavior, especially when JS is disabled. What if the user wants to hit "enter" to submit?

    Insert extra type attribute to your button markup:

    <button id="button" type="button" value="send" class="btn btn-primary">Submit</button>
    

    Solution 2:

    • Advantage: form will work even when JS is disabled, and respects standard form UI/UX such that at least one button is used for submission

    Prevent default form submission when button is clicked. Note that this is not the ideal solution because you should be in fact listening to the submit event, not the button click event:

    $(document).ready(function () {
      // Listen to click event on the submit button
      $('#button').click(function (e) {
    
        e.preventDefault();
    
        var name = $("#name").val();
        var email = $("#email").val();
    
        $.post("process.php", {
          name: name,
          email: email
        }).complete(function() {
            console.log("Success");
          });
      });
    });
    

    Better variant:

    In this improvement, we listen to the submit event emitted from the <form> element:

    $(document).ready(function () {
      // Listen to submit event on the <form> itself!
      $('#main').submit(function (e) {
    
        e.preventDefault();
    
        var name = $("#name").val();
        var email = $("#email").val();
    
        $.post("process.php", {
          name: name,
          email: email
        }).complete(function() {
            console.log("Success");
          });
      });
    });
    

    Even better variant: use .serialize() to serialize your form, but remember to add name attributes to your input:

    The name attribute is required for .serialize() to work, as per jQuery's documentation:

    For a form element's value to be included in the serialized string, the element must have a name attribute.

    <input type="text" id="name" name="name" class="form-control mb-2 mr-sm-2 mb-sm-0" id="inlineFormInput" placeholder="Jane Doe">
    <input type="text" id="email" name="email" class="form-control" id="inlineFormInputGroup" placeholder="janedoe@email.com">
    

    And then in your JS:

    $(document).ready(function () {
      // Listen to submit event on the <form> itself!
      $('#main').submit(function (e) {
    
        // Prevent form submission which refreshes page
        e.preventDefault();
    
        // Serialize data
        var formData = $(this).serialize();
    
        // Make AJAX request
        $.post("process.php", formData).complete(function() {
          console.log("Success");
        });
      });
    });
    
    0 讨论(0)
提交回复
热议问题