如何从form.submit处理程序(jquery)中的异步回调中触发表单提交

时间:2012-02-03 18:25:23

标签: javascript jquery form-submit

我正在处理这样的表单提交:

$('#some-form').submit(function(ev) {
    var $form = $(this);

    $.getJSON('/some/endpoint', function(data) {
        if (data.somecondition) {
            $form.submit(); // <- not doing what I want
        }
    });

    return false;
});

所以,我开始一个异步的getJSON调用,然后返回false来停止表单提交。在getJSON回调中,在某些情况下,我想实际提交表单。但是触发submit()只会再次调用处理程序并重复该过程。

我知道我可以取消绑定提交处理程序然后提交,但是必须有更好的方法,对吧?如果没有更好的方法,那么构造此代码以取消绑定提交处理程序的最佳方法是什么?

4 个答案:

答案 0 :(得分:3)

事实证明它实际上非常简单,只需在元素的非扩展版本上调用submit()

$form.get(0).submit();

此处示例:http://jsbin.com/eyuteh/7/edit#html

警告:请参阅@Avi Pinto的评论。

答案 1 :(得分:1)

请勿在步骤1中提交表单,使用常规按钮,并通过onclick调用您的功能,这样您就不必担心提交事件管理。

您可以通过这种方式直接在回调中调用提交,而无需担心进入循环。

答案 2 :(得分:0)

你总是可以在jQuery中处理表单提交:

$('#some-form').submit(function(ev) {
    var $form = $(this);

    $.getJSON('/some/endpoint', function(data) {
        if (data.somecondition) {
            //$form.submit(); // <- not doing what I want
            //untested, but you should get the idea
            $.ajax({
                type: 'POST',
                url: $form.attr('action'),
                data: $form.serialize(),
                success: function() { alert('success!') }
          });
        }
    });

    return false; 
});

答案 3 :(得分:0)

使用旗帜..

$('#some-form').submit(function(ev) {
    if($form.data("canSubmit")) return true;

    var $form = $(this),
        $form.data("canSubmit",false);

    $.getJSON('/some/endpoint', function(data) {
        if (data.somecondition) {
            $form.data("canSubmit",true);
            $form.submit(); //this time it will submit
        }
    });

    return false;
});