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

Javascript 如何在form.submit处理程序(jquery)内的异步回调中触发表单提交,javascript,jquery,form-submit,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

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

$('#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;
});
$(“#某种形式”).submit(函数(ev){
var$form=$(此);
$.getJSON('/some/endpoint',函数(数据){
if(data.somecondition){

$form.submit();//不要在步骤1中提交表单,使用常规按钮,并让onclick调用您的函数,这样您就不必担心提交事件管理


您可以通过这种方式在回调中直接调用submit,而不必担心进入循环。

不要在步骤1中提交表单,使用常规按钮,让onclick调用您的函数,这样您就不必担心submit事件管理


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

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

$form.get(0).submit();
示例如下:


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

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

$form.get(0).submit();
示例如下:


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

您可以在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; 
});
$(“#某种形式”).submit(函数(ev){
var$form=$(此);
$.getJSON('/some/endpoint',函数(数据){
if(data.somecondition){

//$form.submit();//您始终可以在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; 
});
$(“#某种形式”).submit(函数(ev){
var$form=$(此);
$.getJSON('/some/endpoint',函数(数据){
if(data.somecondition){
//$form.submit();//使用标志

$('#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;
});
使用旗帜

$('#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;
});


只是一个简单的猜测。我将更改
$form.submit();
返回true;
注意:我没有测试这个yet@Henesnarfel,它在回调函数中。
return true
将从该回调中返回。原始表单提交已被处理函数中的
return false
取消。你是对的。我的错误。就像我说的,这是一个快速的错误这只是一个简单的猜测。我将更改
$form.submit();
返回true;
注意:我没有测试这个yet@Henesnarfel,它在回调函数中。
return true
将从该回调中返回。原始表单提交已被处理函数中的
return false
取消。你是对的。我的错误。就像我说的,这是一个快速的错误essYeah,我的同事也有这个想法。虽然看起来有些迂回,但如果可以避免的话,我宁愿不更改标记(即使是通过javascript)。此外,我仍然想要“回车”键触发处理程序。不是我使用的,而是+1,因为这个解决方案确实有效。是的,我的同事也有这个想法。虽然看起来很迂回,如果可以避免的话,我宁愿不更改标记(即使通过javascript)。此外,我仍然想要“回车”键触发处理程序。不是我使用的,而是+1,因为此解决方案有效,但效果不一样。它保留在页面上,也不处理文件上载。啊,有道理,抱歉没有更大帮助。但这没有相同的效果。它保留在页面上,也不处理文件上载。啊,有道理,抱歉没有多大帮助。(不知道提交实际元素将覆盖绑定事件,尽管这是合乎逻辑的),但通过这种方式,您可以覆盖扩展的提交流,例如,使用jQuery.validate-如果您的提交事件发生在jQuery.validate之前-返回false,停止验证,然后触发表单的提交-您可能会提交无效表单。在您的情况下,这可能是正常的,但其他一些开发人员可能会将提交事件挂接到表单a我很惊讶他什么也做不到。@AviPinto,这一点很好。我更新后指出了这个警告。(不知道提交实际元素会覆盖绑定事件,尽管这是合乎逻辑的),但通过这种方式,您可以覆盖扩展的提交流,例如,使用jQuery.validate-如果您的提交事件发生在jQuery.validate之前-返回false,停止验证,然后触发表单的提交-您可能会提交无效表单。在您的情况下,这可能是正常的,但其他一些开发人员可能会将提交事件挂接到表单a我很惊讶他什么都不管用。@AviPinto,说得很好。我更新后指出了这一点。如果表单被用来进行异步调用,这可能会导致问题,因为它激活了标志,然后如果你想提交它不异步,它将不工作异步调用不会更改标志,只有提交事件会在从返回后更改标志检查它的ajax调用如果您的表单被用于进行异步调用,则可能会导致问题,因为它激活了标志,然后如果您想提交它不异步它将不工作异步调用不会更改标志,只有submit事件会在从检查它的ajax调用返回后更改标志