Javascript 如何在AJAX调用后继续表单提交?
我想在点击submit按钮时验证WordPress帖子上的用户条目,在出现问题时显示错误消息,如果一切正常,则提交表单。我有一个PHP函数进行检查,如果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() {
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(){
}
});