Показать сообщение отдельно
  #1 (permalink)  
Старый 27.08.2013, 00:45
Интересующийся
Отправить личное сообщение для NMitra Посмотреть профиль Найти все сообщения от NMitra
 
Регистрация: 16.08.2013
Сообщений: 21

Дерево checkbox
Здравствуйте, сделала код больше интуитивно

<ul class="shest2">
    <li>1<input type="checkbox">
    <li>2<input type="checkbox">
        <ul class="shest2">
            <li>2.1<input type="checkbox">
            <ul>
                <li>2.1.1<input type="checkbox">
                <li>2.1.2<input type="checkbox">
            </ul>
            <li>2.2<input type="checkbox">
        </ul>
    <li>3<input type="checkbox">
</ul>

<script>
var ul = [].filter.call(document.querySelectorAll(".shest2"), function(element) {return element.tagName === "UL";});
ul.forEach(function(elementUl) {
var li = [].filter.call(elementUl.querySelectorAll("li"), function(element) {return element.parentNode == elementUl;});

li.forEach(function(elementLi) {
  var main = elementLi.querySelector('[type="checkbox"]'),
      all = elementLi.querySelectorAll('ul > li > [type="checkbox"]');
  for(var i=0; i<all.length; i++)
    all[i].onclick = function() {
        var allChecked = elementLi.querySelectorAll('ul > li > [type="checkbox"]:checked').length;
        main.checked = allChecked == all.length;
        main.indeterminate = allChecked > 0 && allChecked < all.length;
    }
  main.onclick = function() {
    for(var i=0; i<all.length; i++)
        all[i].checked = this.checked;
  }
});
});
</script>


По нему можно опускаться. То есть если нажать 2, то будут выделены
2.1
2.1.1
2.1.2
2.2
А вот подниматься проблематично. Если нажать
2.1.1
2.1.2
то не будет галочки на 2.1
Если нажать 2.2 и 2.1, то не будет галки на 2

Попробовала пойти другим путём, но получилось только с одним уровнем и как-со совсем плохо
<form name="Tree">
<input type="checkbox"><ul>
      <li><input type="checkbox">
      <li><input type="checkbox">
      <li><input type="checkbox">
   </ul>
</form>


<script>
var t = document.forms.Tree;
var All = [].filter.call(t.querySelectorAll('[type="checkbox"]'), function(e) {return e;});
All.forEach(function(eAll) {
  var Main = eAll.parentNode.parentNode.previousSibling;
  t.onchange = function() {
    if ([].every.call(document.querySelectorAll('[name="Tree"] > ul > li > [type="checkbox"]'), function(e) {return e.checked == true;})) {
      Main.checked = true;
    } else {
      Main.checked = false;
    }
  }
});

</script>

Последний раз редактировалось NMitra, 27.08.2013 в 08:26.
Ответить с цитированием