开发者

How can I intercept a form without resulting in it being submitted twice?

I want to intercept a form, check for a condition and if it exists, prevent the default action. Otherwise, I want to pretend no such inter开发者_JS百科ception took place. The JavaScript looks something like this.

$("form").submit(function (event)
{
    $.ajax
    ({
        url: $(this).attr("action"),

        type: $(this).attr("method"),

        data: $(this).serialize(),

        dataType: "html",

        async: false,

        success: function (response)
        {
            if (foo in response) // This is just pseudo code.
            {
                event.preventDefault();

                // bar
            }
        }
    });
});

The problem is that the form is being submitted twice if foo is not found in response and I can't figure out why. I can assure you that it is a JavaScript issue. If I disable this progressive enhancement, everything works as designed.

EDIT: Adding return false at the end of the code is absolutely incorrectly. I stated that if foo is not found in response I want to pretend no such interception took place. That means I want the page to refresh and do whatever it was going to do.

I am already preventing the default event under very specific circumstances.

EDIT: sillyMunky and alex have touched on my issue. There is definitely a flaw in my design that I'm trying to resolve.

EDIT: I'm looking for help and I have provided code. Downgrading questions and answers without providing feedback is just plain rude.


Just put return false; in the very end of your function (event) body


It appears you are submitting the form via XHR. If so, just call event.preventDefault() at the top of your submit() function.

If you want to natively resubmit the form later in the success callback, call the form's native submit() event, i.e. $('form')[0].submit() (which won't trigger jQuery's submit() which would cause an infinite loop because of the rehandling of the condition).

Using async: false will lock the browser before the request has finished. Don't do that.


The problem is that the form is submitting by html and submitting by ajax. I would turn the submit button into any other kind of button (so it doesn't fire off the form) and then use the ajax call (called onclick) to determine whether or not to send the form off. If this decision depends on a server response then you have no choice but to submit it twice if the condition requires the form to be updated.


It appears that you need to cancel the original request. Also, by the time your other request is sent, it is too late to cancel the event.

Either return false or e.preventDefault() to cancel the original request.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜