jQuery Validator - 显式通知验证器元素的有效状态更改

时间:2011-07-06 16:42:00

标签: javascript jquery ajax validation jquery-validate

我有一个自定义验证器方法,它会根据我接受的邮政编码数据库检查输入的邮政编码。我想让这个请求异步。以下是目前的情况:

jQuery.validator.addMethod("validZip", function(value, element){
    var isValid = false;
    $.ajax({
        url: '/xpress/wp-admin/admin-ajax.php',
        data: {action:"test_checkZip", zip:value},
        type:"POST",
        async: false,
        success: function(result){
            if (result == 0){
                isValid = false;
            } else {
                isValid = true;
            }
        } 
    });
    return isValid;
}, '*');

此请求要求它是同步的,因为它正在更新由包装函数返回的变量。如果我要异步执行此操作,请求将以非阻塞方式完成。该函数将执行,执行请求,但是等待响应更新它将返回的布尔值。它将在ajax完成之前返回默认的false值并将其更新为true。

我需要显式通知验证器事件已经更改,需要重新验证控件。如何实现通知验证器的想法?

我需要做这样的事情:

jQuery.validator.addMethod("validZip", function(value, element){
    $.ajax({
        url: '/xpress/wp-admin/admin-ajax.php',
        data: {action:"test_checkZip", zip:value},
        type:"POST",
        async: true,
        success: function(result){
            if (result == 0){
                notifyZipControl(false)
            } else {
                notifyZipControl(true)
            }
        } 
    });
}, '*');

function notifyZipControl(isValid){
    if (isValid){
        // update the validator so the control becomes VALID
    } else {
        // update the validator so the control becomes INVALID
    }
}

这个想法是否可以实现?

1 个答案:

答案 0 :(得分:2)

使用remote rule

绝对可以实现
$("form").validate({
    rules: {
        zip: {
            remote: {
                url: "/xpress/wp-admin/admin-ajax.php",
                data: {
                    /* supply data besides the field value here: */
                    action: "test_checkZip"
                }
            }
        }
    }
});

在幕后,验证只是使用$.ajax电话,因此您应该能够提供所需的灵活性。

这是一个(差)示例,只是检查邮政编码是否长5个字符(并没有真正以有意义的方式访问服务器,但希望它会给你一个很好的起点):http://jsfiddle.net/HYLS4/