【问题标题】:jQuery Validate - how to prevent the plugin from validating onblur events for a specific feature?jQuery Validate - 如何防止插件验证特定功能的 onblur 事件?
【发布时间】:2014-01-24 16:51:47
【问题描述】:

当模糊事件发生时,是否有办法阻止 jQuery validate 验证表单?

我有三对开始/结束日期,这六个字段中的每一个都使用 DatePicker 加上每对日期验证该对的另一个字段是否已填写,因为如果填写了结束日期则无法提交表单但开始日期不是,反之亦然。

当用户从 DatePicker 中选择一个日期,浏览器触发 blur 事件并且 jQuery validate 尝试验证表单并意识到该对的另一个字段为空,然后显示错误消息时,就会出现问题。除了当用户填写该对的第二个字段时,在该字段被填写之前再次触发 blur 事件,并且验证插件会显示错误消息。

HTML:

<form>
    <table width="95%" id="tabela_interna">
        <thead><tr valign="middle"><th colspan="6">Report</th></tr></thead>
            <tbody>
                <tr valign="middle">
                    <td width="14%" align="left" class="td_label"><label for="dataInicialSolicitacao">Data de Solicita&ccedil;&atilde;o Inicial</label></td>
                    <td width="25%" align="left" class="td_dados">
                        <input type="text" name="filtro.dataInicialSolicitacao" size="12" value="" id="dataInicialSolicitacao" class="data atLeastOneRequired"/>
                    </td>
                    <td width="12%" align="left" class="td_label"><label for="dataFinalSolicitacao">Data de Solicita&ccedil;&atilde;o Final</label></td>
                    <td width="25%" align="left" class="td_dados">
                        <input type="text" name="filtro.dataFinalSolicitacao" size="12" value="" id="dataFinalSolicitacao" class="data atLeastOneRequired"/>
                    </td>
                </tr>
                <tr valign="middle">
                    <td width="14%" align="left" class="td_label"><label for="dataInicialLiberacao">Data de Libera&ccedil;&atilde;o Inicial</label></td>
                    <td width="25%" align="left" class="td_dados">
                        <input type="text" name="filtro.dataInicialLiberacao" size="12" value="" id="dataInicialLiberacao" class="data atLeastOneRequired"/>
                    </td>
                    <td width="12%" align="left" class="td_label"><label for="dataFinalLiberacao">Data de Libera&ccedil;&atilde;o Final</label></td>
                    <td width="25%" align="left" class="td_dados">
                        <input type="text" name="filtro.dataFinalLiberacao" size="12" value="" id="dataFinalLiberacao" class="data atLeastOneRequired"/>
                    </td>
                </tr>
                <tr valign="middle">
                    <td width="14%" align="left" class="td_label"><label for="dataInicialInternacao">Data de Interna&ccedil;&atilde;o Inicial</label></td>
                    <td width="25%" align="left" class="td_dados">
                        <input type="text" name="filtro.dataInicialInternacao" size="12" value="" id="dataInicialInternacao" class="data atLeastOneRequired"/>
                    </td>
                    <td width="12%" align="left" class="td_label"><label for="dataFinalInternacao">Data de Interna&ccedil;&atilde;o Final</label></td>
                    <td width="25%" align="left" class="td_dados">
                        <input type="text" name="filtro.dataFinalInternacao" size="12" value="" id="dataFinalInternacao" class="data atLeastOneRequired"/>
                    </td>
                </tr>
        </tbody>
    </table>
</form>

我们编写的 jQuery 插件:

$.fn.aplicaLayoutPersonalizavel = function() {
    personalizaAplicacao();
    return this;
};

function personalizaAplicacao() {
    $(".data").apagaDataInvalida().mask("99/99/9999").numeric().datepicker().attr("maxlength", 10);
}

$.validator.setDefaults({
    errorContainer : "#msgErros ul",
    errorLabelContainer: "#msgErros",
    wrapper: "li",
    submitHandler: function(form) {
        var erros = $("div#msgErros");
        if (typeof $("#acao").val() === "undefined") {
            if (erros.length > 1) {
                erros.empty();
            }
            stopAnimating();
            erros.html("<ul><li>O parâmetro ação deve ser definido.</li></ul>");
            erros.show();
            return false;
        }

        $.blockUI();
        var dadosRelatorio = $(form).formSerialize();
        switch (parseInt($("#acao").val())) {
            case 1:
                if (typeof urlRelatorio !== 'undefined' && urlRelatorio != null) {
                    $("#respostaRelatorio").jqGrid("GridUnload");
                    $("#respostaRelatorio").jqGrid({
                        url: urlRelatorio + "?" + dadosRelatorio,
                        colModel: modeloColunas,
                        autowidth: typeof larguraAutomatizada !== "undefined" && larguraAutomatizada != null ? larguraAutomatizada : false
                    });
                } else {
                    form.submit();
                }
                break;
            case 2:
                downloadArquivo(urlExportarExcel, dadosRelatorio);
                break;
            case 3:
                downloadArquivo(urlExportarPdf, dadosRelatorio);
                break;
        }
    },
    invalidHandler: function() { stopAnimating(); }
});

$.fn.inicializaValidacaoFormulario = function() {
    $("form").validate({
        rules: typeof regras !== "undefined" && regras != null ? regras : {},
        messages: typeof mensagens !== "undefined" && mensagens != null ? mensagens : {},
        agrupamentos: typeof agrupamentos !== "undefined" && agrupamentos != null ? agrupamentos : {}
    });
    return this;
};

验证:

regras = {
    "filtro.codigoProcedimento": { range: [1, 9223372036854775807] },
    "filtro.codigoHospital": { range: [1, 9223372036854775807] },
    "filtro.codigoSegurado": { range: [1, 9223372036854775807] },
    "filtro.numeroSolicitacao": { range: [1, 2147483647] },
    "filtro.dataInicialSolicitacao": { require_from_group: [1, ".atLeastOneRequired"], ifDateIsFilledOtherOneIsMandatory: "#dataFinalSolicitacao", maximunDifferenceBetweenDates: ["#dataFinalSolicitacao", 90] },
    "filtro.dataFinalSolicitacao": { require_from_group: [1, ".atLeastOneRequired"], ifDateIsFilledOtherOneIsMandatory: "#dataInicialSolicitacao", maximunDifferenceBetweenDates: ["#dataInicialSolicitacao", 90] },
    "filtro.dataInicialInternacao": { require_from_group: [1, ".atLeastOneRequired"], ifDateIsFilledOtherOneIsMandatory: "#dataFinalInternacao", maximunDifferenceBetweenDates: ["#dataFinalInternacao", 90] },
    "filtro.dataFinalInternacao": { require_from_group: [1, ".atLeastOneRequired"], ifDateIsFilledOtherOneIsMandatory: "#dataInicialInternacao", maximunDifferenceBetweenDates: ["#dataInicialInternacao", 90] },
    "filtro.dataInicialLiberacao": { require_from_group: [1, ".atLeastOneRequired"], ifDateIsFilledOtherOneIsMandatory: "#dataFinalLiberacao", maximunDifferenceBetweenDates: ["#dataFinalLiberacao", 90] },
    "filtro.dataFinalLiberacao": { require_from_group: [1, ".atLeastOneRequired"], ifDateIsFilledOtherOneIsMandatory: "#dataInicialLiberacao", maximunDifferenceBetweenDates: ["#dataInicialLiberacao", 90] }
};

mensagens = {
    "filtro.codigoProcedimento": { range: "Por favor, insira um valor entre 1 e 9223372036854775807 ao preencher o cartão." },
    "filtro.codigoHospital": { range: "Por favor, insira um valor entre 1 e 9223372036854775807 ao preencher o estipulante." },
    "filtro.codigoSegurado": { range: "Por favor, insira um valor entre 1 e 9223372036854775807 ao preencher a solicitação." },
    "filtro.numeroSolicitacao": { range: "Por favor, insira um valor entre 1 e 2147483647 ao preencher o referenciado." }
};

agrupamentos = {
    datasSolicitacao: "#dataInicialSolicitacao #dataFinalSolicitacao",
    datasLiberacao: "#dataInicialLiberacao #dataFinalLiberacao",
    datasInternacao: "#dataInicialInternacao #dataFinalInternacao"
};

$.extend($.validator.messages, {
    require_from_group: $.format("Por favor, preencha ao menos {0} uma das duplas de datas para realizar a consulta.")
});

我不希望插件在发生模糊事件时停止验证其他表单,仅此一个。有什么建议吗?

【问题讨论】:

    标签: javascript jquery validation datepicker jquery-validate


    【解决方案1】:

    解决方案是覆盖 jQuery Validate 插件的 onfocusout 属性。所以我按照上面的做了:

    jQuery插件的变化:

    $.fn.inicializaValidacaoFormulario = function() {
        $("form").validate({
            rules: typeof regras !== "undefined" && regras != null ? regras : {},
            messages: typeof mensagens !== "undefined" && mensagens != null ? mensagens : {},
            agrupamentos: typeof agrupamentos !== "undefined" && agrupamentos != null ? agrupamentos : {},
            onfocusout: typeof preventBlurEvents !== "undefined" && preventBlurEvents != null ? preventBlurEvents : {}
        });
        return this;
    };
    

    我在验证中添加了这个:

    preventBlurEvents = function (element, event) {
        if (!$(element).attr("class").contains("data")) {
            $.validator.defaults.onfocusout.call(this, element, event);
        }
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多