Javascript 如何在AJAX调用后继续表单提交?

Javascript 如何在AJAX调用后继续表单提交?,javascript,ajax,jquery,jquery-post,Javascript,Ajax,Jquery,Jquery Post,我想在点击submit按钮时验证WordPress帖子上的用户条目,在出现问题时显示错误消息,如果一切正常,则提交表单。我有一个PHP函数进行检查,如果form_data中的数据正常,则返回true,否则返回一些错误代码。下面的JavaScript发出AJAX请求,并应在成功检查后继续提交表单,但没有: jQuery(document).ready(function() { jQuery('#post').submit(function() {

我想在点击submit按钮时验证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
            });
        });

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

简短的回答:你不能这样做

一些背景:作为参数提供给函数(如
$.post
)的回调是异步执行的。这意味着您将在执行成功回调之前
返回继续
,并且
继续
将始终为
。使用断点,如果等待成功回调执行,
继续
将为
,一切正常

因此,如果希望在ajax请求完成后提交表单,则必须使用javascript提交表单。使用jQuery非常简单,只需执行jQuery
$。使用
数据:$(“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();
编辑:


您还需要在回调中为
$启用“ajax加载”/按钮。post
出于上述相同的原因—事实上,它们会在ajax调用返回之前立即发生。

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

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

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

    }
});

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

您的意思是用JQuery Validate或类似的东西进行验证吗?我可以用它来进行Ajax调用吗?使用常规按钮来进行Ajax调用,而不是使用提交按钮。当您想要提交表单时,请用代码提交表单。明白了。我最后也这么做了,它实际上解决了保存草稿而不发布帖子的问题。谢谢我认为这是最简单也是最好的方法,在尝试了3天后,将提交按钮更改为正常的“a href”按钮,并使用$(document.ajaxComplete(function(){//to do})控制表单;调用$(#您的表单id).submit();提交关于服务器端验证的良好观点;我现在正在想这个。我需要确保包含无效/不完整数据的帖子不会被发布,这就是为什么我认为服务器端是最好的选择。当存在未满足的需求时,是否可以禁用提交(发布)按钮?如果用户禁用了JavaScript怎么办?这会增加很多开销吗?前端验证的开销非常小。如果($('your field').val().lengthjQuery
,而不是
$
…哇,你刚刚救了我客厅的窗户、我的电脑和我最后一点耐心。我不理解(现在仍然不理解)为什么ajax事件不能阻止并发出完成信号,并允许进行常规表单处理。这是可行的,但我不明白为什么在测试这些异能的时候,这个场景没有出现。
$.ajax({
    type: 'POST',
    url: ajaxurl,
    async:false,
    data: data,
    timeout:3000,
    success: function(){

    }
});