У меня есть задача, где мне нужно пройти по дереву (проверка / отмена проверки отдельных элементов). Я написал код, и он работает правильно, но иногда медленно. Пожалуйста, помогите мне улучшить его.
Вот как это должно работать:
- Отключение родительской галочки снимает галочки
все дети этого родителя
- Снятие отметки (один или несколько)
дочерние узлы отменяют проверку родителя
- Проверка родителя автоматически
проверяет все это дети
- Когда все дети проверены,
родитель также проверяется
автоматически
- это также должно работать с любым деревом глубины .. поэтому, если есть 3 уровня глубинных узлов, при снятии отметки с самого внутреннего потомка будет снят первый родительский узел каждого узла.
Несколько других соображений:
Классы CSS:
- «отмечено» - шрифт черного цвета, при удалении шрифт серый
- «отмечено» - серый фон
Итак:
- Когда у родителя НЕТ выбранных детей, его класс css "флажок" удаляется (он становится серым)
- Когда элемент не отмечен, его классы css «отмечены» и «помечены» удалены (черный шрифт становится серым и без серого фона)
- Когда ВСЕ дочерние элементы не отмечены, родительский «помеченный» класс удаляется (серый фон удаляется).
Надеюсь, эта иллюстрация поможет:
И часть исходного кода HTML:
<ul class='treeList2b'><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:30px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Aparatura elektryczna, elektroenergetyka </span></div>
<ul class='treeList2b'><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:60px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Silniki, napędy, automatyka napędów </span></div>
<ul class='treeList2b'><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:90px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Silniki i napędy przemysłowe </span></div>
<ul class='treeList2b'><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:120px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Prądu stałego </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:120px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Prądu przemiennego </span></div>
<ul class='treeList2b'><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:150px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>synchroniczne </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:150px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>asynchroniczne </span></div>
</li></ul></li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:120px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Silniki krokowe </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:120px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Siłowniki elektryczne </span></div>
<ul class='treeList2b'><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:150px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Liniowe </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:150px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Obrotowe </span></div>
</li></ul></li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:120px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Serwosilniki, serwonapędy </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:120px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Inne </span></div>
</li></ul></li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:90px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Układy zabezpieczeń silników </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:90px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Elektroniczne układy sterowania napędów </span></div>
<ul class='treeList2b'><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:120px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Przemienniki prądu stałego </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:120px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Przemienniki częstotliwości (falowniki) </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:120px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Układy łagodnego rozruchu (softstarty) </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:120px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Sterowniki silników DC </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:120px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Sterowniki silników krokowych </span></div>
<ul class='treeList2b'><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:150px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Jednoosiowe </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:150px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Wieloosiowe </span></div>
</li><li class='open'> <div class="tlWrap clearfix marked checked" style="padding-left:150px;"><input type="checkbox" checked="checked" class="checkbox" name="SelectedBranch" id="SelectedBranch"><span>Wieloosiowe z interpolacją </span></div>
</li></ul></li>
...
И мой сценарий:
<script type="text/javascript">
/*<![CDATA[*/
$(function(){
$('ul.treeList2b .checkbox').click(function(e){
e.stopPropagation();
var obj = $(this).closest('li').find(':checkbox');
obj.attr('checked', this.checked);
var childCnt=obj.size(); // get childrent count - when parent was clicked
var checkedCnt=obj.filter(':checked').length; // out of those get those that are checked
if (childCnt==checkedCnt){
obj.parents('li').each(function (index, element) {
var objSub = $(element).find('li');
childCnt = objSub.size();
checkedCnt = objSub.find(':checkbox:checked').length;
if (childCnt==checkedCnt) {
$(element).find(':checkbox:first').attr("checked", true);
$(element).children('div.tlWrap').addClass('checked');
}
$(element).children('div.tlWrap').addClass('marked');
});
}else{
var objParent = obj.parents('li').find(':checkbox:first');
objParent.attr("checked", false);
objParent.parent('div.tlWrap').removeClass('checked');
}
refleshCheckbox(this);
});
});
function refleshCheckbox(obj){
if(!$(obj).attr('checked')){
$(obj).closest('li').find('div.tlWrap').removeClass('marked');
}
if ($(obj).closest('ul').find(':checkbox:checked').length==0){
$(obj).closest('ul').parent().find('div.tlWrap').removeClass('marked');
}
}
/*]]>*/
</script>