Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Выделить только K чекбоксов из N. При выделении


Автор: Sunvas 4.11.2007, 01:27
Собсно нужно создать опрос, где можно было бы выделить только K чекбоксов из N (число K должно как-то передаваться браузеру, а N чексбоксов генерирует скрипт).
Нашел тему http://forum.vingrad.ru/forum/topic-152162.html, но мне необходимо, чтобы при выделении последнего чекбокса - остальные блокировались.  smile 

Автор: vasac 4.11.2007, 10:50
Примерно так:
Код

<div id="chb">
    <div>выбрано: <span id="chs" style="font-weight:bold">0</span> (максимально: <span id="chsk">3</span>)</div>
    <input type="checkbox" value="1" />
    <input type="checkbox" value="1" />
    <input type="checkbox" value="1" />
    <input type="checkbox" value="1" checked="checked" />
    <input type="checkbox" value="1" />
    <input type="checkbox" value="1" />
    <input type="checkbox" value="1" />
</div>

Код

(function () {
    var K = parseInt(document.getElementById("chsk").firstChild.nodeValue);
    var Q_SELECT = 0;
    var blocked  = false;
    var inputs = document.getElementById("chb").getElementsByTagName("input")
    for (var i = 0; i < inputs.length; i++) {
        var input  = inputs.item(i);
        if (input.getAttribute("type") != "checkbox") {
            continue;
        }
        if (input.checked) {
            Q_SELECT++;
        }
        input.onclick = (
            function(e) {
                if (this.checked) {
                    Q_SELECT++;
                } else {
                    Q_SELECT--;
                }
                isBlock();
                return true;
            }
        );
    }
    isBlock();
    function isBlock() {
        document.getElementById("chs").firstChild.nodeValue = Q_SELECT;
        var dis = (Q_SELECT >= K);
        if ((dis && blocked) || ((!dis) && (!blocked))) {
            return true;
        }
        blocked = dis;
        for (var i = 0; i < inputs.length; i++) {
            var input = inputs.item(i);
            if ((input.getAttribute("type") == "checkbox") && (!input.checked)) {
                input.disabled = dis;
            }
        }
        return true;
    }
})();

Автор: Sunvas 4.11.2007, 11:57
vasac, че-то не работает..

Автор: ksnk 4.11.2007, 19:34
Цитата(Sunvas @  4.11.2007,  11:57 Найти цитируемый пост)
че-то не работает

А у меня в IE и FF последнем все работает... Какие симптомы? Отладку какую-то удалось провести?

P.S. Функцию необходимо разместить в методе onLoad странички 

Автор: Sunvas 4.11.2007, 21:13
Так. В опере работает. Это хорошо.
А как лучше поступить, если таких дивов (с чекбоксами) может быть два и больше?

Автор: vasac 6.11.2007, 08:12
Сделать мою анонимную функцию не анонимной, получающей аргументом id слоя с чекбоксами. Вызвать для каждого нужного слоя.

Автор: Sunvas 6.11.2007, 13:59
vasac,  smile 
Мои познания в JS стремяться к 0.

Автор: pompei 6.11.2007, 14:42
Вот работает везде:
Код

<HTML>
<HEAD>
    <Title> You cannot select more than 3 </Title>
<script Language="JavaScript">

var checkboxes = [];
var selectedElements = 0;

function clickOnCheckbox( checkbox ) {
    if (checkbox.checked) selectedElements++; else selectedElements--;
    for (var i = 0; i < checkboxes.length; i++) {
        var cb = checkboxes[i];
        if (!cb.checked) {
            cb.disabled = selectedElements >= 3;
        }
    }
}

function pageLoaded() {
    checkboxes.push( document.getElementById( "chbox01" ) );
    checkboxes.push( document.getElementById( "chbox02" ) );
    checkboxes.push( document.getElementById( "chbox03" ) );
    checkboxes.push( document.getElementById( "chbox04" ) );
    checkboxes.push( document.getElementById( "chbox05" ) );
    checkboxes.push( document.getElementById( "chbox06" ) );
    checkboxes.push( document.getElementById( "chbox07" ) );
    checkboxes.push( document.getElementById( "chbox08" ) );
    checkboxes.push( document.getElementById( "chbox09" ) );
    checkboxes.push( document.getElementById( "chbox10" ) );
    checkboxes.push( document.getElementById( "chbox11" ) );
    checkboxes.push( document.getElementById( "chbox12" ) );
    checkboxes.push( document.getElementById( "chbox13" ) );
    checkboxes.push( document.getElementById( "chbox14" ) );
}

</Script>
</HEAD>
<BODY onload="pageLoaded();">
    <H1>You cannot select more than 3</H1>
    
    Checkbox 01 <input type="checkbox" id="chbox01" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 02 <input type="checkbox" id="chbox02" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 03 <input type="checkbox" id="chbox03" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 04 <input type="checkbox" id="chbox04" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 05 <input type="checkbox" id="chbox05" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 06 <input type="checkbox" id="chbox06" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 07 <input type="checkbox" id="chbox07" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 08 <input type="checkbox" id="chbox08" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 09 <input type="checkbox" id="chbox09" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 10 <input type="checkbox" id="chbox10" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 11 <input type="checkbox" id="chbox11" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 12 <input type="checkbox" id="chbox12" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 13 <input type="checkbox" id="chbox13" onclick="clickOnCheckbox( this );" /> <br/>
    Checkbox 14 <input type="checkbox" id="chbox14" onclick="clickOnCheckbox( this );" /> <br/>
    
</BODY>
</HTML>


Копи пасте и готово!!!!

Автор: vasac 6.11.2007, 15:36
pompei, прочитайте всё тему и последний вопрос.

Sunvas,
Код

(function () {
    var K = parseInt(document.getElementById("chsk").firstChild.nodeValue);
    var Q_SELECT = 0;
    var blocked  = false;
    var inputs = document.getElementById("chb").getElementsByTagName("input")
    ...
    }
})();


заменить на:

Код

function func(id, K) {
    var Q_SELECT = 0;
    var blocked  = false;
    var inputs = document.getElementById(id).getElementsByTagName("input")
    ...
}


Вызвать для каждого слоя, указывая их idы:
Код

func("id1", 3);
func("id2", 3);
func("id3", 7);


И, возможно, будет работать smile

Автор: Sunvas 6.11.2007, 19:44
vasac, спасибо. Ответ исчерпывающий.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)