我有一个由四个输入组成的表单,它们成对分组。
这个表单的规则非常简单,如果我填写其中一个输入,我必须填写另一个或我没有填写任何,所以为了实现这个行为我用{{ 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。
答案 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”或其他工具将其最小化。)