2013-06-18 2 views
1

Я использую управление представлением дерева asp.net. И используя Jquery, чтобы выбрать все соответствующие дочерние флажки, когда его родительский флажок установлен. Рабочий Jquery и тонированное HTML находится здесь ... JS FiddleКак снять флажок с родительского флажка, если их дочерний флажок снят с помощью JQuery?

Jquery, чтобы выбрать опцию:

$('.tree').on('change', ':checkbox', function() { 
     var checked = this.checked; 
     var $elem = $(this).closest('table'); 
     var depth = $elem.find('div').length; 
     var $childs = $elem.nextAll('table'); 
     $childs.each(function() { 
      var $child = $(this); 
      var d = $child.find('div').length; 
      if (d <= depth) { 
       return false; 
      } 

      $child.find(':checkbox').prop('checked', checked); 
     }); 
    }); 

Но я не знаю, как отменить родительский узел, когда один из его дочернего элемента проверяется , Помощь необходима ..

+2

осторожны с конфиденциальными данными, предоставляемыми в Интернете, я думаю, что для связанных с разработкой программного обеспечения здравоохранения вы подписаны NDA или что-то ... просто говоря :) – TecHunter

+0

Пожалуйста, напишите больше фактического кода (HTML, особенно) в своем вопросе. Скрипка полезна, но ваш вопрос должен по-прежнему стоять сам по себе, если завтра будет исчезать jsfiddle. – jcsanyi

ответ

0

Это одна из Вейрдест структуры я когда-либо видел, во всяком случае здесь ваше решение http://jsfiddle.net/Gak2h/6/ , если вы хотите, чтобы снять, когда все элементы снят изменение

$this.prop('checked', nbOfCheckeds == 0); 
+0

Ваш скрипт работает только для дерева с аналогичной структурой. Поскольку данные являются динамическими, дерево может иметь любое количество дочерних записей. Сценарий dosent работает, когда есть только два уровня. Обновите мою скрипку с этим сценарием, а также – Anuya

+0

Пожалуйста, разместите фактический код в своем ответе, а не только ссылку на скрипку. Сценарий полезен, но ваш ответ должен по-прежнему стоять сам по себе, если завтра будет исчезать jsfiddle. – jcsanyi

+0

@ Ануя, почему вы создаете таблицу для каждого флажка? И почему вы не ставите дочерние элементы в меню родителей? Знаете ли вы, что таблицы делают рендеринг очень медленным и что это решение требует много ресурсов, я могу реализовать рекурсию, но это слишком много времени. – ccd580ac6753941c6f84fe2e19f229

0

Вставьте это после того, как $childs.each({...}); (который вы migh хотите переименовать children.each)

 if(!checked){ 
      $elem.prev("table").find(":checkbox:first").prop('checked',false); 
    } 

он проходит вверх по DOM, чтобы найти элемент предшествующей таблицы, является родителем в дереве к текущий узел, а затем находит первый флажок в то, что должно быть родительским флажок

тогда было бы

$('.tree').on('change', ':checkbox', function() { 
    var checked = this.checked; 
    var $elem = $(this).closest('table'); 
    var depth = $elem.find('div').length; 
    var $childs = $elem.nextAll('table'); 
    $childs.each(function() { 
     var $child = $(this); 
     var d = $child.find('div').length; 
     if (d <= depth) { 
      return false; 
     } 

     $child.find(':checkbox').prop('checked', checked); 
    }); 
    if(!checked){ 
      var len = $elem.find("tr:first>td").length; 
      for(; 
       $elem.find("tr:first>td").length=len; 
       $elem = $elem.prev("table")){} 
      $elem.find(":checkbox:first").prop('checked',false); 
    } 
}); 
+0

При снятии отметки с узла этот код отключает предыдущий узел. Попробуйте выбрать все флажки, щелкнув на родительском узле и затем снимите флажок снизу. Вы можете заметить это – Anuya

+0

Обновили скрипку в вопросе с более подходящим сценарием. Пожалуйста, помогите – Anuya

+0

@anuya скрипка не работает в IE10 на моей машине, поэтому я не могу проверить для вас –

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