5

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

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

有谁知道使这项工作的方法?

这是我今天使用的代码:

$(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"
    }
 }); 
});
4

3 回答 3

4

要解决您问题中的具体问题,您只需提供一个invalidHandler回调函数,该函数调用手风琴小部件的activate()方法即可打开第一个窗格:

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

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

从那里,我们可以使用最接近的()来匹配祖先的手风琴窗格,并使用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。)

于 2012-07-15T08:21:35.407 回答
3

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

$('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: [],
});
于 2014-01-07T16:46:06.253 回答
0

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

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

该表单将始终提交。

我的解决方案是拉出函数并在单击提交时调用它。我还不得不拔出忽略=[]

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 = [];
于 2014-12-30T18:41:50.237 回答