-1

我正在尝试在我的表单上初始化 jquery 验证器,因为它已经填充了来自数据库的数据,而不是在页面加载时。

这是因为在某些情况下,我根本不希望应用验证器。所以对于那些记录,我不调用验证器初始化。

当我填写表格时,我做的第一件事就是调用“resetEditForm”方法:

function resetEditForm() {
// REMOVE VALIDATOR
g$("#editESTIPRequestForm").removeData('validator')

// DO SOME MORE FORM RESET THINGS HERE
}

然后我用数据填写所有字段。然后我设置表单显示模式(只读/读/写):

function setFormMode(formStatusType) {
    switch (formStatusType) {
        case "ReadOnly":
            // FORM IS IN READ ONLY MODE
            g$('#tabCenter-Data input:not(.needsIDupdate):not(.hasSelect2), #tabCenter-Data textarea:not(.needsIDupdate):not(.hasSelect2)').attr('disabled', 'disabled');
            g$('#tabCenter-Data .hasSelect2').select2("disable");
            // HIDE "REQUIRED" INDICATORS
            g$('#tabCenter-Data .astric').hide();
            // HIDE ALL BUTTONS
            g$('#tabCenter-Data .button').hide();

            break;
        case "ReadWrite":
            // FORM IS IN READ/WRITE MODE
            g$('#tabCenter-Data input:not(.needsIDupdate):not(.hasSelect2), #tabCenter-Data textarea:not(.needsIDupdate):not(.hasSelect2)').removeAttr('disabled');
            g$('#tabCenter-Data .hasSelect2').select2("enable");
            // MAKE "REQUIRED" INDICATORS VISIBLE
            g$('#tabCenter-Data .astric').show();
            // SHOW ALL BUTTONS
            g$('#tabCenter-Data .button').show();

            setupValidator();
            break;
        default:
            break;
    }
}

这是应该在表单上初始化验证器的函数:

function setupValidator() {

    g$("#editESTIPRequestForm").validate({
        ignore: null,
        errorElement: "span",
        rules: {
            detailsStatus: {
                required: true
            },
            detailsJobType: {
                required: true
            },
            detailsMpoRural: {
                required: true
            },
            detailsResponsiblePartyJurisdiction: {
                required: true
            },
            detailsTipID: {
                regexAllowedCharacters: true
            },
            detailsRoute: {
                required: true,
                regexAllowedCharacters: true
            },
            detailsLocationRpt: {
                required: true,
                regexAllowedCharacters: true
            },
            detailsWorkType: {
                required: true
            },
            detailsTransSystem: {
                required: true
            },
            detailsWorkDescriptionRpt: {
                required: true,
                regexAllowedCharacters: true
            },
            detailsTemplate: {
                required: true
            },
            detailsAirQualityConformityRequired: {
                required: true
            },
            detailsEmissionsCO: {
                number: true
            },
            detailsEmissionsCO2: {
                number: true
            },
            detailsEmissionsNox: {
                number: true
            },
            detailsEmissionsVoc: {
                number: true
            },
            detailsEmissionsPM2: {
                number: true
            },
            detailsAuthorComments: {
                regexAllowedCharacters: true
            },
            detailsMdotComments: {
                regexAllowedCharacters: true
            },
            detailsLetIndicator: {
                required: function (element) {
                    return (currentUserRole == "ADMN" || currentUserRole == "MDOT");
                }
            },
            detailsNonLetReason: {
                required: function (element) {
                    var selectedLetIndicatorValue = g$("input:radio[name='detailsLetIndicator']:checked").val();
                    return ((currentUserRole == "ADMN" || currentUserRole == "MDOT") && (selectedLetIndicatorValue == "NonLet"));
                }
            },
            detailsScheduledLetDate: {
                required: function (element) {
                    return (currentUserRole == "ADMN" || currentUserRole == "MDOT");
                }
            }
        },
        onsubmit: false,
        errorClass: "invalid",
        errorPlacement: function (error, element) {
            if (g$(element).hasClass("hasSelect2")) {
                //error.appendTo(g$(element).prev());
                error.insertAfter(g$(element).prev("div"));
            } else if (g$(element).is("input:radio")) {
                var groupName = g$(element).attr("name");
                error.insertAfter(g$("input:radio[name=" + groupName + "]:last + label"));
            } else {
                error.insertAfter(g$(element));
            }
        },
        highlight: function (element, errorClass, validClass) {
            var elementToWorkOn = element;
            if (g$(element).hasClass("hasSelect2")) {
                elementToWorkOn = g$(element).prevAll("div");
            } else if (g$(element).is("input:radio")) {
                var groupName = g$(element).attr("name");
                elementToWorkOn = g$("input:radio[name=" + groupName + "]");
            }

            g$(elementToWorkOn).addClass(errorClass).removeClass(validClass);
        },
        unhighlight: function (element, errorClass, validClass) {
            var elementToWorkOn = element;
            if (g$(element).hasClass("hasSelect2")) {
                elementToWorkOn = g$(element).prevAll("div");
            }

            g$(elementToWorkOn).removeClass(errorClass).addClass(validClass);

            if (this.numberOfInvalids() == 0) {
                g$("#estipFormErrorMessageBox").hide();
            }
        },
        invalidHandler: function (form, validator) {
            g$("#estipFormErrorMessageBox").show();
        }
    });
}

但是,验证规则永远不会应用于表单。

我究竟做错了什么?

4

1 回答 1

0

我建议您.validate()在 a 内进行初始化document.ready,但不要使用规则。然后根据需要使用rules('add')方法加载规则。还用于在创建规则后rules('add')立即将规则添加到动态创建的input字段中。

看这个演示。 单击提交按钮,没有任何反应(没有规则)。然后单击“加载规则”按钮,突然表单验证将在下一个适用事件上激活。

演示:http: //jsfiddle.net/BYWAb/

$(document).ready(function () {

    $('#myform').validate({
        // other options
    });

    //enclose the following block within whatever required to load these rules
    // function setFormMode(formStatusType) { // whatever
    // switch (formStatusType) { // whatever
        ...

        $('.myclass').each(function () {
            $(this).rules('add', {
                required: true,
                minlength: 5
            });
        });

    // end block

});
于 2013-01-29T17:40:08.533 回答