【问题标题】:jQuery - Resume form submit after ajax calljQuery - ajax调用后恢复表单提交
【发布时间】:2015-02-12 22:23:10
【问题描述】:

是否可以在 ajax 调用成功的情况下阻止表单提交然后重新提交相同的表单?

此时它到达了成功位,但它没有重新提交应该提交的表单并将用户重定向到http://example.com 网站。

非常感谢您提前提供的任何帮助

如果不能以这种方式做到这一点,还有其他方法可以让它工作吗?

$(document).ready(function() {
    $('form').submit(function(e) {
        e.preventDefault();

        $.ajax({
            url: $('form').attr('action'),
            type: 'post',
            data: $('form').serialize(),
            success: function(data) {
                if (data == 'true')
                {
                    $('form').attr('action', 'http://example.com');
                    $('form').unbind('submit').submit(); // mistake: changed $(this) to $('form') - Problem still persists though it does not resubmit and redirect to http://example.com
                }
                else
                {
                    alert('Your username/password are incorrect');
                }
            },
            error: function() {
                alert('There has been an error, please alert us immediately');
            }
        });
    });
});

编辑:

Stackoverflow 帖子签出以下代码:

我只是想提一下,我也尝试过这段代码,但无济于事。

var ajaxSent = false;
$(document).ready(function() {
    $('form').submit(function(e) {

        if ( !ajaxSent)
            e.preventDefault();

        $.ajax({
            url: $('form').attr('action'),
            type: 'post',
            data: $('form').serialize(),
            success: function(data) {
                if (data == 'true')
                {
                    alert('submit form');
                    ajaxSent = true;
                    $('form').attr('action', 'http://example.com');
                    $('form').submit();
                    return true;
                }
                else
                {
                    alert('Your username/password are incorrect');
                    return false;
                }
            },
            error: function() {
                alert('There has been an error, please alert us immediately');
                return false;
            }
        });
    });
});

我也试过这个代码,但没有任何运气。

$(document).ready(function() {
    $('form').submit(function(e) {
        e.preventDefault();

        $.ajax({
            url: $('form').attr('action'),
            type: 'post',
            data: $('form').serialize(),
            success: function(data) {
                if (data == 'true')
                {
                    $('form').attr('action', 'http://example.com');
                    $('form').unbind('submit').submit();
                    return true;
                }
                else
                {
                    alert('Your username/password are incorrect');
                    return false;
                }
            },
            error: function() {
                alert('There has been an error, please alert us immediately');
                return false;
            }
        });
    });
});

【问题讨论】:

  • 这很可能会无限提交表单。起初 ajax 提交表单,成功时它再次通过相同的 ajax 并再次成功..然后再次..然后再次。
  • @Saching 为什么?他们在第二次提交表单之前删除(嗯,试图删除)submit 事件处理程序。
  • @AnthonyGrist 但在解除绑定后,会调用相同的处理程序,因为 submit 后面跟着它。不会吗?还是我错了?
  • @Saching 你错了。当事件处理程序未绑定时,它就消失了——它不能被任何东西调用。
  • 您可以发布自己的答案,但作为答案,而不是通过编辑您的原始问题!

标签: javascript jquery


【解决方案1】:

解决方案非常简单,涉及在 .ajax() 中添加 async 并将其设置为 false。此外,我重新编写了提交按钮的代码,而不是在 AJAX 成功通过时提交表单。

这是我的工作代码:

$(document).ready(function() {
    var testing = false;
    $('#btn-login').on('click', function() {
        $.ajax({
            url: $('form').attr('action'),
            type: 'post',
            data: $('form').serialize(),
            async: false,
            success: function(data) {
                if (data == 'true')
                {
                    testing = true;
                    $('form').attr('action', 'https://example.com');
                    $('form').submit();
                }
                else
                {
                    alert('Your username/password are incorrect');
                }
            },
            error: function() {
                alert('There has been an error, please alert us immediately');
            }
        });

        return testing;
    });
});

【讨论】:

  • 当您在任何输入上按 Enter 时会发生什么?它将提交打破了这个逻辑。
  • @RubenArevalo 禁用回车键,直到填写所有字段?如果表单没有所有必需的数据,您为什么要允许某人提交表单?
  • async:false 在这种情况下无关紧要。
  • @KevinB“没关系”以什么方式?
【解决方案2】:

在整个代码中重新选择所有表单标签不是一个好习惯,如果页面上有多个表单怎么办? 此外,您最好将.on().off() 与jQuery 一起使用。

$(document).ready(function() {
    $('form').on('submit', function(e) {
        e.preventDefault();

        // cache the current form so you make sure to only have data from this one
        var form = this,
            $form = $(form);

        $.ajax({
            url: form.action,
            type: form.method,
            data: $form.serialize(),
            success: function(data) {
                if (data == 'true')
                {
                    $form.attr('action', 'http://example.com').off('submit').submit();
                }
                else
                {
                    alert('Your username/password are incorrect');
                }
            },
            error: function() {
                alert('There has been an error, please alert us immediately');
            }
        });
    });
});

【讨论】:

  • 我会试试 .on() 看看是否有帮助。关于不使用表单标签,你是对的,但在这种情况下,页面上总是只有一个表单。如果是其他情况,我会在表单上添加一个 ID 属性并将其作为目标。
  • 即使你添加了一个 ID,我仍然会缓存对象,只是为了性能和代码的一致性。
【解决方案3】:

在一行中,您使用$('form') 选择表单以更改其操作,然后您使用$(this) 尝试选择相同的表单。我猜想回调函数中的this 不是你所期望的,它不是你的表单(可能是window 对象)。

只需链接调用:

$('form').attr('action', 'http://example.com').unbind('submit').submit();

【讨论】:

  • $(this) 实际上应该是 $('form'),这是我在代码中纠正的一个错误,忘记在我发布之前在 stackoverflow 帖子中对其进行编辑。嗯。关于链接,是的,我知道我可以一次完成所有操作,我只是更喜欢单独进行以便更好地了解
  • @adamj 老实说,代码对我来说看起来是正确的。您可能需要对其进行调试,查看 AJAX 请求返回的内容,查看代码的哪些部分正在触发,等等。
  • AJAX 很好,没有问题。当它第一次运行 .submit() 时,它会命中 AJAX,它会取回数据并成功。然后它应该 .unbind() 提交表单并重新提交表单,但重新提交永远不会发生。默认情况下,您可以通过提交将导致example.com 的表单立即知道它是否有效,但这不会发生。
猜你喜欢
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多