Php 使用ajax停止post提交
我想对我制作的一些自定义帖子类型进行预验证,我决定使用ajax进行预验证,因此我编写了以下代码: 为脚本添加内容:Php 使用ajax停止post提交,php,jquery,ajax,wordpress,Php,Jquery,Ajax,Wordpress,我想对我制作的一些自定义帖子类型进行预验证,我决定使用ajax进行预验证,因此我编写了以下代码: 为脚本添加内容: function hazeracareer_admin_scripts(){ global $post_type; if ( $post_type == 'job' ) { $theme_uri = get_stylesheet_directory_uri(); wp_register_script('pre-job-sub
function hazeracareer_admin_scripts(){
global $post_type;
if ( $post_type == 'job' ) {
$theme_uri = get_stylesheet_directory_uri();
wp_register_script('pre-job-submit-validation', $theme_uri . '/admin/js/pre-job-submit-validation.js', array('jquery'), '2133672');
wp_localize_script('pre-job-submit-validation', 'secure', array('nonce' => wp_create_nonce('hazeracareer_pre_job_submit_validation')));
wp_enqueue_script('pre-job-submit-validation');
}
}
add_action('admin_enqueue_scripts', 'hazeracareer_admin_scripts');
JS文件:
jQuery(document).ready(function ($) {
$('#post').submit(function () {
var form_data = $('#post').serialize();
var nonce = secure.nonce;
var data = {
action: 'hazeracareer_pre_job_submit_validation',
security: nonce,
form_data: form_data
};
$.post(ajaxurl, data, function (response) {
if ( response == 0 ) {
alert('The Job Number You entered is already exists in another job!');
return false;
} else {
return true;
}
});
});
});
处理ajax请求并进行验证:
function hazeracareer_pre_job_submit_validation(){
check_ajax_referer('hazeracareer_pre_job_submit_validation', 'security');
$post = array();
parse_str($_POST['form_data'], $post);
if ( !isset($post['fields']['field_job_number']) )
return;
$jobs = get_posts(array(
'post_type' => 'job',
'post_status' => array('publish', 'draft'),
'posts_per_page' => -1,
'meta_key' => 'job_number',
'meta_value' =>$post['fields']['field_job_number']
));
if ( empty($jobs) ) {
echo 1;
}
echo 0;
wp_die();
}
add_action('wp_ajax_hazeracareer_pre_job_submit_validation', 'hazeracareer_pre_job_submit_validation');
但是,即使我收到错误警报,您输入的作业编号已存在于另一个作业中!,在我按下OK键后,表单确实提交了,我收到了管理员通知,确认帖子已经更新。
在发出警报后,我返回false,因此不应提交表单。
我在网上搜索,似乎什么都没用。我错过了什么
提前感谢您的问题在于您在嵌套函数中返回false。看看你的代码
jQuery(document).ready(function ($) {
$('#post').submit(function () {
//...
//you need to return from within this function
$.post(ajaxurl, data, function (response) {
//...
//you are instead returning from this function, which will not stop the form submission
});
});
});
我解决这个问题的方法是使用某种类型的持久变量,以便知道您的验证是否通过。例如,
jQuery(document).ready(function($) {
//protect scope
$(function() {
//track the validation
var valid = false;
//form submit
$('#post').on('submit', function(evt) {
if( valid === true )
return true; //now the form will submit!
//not valid yet! Perform validation
$.post(ajaxurl, data, function(response) {
//was the response valid?
if( response_is_valid ) {
valid = true;
$('#post').trigger('submit'); //trigger the submit event, which will submit the form since valid is not true
}else {
//display some error to the user
}
});
//always returning false otherwise, so the form never submits
return false;
});
});
});
改变
到
或者另一个选项是不要使用提交按钮。使用带有单击事件的按钮。检查是否一切正常,如果是,则执行以下操作:
....
if (fine = true){
$("#post").submit();
}
...
你放在文档中的“$函数”的用途是什么。准备好了吗?感谢您的帮助这是一个自我呼叫功能。我使用它来保护变量范围。由于var valid是在此函数内创建的,因此该变量不会污染此函数之外的范围。
$('#post').submit(function (e) {
e.preventDefault();
....
....
if (fine = true){
$("#post").submit();
}
...