如何在AJAX调用后继续表单提交
How to continue form submission after an AJAX call?
我想在点击提交按钮时验证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问题,最初对我不起作用,因为表单没有提交。我发现,如果绑定到.submit()
的jQuery函数返回true,那么应该提交表单,所以这就是我试图实现的。对于上面的代码,它一开始似乎不起作用(在没有错误的情况下不会提交表单),但经过Firebug的仔细检查,如果在return proceed
行插入断点,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;
});
});
简短的回答:你不能——不能用这种方式。
一些背景:作为参数提供给函数(如$.post
)的回调是异步执行的。这意味着您将在执行成功回调之前执行return proceed
,并且proceed
将始终为false
。有了断点,如果等到成功回调执行完毕,proceed
将是true
,一切都会好起来。
因此,如果您想在ajax请求完成后提交表单,则必须使用javascript提交。使用jQuery这很容易,只需使用data: $("yourForm").serialize()
和url: yourForm.action
执行jQuery $.post
即可。
这基本上就是你已经在做的,你只需要重复对你真正想要发布数据的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加载"/按钮——事实上,它们将在ajax调用返回之前立即发生。
将按钮绑定到验证函数,而不是提交。如果它通过了验证,请调用submit()。
Wordpress有自己的机制来处理Ajax请求,使用wp-admin/wp-ax.php。这允许您在Ajax边界的任何一侧运行任意代码,而不必编写来回的状态检查代码等等。设置你的回调并开始。。。。
真正的问题是-为什么要在服务器端进行验证?为什么你不能在写帖子之前加载验证标准?然后您的验证可以实时进行,而不是在提交时进行。
jquery.post是异步执行的,这意味着JS在得到回复之前将继续。你被Diodeus的答案卡住了——将按钮绑定到validtion,然后validtion提交表单(这使它不会很好地降级),或者将$.post更改为ajax并关闭async,这将迫使它在继续之前等待响应。。。可能会将JS锁定在您的页面上,直到超时。
$.ajax({
type: 'POST',
url: ajaxurl,
async:false,
data: data,
timeout:3000,
success: function(){
}
});
- HTML表单提交时未执行外部函数
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 将图像上传ajax与表单提交ajax相结合
- Javascript无法处理表单提交
- 如何在我的情况下禁用表单提交
- 加载后的页面与ajax表单提交不起作用
- angularjs-控制器在表单提交时未调用
- 禁用带有字符白名单的表单提交
- 如何使用Google Analytics跟踪表单提交
- 使用javascript将表单提交到iframe目标中
- e.preventDefault在表单提交时被忽略
- AngularJS JQuery Ajax表单提交等效
- JavaScript表单提交帮助
- PHP表单提交和重定向
- 当所有输入文本字段都为空时,禁止表单提交,但当jquery中的任何字段不为空时允许提交
- setTimeOut AFTER jQuery表单提交
- 从函数中选择要触发表单提交的正确元素
- 如何在AJAX调用后继续表单提交
- 防止表单提交,使用Ajax检查记录,如果有记录,请继续ASP.NET MVC
- 如何暂停表单提交,最后一次验证,在最后和之后释放/触发/继续提交