【问题标题】:How to continue form submission after an AJAX call?如何在 AJAX 调用后继续提交表单?
【发布时间】:2012-02-17 15:33:02
【问题描述】:

我想在点击提交按钮时验证 WordPress 帖子上的用户条目,如果有问题则显示错误消息,如果一切正常则提交表单。我有一个 PHP 函数进行检查,如果 form_data 中的数据正常,则返回 true,否则返回一些错误代码。以下 JavaScript 发出 AJAX 请求,并且应该在成功检查后继续提交表单,但它没有:

        jQuery(document).ready(function() {
            jQuery('#post').submit(function() {

                var form_data = jQuery('#post').serializeArray();
                var data = {
                    action: 'ep_pre_submit_validation',
                    security: '<?php echo wp_create_nonce( 'pre_publish_validation' ); ?>',
                    form_data: jQuery.param(form_data),
                };
                var proceed = false;
                jQuery.post(ajaxurl, data, function(response) {
                    if (response.indexOf('true') > -1 || response == true) {
                        proceed = true;
                    } else {
                        alert("Error: " + response);
                        proceed = false;
                    }
                });
                jQuery('#ajax-loading').hide();
                jQuery('#publish').removeClass('button-primary-disabled');
                return proceed; //breakpoint here makes the code run
            });
        });

代码改编自WPSE question,由于表单未提交,它最初对我不起作用。我发现如果绑定到.submit()的jQuery函数返回true,则应该提交表单,所以这就是我尝试实现的。使用上面的代码,一开始它似乎不起作用(没有错误时不会提交表单),但是在仔细检查 Firebug proceed 后,如果在return proceed 线。如果我在遇到断点时稍等片刻,然后继续执行,它可以按预期使用有效数据。如果有错误,则发出警报没有问题。

处理此问题的最佳方法是什么?

编辑

根据下面的@Linus 回答,以下代码适用于有效和无效数据:

        jQuery(document).ready(function() {
            jQuery('#post').submit(function() {
                if(jQuery(this).data("valid")) {
                    return true;
                }

                var form_data = jQuery('#post').serializeArray();
                var data = {
                    action: 'ep_pre_submit_validation',
                    security: '<?php echo wp_create_nonce( 'pre_publish_validation' ); ?>',
                    form_data: jQuery.param(form_data),
                };
                jQuery.post(ajaxurl, data, function(response) {
                    if (response.indexOf('true') > -1 || response == true) {
                        jQuery("#post").data("valid", true).submit();
                    } else {
                        alert("Error: " + response);
                        jQuery("#post").data("valid", false);

                    }
                    //hide loading icon, return Publish button to normal
                    jQuery('#ajax-loading').hide();
                    jQuery('#publish').removeClass('button-primary-disabled');
                });
                return false;
            });
        });

【问题讨论】:

    标签: javascript ajax jquery jquery-post


    【解决方案1】:

    简答:你不能——不能以这种方式。

    一些背景知识:作为参数提供给$.post 等函数的回调是异步执行的。这意味着您将return proceed您的成功回调已执行,而proceed 将始终为false。使用断点,如果等到成功回调执行完毕,proceed 将变为 true,一切都会好起来的。

    因此,如果您想在 ajax 请求完成后提交表单,您必须使用 javascript 提交。使用 jQuery 很简单,只需使用 jQuery $.postdata: $("yourForm").serialize()url: yourForm.action

    这基本上是你已经在做的,你只需要重复调​​用你实际想要发布数据的 URL。

    编辑:

    另一种方法是在您的表单上设置一个属性,例如valid,然后在您的submit 处理程序中检查:

    jQuery("#post").submit(function() {
        if($(this).data("valid")) {
            return true;
        }
        // Rest of your code
    });
    

    在验证 ajax 请求的成功回调中,您将设置/清除该属性,然后提交:

    $("#post").data("valid", true).submit();
    

    编辑:

    出于与上述相同的原因,您还希望在 $.post 的回调中启用“ajax-loading”/按钮 - 事实上,它们会在您的 ajax 调用返回之前立即发生。

    【讨论】:

    • 绝妙的解决方案!一开始我有点挣扎,但后来我意识到它不起作用,因为在 WordPress 中,jQuery 必须被称为 jQuery 而不是 $...
    • 哇,你刚刚拯救了我客厅的窗户、我的电脑和我最后一丝耐心。我不明白(仍然不明白)为什么 ajax 事件不能阻塞然后发出完成信号并允许进行常规表单处理。这行得通,但我无法理解为什么在测试这个权力时没有出现这种情况。
    【解决方案2】:

    将您的按钮绑定到验证函数而不是提交。如果它通过验证,则调用 submit()。

    【讨论】:

    • 您的意思是使用 JQuery Validate 或类似的东西进行验证?我可以用它进行 Ajax 调用吗?
    • 使用常规按钮代替提交按钮来进行 AJAX 调用。当你想提交表单时提交代码。
    • 明白了。我最终也这样做了,它实际上解决了保存草稿但没有发布帖子的处理。谢谢!
    • 我认为这是尝试 3 天后最简单和最好的方法,将您的提交按钮更改为普通的“a href”按钮并使用 $(document).ajaxComplete(function() { //去做 });调用 $(#your-form-id).submit();提交
    【解决方案3】:

    Wordpress 有自己的机制来处理 Ajax 请求,使用 wp-admin/wp-ajax.php。这允许您在 Ajax 边界的任一侧运行任意代码,而无需编写来回状态检查代码等。设置你的回调并开始......

    【讨论】:

      【解决方案4】:

      真正的问题是 - 你为什么要在服务器端进行验证?为什么你不能在之前加载验证标准 - 因为正在写帖子?然后您的验证可以实时进行,而不是在提交时进行。

      jquery.post 是异步执行的,这意味着 JS 在收到回复之前会继续执行。你被 Diodeus 的答案困住了——将按钮绑定到验证,然后提交表单(这使得它不能很好地降级),或者将你的 $.post 更改为 ajax 并关闭异步,这将迫使它在继续之前等待响应...可能会锁定页面上的 JS 直到超时。

      $.ajax({
          type: 'POST',
          url: ajaxurl,
          async:false,
          data: data,
          timeout:3000,
          success: function(){
      
          }
      });
      

      【讨论】:

      • 关于服务器端验证的要点;我现在只是在想这个。我需要确保不会发布包含无效/不完整数据的帖子,这就是为什么我认为服务器端是要走的路。也许在有未满足的要求时禁用提交(发布)按钮?如果 JavaScript 被用户禁用了怎么办?这会增加很多开销吗?
      • 前端验证的开销非常小。 if ($('your field').val().length
      猜你喜欢
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2020-06-28
      • 2016-07-24
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多