Jquery Ajax Form Requires 2 Clicks to submit

前端 未结 1 1039
夕颜
夕颜 2020-12-22 01:34

i have an html form which which does jquery/ajax validations.

following is the html form...

相关标签:
1条回答
  • 2020-12-22 02:17

    I didn't fully replicate this with an entire login set up, but I did do a quick fake to test by changing the ajax.success to ajax.error and using a bad url to trigger the error, then inside of the error, I set the msg variable equal to the string that signals a valid response and the form did not require two submits.

    That, coupled with giving the code a closer look, I'm going to guess the issue is a sort of race condition due to the ajax calls.

    Your click handlers are set up like this:

    $("#login").on('click', validate_email_login);
    $("#login").on('click', validate_password_login);
    $("#login").click(function() { ... });
    

    Inside of that last handler is where the code checks the strings to see if the results are valid. However, by the time it gets to there those previous ajax requests may have not finished loading and those strings probably have not been reset yet. You can add some console.logs in that function to see what those values are and confirm.

    Because those ajax calls are asynchronous you are going to have to wait for them to finish before you can check that the form is valid. What you are looking for are Promises and Deferreds.

    I would suggest refactoring it into something like this:

    1. Set up a Deferred in both of your validation methods.
    2. Remove the #login click handlers and move everything into a submit handler for the form.
    3. In the submit handler of the form call the validation methods using $.when.

    Quick code example:

    // Move to submit handler
    $('form[name="loginform"]').on('submit', function() {
        // Set up the validation methods inside $.when
        $.when(validate_email_login(), validate_password_login())
         .done(function() {
            // Done means success!
            return true;
         })
         .fail(function() {
            // And fail is obviously a fail.
            return false;
         });
    });
    

    In addition to the jQuery docs, at a glance, this looks like another good resource for examples and an explanation of everything: http://jqfundamentals.com/chapter/ajax-deferreds. I think the stuff that is most like what you have is towards the bottom.

    A quick set up of what one of the validation methods might look like (untested):

    var validate_password_login = function() {
        // Set up the deferred object
        var def = $.Deferred();
        var item5 = $("#user_email2").val();
        var item5 = item5.toLowerCase();
        var item6 = $("#user_password2").val();
    
        if (item6.length < 8 || item6.length > 20) {
          $("#errormsg7").html("Password : 8-20 Characters");
          user_password2 = "";
          // Not a valid password so reject the deferred
          def.reject();
        } else {
          $("#errormsg7").html("");
          user_password2 = item6;
          $.ajax({
            method: "POST",
            url: "http://www.google.com",
            data: "user_email2=" + item5 + "&user_password2=" + item6
          })
          .done(function(msg) {
              if (msg == "WrongPw") {
                $("#errormsg7").html("Wrong Password");
                user_mobileajax2 = "";
                // The server said the PW was wrong, so reject this
                def.reject();
              } else if (msg == "CorrectPw") {
                $("#errormsg7").html("");
                user_mobileajax2 = "item6";
                // Looks like we are valid so we can resolve this
                def.resolve();
              }
           })
           .fail(function() {
              // Something went wrong on the server side, so have to reject
              def.reject();
            });
        }
    
        // We return the promise
        return def.promise();
    }
    
    0 讨论(0)
提交回复
热议问题