Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Jquery checkbox checked (https://javascript.ru/forum/jquery/26141-jquery-checkbox-checked.html)

DimDimos 27.02.2012 19:58

Jquery checkbox checked
 
Имеем следующую разметку, сгруппированные инпуты по филдсету.
В этом примере одна группа, но на самом деле таких групп гораздо больше.
<fieldset class="standart">
<legend><label><input id="checkboxall1" type="checkbox" value="yes" name="catid1[1]">Вся Москва</label></legend>
<label><input class="checkboxall1" type="checkbox" value="yes" name="catid1[8]">ЮЗАО</label>
<label><input class="checkboxall1" type="checkbox" value="yes" name="catid1[3]">САО</label>
<label><input class="checkboxall1" type="checkbox" value="yes" name="catid1[4]">СВАО</label>
<label><input class="checkboxall1" type="checkbox" value="yes" name="catid1[5]">ВАО</label>
<label><input class="checkboxall1" type="checkbox" value="yes" name="catid1[6]">ЮВАО</label>
</fieldset>

и скрипт
$(document).ready(function(){  
    $("[class^=checkboxall]").click(function(){
        var idp = $(this).attr('class');
        $("." + idp).closest('fieldset').find('input:checkbox:checked').length > 0 ? 
        $("#" + idp).attr('checked','checked') : $("#" + idp).removeAttr('checked','checked');
    });  
});

Идея в том чтобы снимать/устанавливать чекбокс в легенде филдсета в зависимости есть ли хотябы один установленный чекбокс внутри этой группы.
Пример упрощен, но и в этом случае не получается следующая вещь.
При клике внутри группы чекбокс в легенде устанавливается, а при снятии всех чекбоксов группы, в легенде без изменений(тобиш в установленном состоянии).
Если кто может подсказать в чем моя ошибка, буду очень признателен!

Rootpassword 27.02.2012 20:04

надо не удалять, а ставить в false значение 'checked'

DimDimos 27.02.2012 20:21

Цитата:

Сообщение от Rootpassword (Сообщение 160287)
надо не удалять, а ставить в false значение 'checked'

пробовал уже так, к сожалению эффект одинаковый
$("#" + idp).attr('checked','checked') : $("#" + idp).attr('checked',false);

самое интересное что как тест вывожу из условия алерты
alert(1) : alert(2);

все указывает на верность логики, но как только алерты заменяю на вышеуказанный код и всёё не снимается чекбокс из легенды!

Rootpassword 27.02.2012 20:36

не, логика неверная. У вас при убирании последнего чекбокса один-то активным остается-сам легенд. Вы просто код не убирайте, а дополните алертами.

DimDimos 27.02.2012 20:50

Цитата:

Сообщение от Rootpassword (Сообщение 160291)
не, логика неверная. У вас при убирании последнего чекбокса один-то активным остается-сам легенд. Вы просто код не убирайте, а дополните алертами.

Да, остается активный в легенде, но я к нему и не обращаюсь так как в условии
$("." + idp).closest('fieldset').find('input:checkbox:checked').length > 0
я обращаюсь к инпутам по классу а в легенде у него не класс а id

Rootpassword 27.02.2012 20:56

$(document).ready(function(){ 
    $("[class^=checkboxall]").click(function(){
        var idp = $(this).attr('class');
if(        $("." + idp).closest('fieldset').find('input:checkbox:checked').length > 0 ){
        $("#" + idp).attr('checked','checked'); alert('check');}else {$("#" + idp).removeAttr('checked','checked'); alert('uncheck');}

alert($("." + idp).closest('fieldset').find('input:checkbox:checked').length);

    }); 
});

Вот первый же клик по чекбоксу выводит нам длину=2. О чем это нам говорит?

DimDimos 27.02.2012 20:57

дополнил код алертами, показывает что код переключается но снятия флажка не происходит!

Rootpassword 27.02.2012 20:59

Код с alert('uncheck'); не выполняется.

DimDimos 27.02.2012 21:18

а понял! да вы правы логика не верная!
в условии с кодом я ставил чекбокс в легенду поэтому и не срабатывал код со снятием галки
а когда вместо кода я ставил алерт 1 и 2 там не было чекеда для легенды по этому второй срабатывал.
Значит задача переработать логику, чтобы считались только инпуты из группы без инпута легенды!

Rootpassword 27.02.2012 21:27

да. по поводу предыдущего- 'checked' =false|true только бывает. Удаляя атрибут, вы ставите дефолт. если у вас в коде по дефолту у чекбока будет выделение, то код не будет работать.
defaultChecked=true логику сломает.


Часовой пояс GMT +3, время: 08:00.