Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 27.08.2013, 13:37
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

Сообщение от NMitra
вот подниматься проблематично
Как вариант...

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<!--
<link rel="stylesheet" type="text/css" href="tmp.css" />
-->
<style type="text/css">
</style>
<script type="text/javascript">
$(document).ready(function (){
	$('input:checkbox').click(function (){
		var ok=this.checked;
		//this.checked=!ok;
		$(this).next().find('input:checkbox').each(function (){
			this.checked=ok;
		});
		if (ok) {
			$(this).parents('li').children('input:checkbox').each(function (){
				this.checked=true;
			});
		} else {
			$(this).parent().parents('li').each(function (){
				if ($(this).find('input:checked').length>1) return false;
				$(this).children('input:checkbox').get(0).checked=false;
			});
		};
	});
});
</script>
</head>
<body>
<ul class="shest2">
    <li>1<input type="checkbox">
	</li>
    <li>2<input type="checkbox">
        <ul class="shest2">
            <li>2.1<input type="checkbox">
            <ul>
                <li>2.1.1<input type="checkbox">
				</li>
                <li>2.1.2<input type="checkbox">
				</li>
            </ul>
			</li>
            <li>2.2<input type="checkbox">
			</li>
        </ul>
	</li>
    <li>3<input type="checkbox">
	</li>
</ul>
<button>Test</button>
</body>
</html>


Это конечно макет... Но вроде рабочий.
Ответить с цитированием
  #3 (permalink)  
Старый 28.08.2013, 03:07
Интересующийся
Отправить личное сообщение для NMitra Посмотреть профиль Найти все сообщения от NMitra
 
Регистрация: 16.08.2013
Сообщений: 21

ksa, спасибо за неравнодушие. У вас если снять галку с 2.1.1, то не снимается галка с 2

Вот в итоге сделала что хотела: http://shpargalkablog.ru/2013/08/checked.html#tree Вроде неплохо получилось.
Ответить с цитированием
  #4 (permalink)  
Старый 28.08.2013, 11:27
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

Сообщение от NMitra
У вас если снять галку с 2.1.1, то не снимается галка с 2
Ну это уже клевета!
Ответить с цитированием
  #5 (permalink)  
Старый 28.08.2013, 12:39
Интересующийся
Отправить личное сообщение для NMitra Посмотреть профиль Найти все сообщения от NMitra
 
Регистрация: 16.08.2013
Сообщений: 21

Хм, действительно. Вчера в три ночи ковырялась, не разглядела. И ведь проверяла несколько раз, прежде чем написать сообщение!!! Прошу прощения!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
checkbox = checkbox Слейп jQuery 2 30.01.2013 15:24
Не могу получить состояние checkbox-а POMAH-UST Элементы интерфейса 2 08.10.2012 07:43
jqgrid tree and checkbox gaz2003 jQuery 0 17.12.2011 15:59
Вывод выбранных данных и проверка checkbox MasterHrust Javascript под браузер 3 28.09.2011 17:44
Функция disable для нескольких checkbox allforweb Элементы интерфейса 4 19.12.2010 17:51