tags:

views:

118

answers:

1

I am using JQuery to perform form submission through an ajax request. I use

form.submit(function() {
    if( success ) {
        return true;
    }

    validate(); //proceeds to an ajax call

    return false;
}

On request success I want to either proceed with form submission or user callback. Therefore, if the user callback is undefined, I will submit the form on form validation success (from my validate function).

config = {
    successCallback: function() {
        success = true;
        form.submit(); //does not work
    }
};

validate = function() {
    $.ajax(
        ...
        success: function(data) {
            //code logic
            config.successCallback();
        }
    );
};

The ajax success callback will call config.successCallback() and if it was never overridden by the user, it would proceed to normal form submission. I tried using an instance variable (success) to make sure 'return true' would proceed to default form submission.

Unfortunately this is not working. It seems that the 'return false' statement that prevents default form submission will neglect any further submit calls even if an instance variable was set. It only works after clicking the submit button another time (that makes it twice for it to work).

Is there any workaround for this. I want to both use a user callback when provided but proceed with default form submission when not, and since I am using an ajax function to validate the form, the ajax success callback is complicating things.

+1  A: 

Make sure success is in scope, or just use form[0].submit() in your success callback to submit the DOM form and bypass the jQuery registered handler (assuming there's only one DOM form in the collection).

http://jsfiddle.net/J4nsx/

The latter method is actually how the jQuery validate plugin recommends getting around potential issues with too much recursion.

Andrew
Actually, `.submit()` will also cause the default submit action of the form. I wish the docs would say this in the one-liner description: http://api.jquery.com/submit/
karim79
Yeah, realized that when I tested... updated answer.
Andrew
That sounded like the perfect solution, which I think it is (that is using the form instead of the form wrapped in a jquery object), but it still does not seem to work for me. In my success callback, which is called from the success function from $.ajax, I try $form[0].submit() (I use $ to represent jquery objects). console.log does output a bare form when using $form[0].submit, even tried form.submit, but the code seems to stop right there since any other code calls after the $form[0].submit() does not execute? Any ideas? I can paste my jquery code if so, located: http://pastebin.com/U0kQ20mX
Steven Rosato
Do you have a page we can test this out on? It works for me when I remove the AJAX part of it: http://jsfiddle.net/afkWJ/
Andrew
It seemed that using a sentinel value along with $form.click() was a solution that worked for me. However, after further investigation, I saw that this kind of double post on the server side was not what I wanted. Once the ajax returns true, all the success actions should have been done on the server side and a redirection should only occur. I have updated my code here: http://jsfiddle.net/8mYPM/. Thanks a lot for your support.
Steven Rosato
I meant to say $form.find(':submit').click() instead of $form.click();
Steven Rosato