在jQuery validate插件中指定验证的顺序

时间:2011-04-15 16:04:35

标签: jquery jquery-validate

我想知道是否可以指定验证器的运行顺序。

目前我编写了一个自定义验证器来检查它是否是[a-zA-Z0-9] +以确保登录验证我们的规则和远程验证器以确保登录可用但当前远程验证器已启动在我的自定义验证器之前。我想仅在元素验证我的自定义验证器时才启动远程验证器。

有任何线索吗?

感谢阅读

4 个答案:

答案 0 :(得分:3)

你需要增加/猴子补丁/覆盖(对你来说最合适的术语)验证插件在创建规则时使用$.fn.rules来运行一个字段以将规则推到第二位规则对象,在required规则之后。

如果您在脚本中搜索rules,则需要在if (data.required)

之前添加类似的逻辑
If (data.yourRuleName) {
    var param = data.yourRuleName;
    delete data.yourRuleName;
    data = $.extend({ yourRuleName: param }, data);
}

或者您可以复制rules部分,添加上面的部分并将其放在验证脚本之后引用的脚本中。这样,如果脚本发生更改,您将不必将这些更改应用于新版本的脚本(假设规则仍然以相同的方式工作)。

答案 1 :(得分:0)

据我所知,给定元素的规则按它们出现的顺序处理。 自版本1.12起,"需要"始终首先处理规则,并且"远程"最后。

答案 2 :(得分:0)

自上一封邮件以来已经有一段时间了,但这对某人可能有用...

例如,如果您想在同一标签上设置更多规则,则

<input data-rule-regex="(\w\d)+" data-rule-rangewords="[2,5]" data-rule-minlength="10" >

测试规则时,顺序与插入的顺序不同,因此在这种情况下会出现问题,因为如果插入以下字符串

abcdefghi

jquery验证程序将打印这些消息

1)与最小长度有关的第一条错误消息 2)与范围字相关的第二条错误消息 3)与正则表达式相关的第三条错误消息

但这是错误的,因为如果我已经插入了字符串

abcdefghi

出现的消息是最小长度的错误消息,现在我插入另一个字符

abcdefghil->长度10

这时我必须清理字符串,因为第二条错误消息告诉我,我必须在[2,5]之间准确插入至少两个或多个单词

在插入两个或两个以上的单词后,对于正则表达式同样如此,它将出现有关正则表达式的第三条错误消息,在这种情况下,我还必须清理字符串ect ...

此行为归因于jquery.validate.js中的方法列表

因为插件接受该命令...

所以,我的解决方法是:

为每个要在标签上插入此属性的规则输入

data-rule-(method you want)-order

并使用从零开始的索引对其进行初始化...

例如,在我们的案例中,我们有三个规则

<input 
data-rule-regex="(\w\d)+" data-rule-regex-order="0" 
data-rule-rangewords="[2,5]" data-rule-rangewords-order="1"
data-rule-minlength="10" data-rule-minlength-order="2"
ofcourse you need also the messages (if you want)
data-msg-regex="..." etc...
>

这时,如果您不想覆盖库(jquery.validate.js),则可以创建一个custom.js文件并插入以下代码:


$(document).ready(function() {
    (function($){
        $.validator.dataRules = function(element) {
            rules = {},
            $element = $( element ),
            type = element.getAttribute( "type" ),
            method, value, orderIndex, orderArr = {};

            for ( method in $.validator.methods ) {
                value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() +method.substring( 1 ).toLowerCase() );
                orderIndex = $element.data( "rule" + method.charAt( 0 ).toUpperCase() +method.substring( 1 ).toLowerCase() + "Order" );

                if(typeof orderIndex !== "undefined") orderArr[orderIndex] = {"rules":rules,"type":type, "method":method, "value":value};
            }       

            for ( var ord in orderArr ) this.normalizeAttributeRule( orderArr[ord].rules,orderArr[ord].type, orderArr[ord].method, orderArr[ord].value );

            return rules;

        }
    })(jQuery);             
});

我希望它将对您有用

m。

答案 3 :(得分:-1)