【问题标题】:jQuery Validate: Group Validation But Not Field ValidationjQuery Validate:组验证但不是字段验证
【发布时间】:2011-11-29 13:53:42
【问题描述】:

我正在使用 jquery validate 并且我已经设置了组。但是,我无法找出将每个组与其包含的各个字段分开验证的最佳方法。

为了说明这一点:

我有城市、州和邮编(按此顺序)。如果有人输入了 zip 的值,他们应该得到肯定的确认(我已经通过输入使该部分使用绿色复选标记),但是,只要状态和 zip 为空,组验证消息仍应显示。

在各种尝试中,我遇到了以下问题: - 用户跳过“城市”并显示验证消息,但是当为“zip”提供输入时,验证消息消失。 (这很奇怪......也许是一个错误?) - 用户输入“城市”,他们甚至在进入“状态”之前就收到了组错误消息 - 用户输入“城市”但不会得到复选标记,因为组中的其他输入为空

我倾向于通过覆盖“onfocusout”事件来解决这个问题(通过让它在 focusout 上检查组中的所有输入)但不确定是否有更好的方法通过一些 validate 的内置方法

谢谢!

*更新

我提出的解决方案相当丑陋,而且它们都不能始终如一地工作,下面是一个例子,它导致我上面列出的第一个问题的反面。现在验证消息仅在组中的最后一个字段被填写时显示。

也许组验证依赖于组中最后一个测试的验证结果?

无论如何...这是我目前所想出的烂摊子:

设置组:

groups : { location : 'city state zip' }

为组创建一个规则(注意它必须是一个数组以保持顺序):

rules : { location : ['city, 'state', 'zip']}

现在覆盖 onfocusout:

    onfocusout : function(el) {
        var groups = this.groups
            , elName = el.name
            , elGroup = groups[elName]
            , $el = $(el)

        if (!this.checkable(el) ){
            this.element(el));
        }

        // If the element belongs to a group, validate all elements in the group 
        // that come before the current element
        if (elGroup) {
            var groupMembers = this.settings.rules[elGroup];

            for (var i=0; i<groupMembers.length; i++) {
                if ( groupMembers[i] === elName ) {
                    break;
                }
                this.element( $('[name="' + groupMembers[i] + '"]') );
            }
        }
    }

【问题讨论】:

    标签: javascript jquery forms validation plugins


    【解决方案1】:

    这个插件的“群组”功能似乎有一些问题仍未解决,其中一些看起来与您的问题有关。

    https://github.com/jzaefferer/jquery-validation/issues/search?q=groups

    【讨论】:

    • 是的......我认为你是对的,但如果有人有合理的即时解决方案,我会坚持一段时间。了解我现在对 jquery validate 对组的支持的了解后,我会采取截然不同的方法:/
    • 为什么不把团体带出去呢?只需添加您自己的逻辑来检查分组项目的排列。听起来你已经用你的绿色复选标记做了一些事情。
    • 组现在必须作为权宜之计留下来......但是,最终,如果没有其他解决方案出现,我将不得不按照你的建议做,然后回到这个并实施我一个人处理所有的群组/消息...这可能是最好的解决方案,但它也将非常耗时
    【解决方案2】:

    您可以为此使用组,例如:

    $("form").validate({
        rules: {
            City: { required: true },
            Zip: { required: true },
            State: { required: true }
        },
        groups: {
            Location: "City Zip State"
        },
       errorPlacement: function(error, element) {
           if (element.attr("name") == "City" || element.attr("name") == "Zip" || element.attr("name") == "State") 
            error.insertAfter("#State");
           else 
            error.insertAfter(element);
       }
    });
    
    • 规则将 3 个字段设置为 true
    • 这些组将它们定义为一个组进行验证
    • errorPlacement 函数定义了错误消息的放置位置

    【讨论】:

    • hmmm...虽然这应该有效,但当我尝试它时,只要该组的最后一个成员通过测试,它就无法提供验证消息...?例如:当我离开城市时显示错误消息,但是当我将文本放入 zip 字段时它就消失了
    • 嗯,奇怪,好吧,让我看看我能不能修改一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多