2013-08-14 3 views
2

Я разрабатываю приложение, для которого требуется значение нескольких флажков. У меня есть вложенные списки, содержащие флажки. Текущая функциональность такова:Снимите флажок с родительского флажка, если один дочерний элемент не отмечен

  1. При проверке родителя проверяются все дочерние элементы.
  2. Когда ребенок проверен, родительский элемент не выбран.

мне нужно добавить эту функциональность:

  1. Когда ребенок снят после того, как родитель проверил, родительские неустановленные, но оставляет дети проверили.

    $('input[name="level-1"],input[name="level-2"]').bind('click', function() { $('input[type=checkbox]', $(this).parent('li')).attr('checked', ($(this).is(':checked'))); });

Мой код находится здесь: http://jsfiddle.net/dbcottam/Py4UN/

ответ

2

Возможное решение

Добавьте класс someclass к верхнему ul элемента затем

$('.someclass :checkbox').bind('click', function() { 
    var $chk = $(this), $li = $chk.closest('li'), $ul, $parent ; 
    if($li.has('ul')){ 
     $li.find(':checkbox').not(this).prop('checked', this.checked) 
    } 

    do{ 
     $ul = $li.parent(); 
     $parent = $ul.siblings(':checkbox'); 
     if($chk.is(':checked')){ 
      $parent.prop('checked', $ul.has(':checkbox:not(:checked)').length == 0) 
     } else { 
      $parent.prop('checked', false) 
     } 
     $chk = $parent; 
     $li = $chk.closest('li'); 
    } while($ul.is(':not(.someclass)')); 
}); 

Демо: Fiddle

+0

Я отвел пистолет на другой ответ. Хотя другой работал, этот фактически наполнил мои потребности на 100%. – staples89

0

Я попробовал обобщенную функцию для обработки нескольких уровней. Смотрите ниже код,

$('input[name^="level"]').click(function() { 
    //v-- Takes care of check/uncheck all child checkbox 
    $(this).parent().find('input[name^=level]').prop('checked', this.checked); 

    if (!this.checked) { 
     var level = this.name.substring(this.name.length - 1);  
     //using the naming convention `level-n` to uncheck parent 
     for (var i = level - 1; i > 0; i--) { 
      $('input[name="level-' + i + '"]').prop('checked', false); 
     } 
    } 
}); 

DEMO:http://jsfiddle.net/46hTc/

+0

Это ответ на мой вопрос упрощенным способом, спасибо. Решение Arun P Johny также приемлемо и работает так, как мне нужно, чтобы оно функционировало. – staples89

+0

@DavidCottam Спасибо .. Не стесняйтесь распространять эту функцию на сложные структуры. –

+0

@dbcottam Проверьте ошибки на вашей консоли. –

Смежные вопросы