jQuery验证:由某个规则触发的回调?

时间:2010-10-08 15:06:03

标签: jquery validation jquery-plugins jquery-validate

我正在尝试执行以下操作: 我有一个使用jQuery Validation Plugin验证的表单。有一个领域有几个规则:

            var validator = $("#myForm").validate({ 
                rules: {
                    emailForRequest: { 
                        required: true, 
                        email: true,
                        remote: "'emailcheck.php"
                    } 
                } ,
...

现在,当其中一条规则被破坏时,更确切地说是远程规则,我想触发一些额外的代码。因此,如果远程规则返回错误并且它的错误标签出现在emailForRequest字段旁边,我需要一个回调来在后台执行其他一些操作。

简而言之:我可以看到哪个规则会触发错误,我会在代码中看到它,并附加一个额外函数的执行吗?


修改 好的,感谢Liam的回答以及我对此手册的更好阅读:

        rules: {
            emailForRequest: { 
                required: true, 
                email: true,
                remote: {
                    url: "'emailcheck.php" ,
                    type: "post" ,
                    complete: function(data){
                        if( data.responseText != "true" ) {
                            alert("Sorry mate, this email address was registered but never activated!");
                        }
                    }
                }
            } 
        } , ...

但仍存在一个问题。 emailcheck.php脚本可以返回3个不同的结果,其中一个是真的,另外两个是依赖于语言的。所以我想发送一个json对象作为响应,其中包含错误类型的var(在所有语言中都相同)和带有消息的var(已转换)。所以,在我的完整函数中,我可以检查错误类型并根据它做出响应。很容易,除了它会搞砸我应该出现在我的字段旁边的验证标准错误,我还没有找到解决方案。

5 个答案:

答案 0 :(得分:7)

不确定此线程是否仍处于打开状态,但我能够通过addMethod调用解决此问题,并使用数组来跟踪该表单元素的错误消息。

这是代码

//phone
var phoneStatus = null;
$.validator
.addMethod(
    'validatePhone',
    function()
    {
        $.ajax({
            url: /path/to/script,
            async: false,
            dataType: 'json',
            data:{ formDataHere},
            success: function(data)
            {
                errorMessages['validatePhone'] = data.message;
                phoneStatus = data.status;
            },
            complete: function(){},
            error: function(){}
        });
        return phoneStatus;
    },
    function()
    {
        return errorMessages['validatePhone'];
    }
);

答案 1 :(得分:1)

现在我有适当的时间阅读手册,试试这个

var validator = $("#myForm").validate({ 
            rules: 
               {
                emailForRequest: 
                { 
                    required: true, 
                    email: true,
                    remote: "emailcheck.php"
                }
            },
            messages:
            {
              emailForRequest:
               {
                remote: jQuery.format("{0}")
               }
            }

       });

答案 2 :(得分:1)

jquery.validate.js - 第941行:

success: function(response) {
    validator.settings.messages[element.name].remote = previous.originalMessage;
    var valid = response === true;
    if ( valid ) {
    ....

我认为你可以很容易地在这里插入你自己的功能。您同时拥有响应和元素名称,因此使用特定名称定位元素相当容易。如果您不想修改脚本本身(即从CDN服务器加载),您可以根据原始脚本编写自己的远程验证规则。

除此之外,AFAIK还没有内置函数/方法可以返回未验证的规则名称。

<强>更新

找到规则和触发它的元素的解决方法是在errorPlacement函数中处理它:

...
},
errorPlacement: function(error, element) {
    error.insertBefore(element); // default positioning

    if ((error == 'your error message') && (element.attr('id') == 'your_targets_id')) {
        // your function 
    }
},
...

希望这有帮助。

答案 3 :(得分:0)

感谢FreekOne和他对前缀的想法,我找到了一个可行的解决方案。我说可行,因为我对它的清洁度不是很满意。由于我不确切知道在验证器中发生了什么,并且修改了dataFilter并且ajax调用的成功功能中断了验证器的正常工作,因此我使用“隐藏”前缀来到以下解决方案:

var validator = $("#myForm").validate({ 
                rules: {
                    emailForRequest: { 
                        required: true, 
                        email: true,
                        remote: {
                            url: "emailcheck.php" ,
                            type: "post" ,
                            complete: function(data){
                                if( data.responseText != true ) {
                                    if( data.responseText.search(/validationErrorTag/) > 0 &&
                                        data.responseText.search(/inactive/) > 0 ) {
                                         inactiveFunctionality();
                                    }
                                }
                            }
                        }
                    } 
                } ,...

虽然emailcheck.php返回json编码为true,如果所有内容都检出或json编码的错误消息,如

<span class="validationErrorTag">inactive</span>This address is not yet activated.

最后,我的css文件中有一个条目,以确保前缀不显示:

.validationErrorTag {
    display: none;
}

就像我说的,它可行,我现在将使用它,但使用隐藏的html前缀来识别错误消息对我来说似乎有点粗糙。所以,如果有人知道更好的解决方案,请告诉我。

答案 4 :(得分:0)

var validator = $("#myForm").validate({ 
    rules: {
         emailForRequest: { 
                required: true, 
                email: true,
                remote: {
                    url: "emailcheck.php" ,
                    type: "post" ,
                    complete: function(data){
                        if( data.responseText != true ) {
                            var type = data.responseText.split('|');
                            if(type[0]=='inactive') {
                                         inactiveFunctionality();
// type[1] contains your message, display it using any method! e.g. $('#id').html(type[1]); or sooo!
                                    }
                                }
                            }
                        }
                    } 
                }

*或**

你可以用json!只需以json格式发送响应文本,并根据“。”进行检查。财产准入。