需要有关这种逻辑的建议......无法找到更好的标题

时间:2012-02-26 11:15:38

标签: javascript jquery jquery-plugins

我正在编码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);
    };
});​

1 个答案:

答案 0 :(得分:1)

这是因为这个逻辑:

min = min || 1;

在JavaScript 0中评估为false。因此,上面的语句总是在将传入0时将min设置为1.

您可以将其更改为:

min = (typeof min == 'undefined') ? 1 : min;