jQuery验证 - 如果多次使用,则不会触发skip_or_fill_minimum规则

时间:2014-02-06 21:51:34

标签: javascript jquery jquery-validate

我有一个由四个输入组成的表单,它们成对分组。

这个表单的规则非常简单,如果我填写其中一个输入,我必须填写另一个或我没有填写任何,所以为了实现这个行为我用{{ 1}}方法。

HTML:

skip_or_fill_minimun

验证规则,消息和群组:

<div id="msgErros"></div>
<form>
    <label for="dataInicial">Data Inicial</label>
    <input type="text" name="filtro.dataInicial" id="dataInicial" class="datas" />
    <label for="dataFinal">Data Final</label>
    <input type="text" name="filtro.dataFinal" id="dataFinal" class="datas" />
    <br />
    <label for="tempoInicial">Tempo Inicial</label>
    <input type="text" name="filtro.tempoInicial" id="tempoInicial" class="tempos" />
    <label for="tempoFinal">Tempo Final</label>
    <input type="text" name="filtro.tempoFinal" id="tempoFinal" class="tempos" />
    <br />
    <button type="submit">Enviar</button>
</form>

这里发生的问题是,如果我填写前两个输入中的一个,则根本不会触发规则,如果我使用第二对进行,则不会出现问题。如果我删除第二对规则执行得很好,所以我认为这是一个错误。这是一个fiddle

我读到了这个方法和$("form").validate({ rules : { "filtro.dataInicial": { skip_or_fill_minimum: [2, ".datas"] }, "filtro.dataFinal": { skip_or_fill_minimum: [2, ".datas"] }, "filtro.tempoInicial": { skip_or_fill_minimum: [2, ".tempos"] }, "filtro.tempoFinal": { skip_or_fill_minimum: [2, ".tempos"] } }, messages: { "filtro.dataInicial": { skip_or_fill_minimum: "Por favor, preencha ambos os campos de data ou nenhum deles." }, "filtro.dataFinal": { skip_or_fill_minimum: "Por favor, preencha ambos os campos de data ou nenhum deles." }, "filtro.tempoInicial": { skip_or_fill_minimum: "Por favor, preencha ambos os campos de tempo ou nenhum deles." }, "filtro.tempoFinal": { skip_or_fill_minimum: "Por favor, preencha ambos os campos de tempo ou nenhum deles." } }, groups : { grupoDatasAtendimentoSintetico : "filtro.dataInicial filtro.dataFinal", grupoTemposAtendimentoSintetico : "filtro.tempoInicial filtro.tempoFinal" }, errorContainer : "#msgErros ul", errorLabelContainer : "#msgErros", wrapper : "li" }); 导致的问题只是阻止其他方法被执行但是这个问题应该在版本1.11.1中得到纠正,这是我在我的项目中使用的那个在插件本身和其他方法的fiddle中。

仅当用户填写第一对中的一个字段时才会出现问题。有谁知道这是否是另一个错误?我在这个插件的GitHub issue tracker中找不到与此相关的内容。

更新

我刚刚在插件的问题跟踪器中放置了issue

1 个答案:

答案 0 :(得分:1)

您报告的问题已得到解决in a recent commit

updated your Fiddle。我删除了外部依赖项,在JavaScript部分的开头复制并粘贴了http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.js中的代码,然后是http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/additional-methods.js中的代码 - 最后我保持您的JavaScript不受影响。

然后,我在这里选择了最新版本的“skip_or_fill_minimum”代码:https://github.com/jzaefferer/jquery-validation/blob/master/src/additional/skip_or_fill_minimum.js

jQuery.validator.addMethod("skip_or_fill_minimum", function(value, element, options) {
    var $fields = $(options[1], element.form),
        $fieldsFirst = $fields.eq(0),
        validator = $fieldsFirst.data("valid_skip") ? $fieldsFirst.data("valid_skip") : $.extend({}, this),
        numberFilled = $fields.filter(function() {
            return validator.elementValue(this);
        }).length,
        isValid = numberFilled === 0 || numberFilled >= options[0];

    // Store the cloned validator for future validation
    $fieldsFirst.data("valid_skip", validator);

    // If element isn't being validated, run each skip_or_fill_minimum field's validation rules
    if (!$(element).data("being_validated")) {
        $fields.data("being_validated", true);
        $fields.each(function() {
            validator.element(this);
        });
        $fields.data("being_validated", false);
    }
    return isValid;
}, jQuery.validator.format("Please either skip these fields or fill at least {0} of them."));

最后,将此代码粘贴到Fiddle的先前版本中。

有了这个,问题就消失了!由此我们得出结论,该错误确实存在,但它已经修复。


更新

版本1.11.1是2013年3月22日(https://github.com/jzaefferer/jquery-validation/tree/1.11.1)。修复错误的提交是从2013年8月27日(https://github.com/jzaefferer/jquery-validation/commit/e5207d63a831fdfa30ea6927906288ae60336c76

您的代码没有任何问题。这是jQuery Validate中的一个错误。版本1.11.1中存在该错误 - 要么您等待新版本,要么您必须自行应用此修复程序。

要应用此修复程序,您需要将错误的skip_or_fill_minimum代码替换为最新的代码(粘贴在上面)。为此,请使用非最小化版本的additional-methods.js。 (如果需要,可以稍后使用“uglify.js”或其他工具将其最小化。)