我正在编码this插件,用于验证一系列复选框组是否至少选中x
个选项。
每个复选框组都以name
属性命名,如
<input type="checkbox" name="group[]"> // Where `[]` identifies it as a group
插件就像这样调用:
/* Grab all checkboxes and make sure
at least 2 are checked in every group */
$(':checkbox').checkpass(2);
如果您在 http://jsfiddle.net/elclanrs/GFCKA/ 处尝试该插件,您会看到每次尝试验证时,都会出现一个警报,其中包含您需要检查的每个组剩余的选项数量。满足所有条件后,消息将不再触发。你会得到“通过!”警报。
如果传递的值大于1,插件工作正常但是当我传递零值时出现问题:
$(':checkbox').checkpass(0)
如果最小值设置为零,它仍会抓取默认值min = 1
,因此它的行为就像传递的值是1
一样。为什么会这样?这是实际的插件:
(function($) {
$.fn.checkpass = function(min) {
var $ckboxes = this,
names = [],
num = 0,
err = '';
$ckboxes.each(function() {
var name = this.name;
if (!~$.inArray(name, names)) {
names.push(name);
}
});
min = min || 1;
for (var i = 0, l = names.length; i < l; i++) {
$checked = $ckboxes.filter('[name="' + names[i] + '"]:checked');
if ($checked[min - 1]) {
num++;
} else {
var _remaining = min - $checked.length,
_name = names[i].match(/\w+/).toString()
.replace(/^\w/, function($0) {
return $0.toUpperCase();
});
err += _name + ': Check ' + _remaining + ' more\r\n';
}
}
return {
isValid: num === names.length,
errors: err
};
};
})(jQuery);
// Test
$('button').click(function() {
var checkpass = $(':checkbox').checkpass(3);
if (checkpass.isValid) {
alert('Passed!');
} else {
alert(checkpass.errors);
};
});
答案 0 :(得分:1)
这是因为这个逻辑:
min = min || 1;
在JavaScript 0中评估为false。因此,上面的语句总是在将传入0时将min设置为1.
您可以将其更改为:
min = (typeof min == 'undefined') ? 1 : min;