打开手风琴面板验证错误

时间:2012-07-14 00:09:14

标签: jquery jquery-validate validation jquery-ui-accordion

我正在使用jQuery手风琴将我的表单分成几个面板和jQquery验证来检查必需的字段。只要它们在打开的面板中,它就可以很好地显示已验证字段中的错误。

一个例子。假设我有树式手风琴面板,首先我有两个需要验证的表格字段。现在,如果访问者切换到面板二或三并提交表格而没有填写面板上的必填字段,我希望第一个手风琴面板打开并显示错误。

有人知道如何使这项工作吗?

这是我今天使用的代码:

$(document).ready(function() {
$("#accordion").accordion({
    autoHeight: false,
    navigation: true,
});

$("#validate_form").validate({
    rules: {
        page_title: "required",
        seo_url: "required",
        AccordionField: {
            required: true
        }
    },
    ignore: [],
    messages: {
        page_title: "Please enter a page title",
        seo_url: "Please enter a valid name"
    }
 }); 
});

3 个答案:

答案 0 :(得分:3)

要解决问题中的特定问题,您只需提供一个invalidHandler回调函数,该函数调用accordion小部件的activate()方法来打开第一个窗格:

$("#validate_form").validate({
    // your options,
    invalidHandler: function(form, validator) {
        if (validator.numberOfInvalids() > 0) {
            $("#accordion").accordion("activate", 0);
        }
    }
});

也就是说,处理一般情况(任何窗格上的无效元素)并切换到适当的窗格可能会更好。为此,我们必须从invalidHandler回调中获取第一个无效元素。我们可以匹配验证引擎使用的errorClass(默认情况下为error),但我们不能盲目匹配,因为该类也应用于错误消息标签。使用:input选择器限制结果对我们有所帮助。

从那里,我们可以使用closest()来匹配祖先手风琴窗格,并使用index()来获取相对于其他窗格的索引,这会引导我们看到以下代码:

$("#validate_form").validate({
    // your options,
    invalidHandler: function(form, validator) {
        if (validator.numberOfInvalids() > 0) {
            validator.showErrors();
            var index = $(":input.error").closest(".ui-accordion-content")
                                         .index(".ui-accordion-content");
            $("#accordion").accordion("activate", index);
        }
    }
});

更新:我们还必须在showErrors()中明确调用invalidHandler,因为此函数负责使用error类来装饰无效元素第一个地方,但通常只在事后调用。 (来源:http://forum.jquery.com/topic/jquery-validate-invalidhandler-is-called-before-the-errors-are-shown-maybe-better-vice-versa。)

答案 1 :(得分:3)

API稍有变化,这是一个基于所选答案的工作示例,适用于将来的任何人。请注意,ignore是防止手风琴中的隐藏字段被验证器忽略所必需的。{/ p>

$('form').validate({
    invalidHandler: function(event, validator) {
        if (validator.numberOfInvalids() > 0) {
            validator.showErrors();
            // Open accordion tab with errors
            var index = $(".has-error")
                .closest(".ui-accordion-content")
                .index(".ui-accordion-content");
            $(".accordion").accordion("option", "active", index);
        }
    },
    ignore: [],
});

答案 2 :(得分:0)

对于使用MVC的用户,将为您创建invalidHandler。 当我尝试覆盖它时(来自https://github.com/jzaefferer/jquery-validation/issues/765

$form.off('invalid-form.validate')
                .on('invalid-form.validate', newInvalidHandler);

表格总是会提交。

我的解决方案是拔出函数并在单击提交时调用它。 我还必须拔出ignore = []

function ShowPanel() {
    var validator = $("form").validate();
    if (validator.numberOfInvalids() > 0) {
        validator.showErrors();
        var index = $(".input-validation-error")
                    .closest(".ui-accordion-content")
                    .index(".ui-accordion-content");
        $("#accordion").accordion("option", "active", index);
    } 
}

$("#Save").click(function () { if (!$("form").valid()) { ShowPanel(); } });

$("form").data("validator").settings.ignore = [];