Нужен совет по этой логике ... не могу найти лучшего названия - PullRequest
3 голосов
/ 26 февраля 2012

Я кодирую этот плагин , который проверяет, если для ряда групп флажков отмечены по крайней мере 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/, вы увидите, что каждый раз, когда вы пытаетесь проверить,Появится оповещение с количеством опций, оставленных на группу, которые необходимо проверить.Когда все условия выполнены, сообщение больше не будет срабатывать.Вы получите "Пройдено!"оповещения.

Плагин работает нормально, если переданное значение больше единицы, но проблема возникает, когда я передаю нулевое значение:

$(':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 Ответ

1 голос
/ 26 февраля 2012

Это из-за этой логики:

min = min || 1;

В JavaScript 0 оценивается как ложное.Таким образом, приведенный выше оператор всегда устанавливает min в 1, когда он передается как 0.

Вы можете изменить его на:

min = (typeof min == 'undefined') ? 1 : min;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...