Задать класс дочернему элементу
Ребята, привет!
Подскажите,пожалуйста, такую вещь: Treeview деревья папок. Их 3 и 1 просто список. Необходимо у кликнутого элемента найти близнецов (с такими же значениями name) и открыть и подсветить их другим цветом в дереве. я это делаю так (часть выдрала из плагина, который использую(jquery.treeview)): var curName = $(this).attr("name"); var t="a[name="+curName+"]"; var current = $('ul.filetree').find(t) .addClass('current'); var items = current.parent().addClass("selected").end().addClass("selected").parents("ul, li").add( current.next() ).show(); var current1 = $('ol.filetree').find(t).addClass('current'); //это просто список, в нем тоже ищем эл-т и добавляем класс current1.parent().parent().parent().parent().addClass("closed collapsable lastCollapsable").end().parent().addClass("selected").end().addClass("selected2").parents("ol, li").add( current.next() ).show(); $('a').not(t).removeClass('current'); А еще нужно у кликнутого эл-та найти всех детей и подсветить и открыть все элементы на странице с такими же name как у этих детей(их неск-ко). Перепробовала все что могла. Из последних попыток: current.find(">li").addClass('current').add( current.next() ).show(); не помогает. Как быть? вот к примеру одно из деревьев: $cur_rel = ''; echo '<ul id="browser2" class="filetree">'; while($row = mysql_fetch_assoc($result)) { if ($row['parent']!=$cur_rel) { echo '<li class="closed"><span class="folder"><a>'.$row['parent'].'</a></span>'; $cur_sys = $row['parent']; } echo '<ul>'; echo '<ul><li class="closed"><span class="file"><a name="'.$row['bb'].'" href=# OnClick=clickt("'.$row['bb'].'")>'.$row['child'].'</a></span>'; echo '</li>'; echo '</ul>'; echo '</ul>'; |
>>current.find(">li").addClass('current').add( current.next() ).show();
может так?: current.find("li").addClass('current').add( current.next() ).show(); и кстати, проверьте на исполнение всех функций хотя бы через тот же firebug, что бы не выдавалось никаких ошибок |
Цитата:
firebug ошибок не выдает, но и значение передает пустое.(( |
Нашла решение. Оказывается надо было поднятся сначала до родителя с тегом li, а потом пройти снова вниз и найти эл-т с тегом a. Только в этот список попадает еще и сам кликнутый элемент с тегом a, поэтому его "вычитаем":
var childs = current.parent().parent().find("a").not(current); Ну и далее: var cur_child = childs.attr('name'); var s ="a[name="+cur_child+"]"; var act_child = $('ol.filetree').find(s) .addClass('current'); var act_child1 = $('ul.filetree').find(s) .addClass('current').parent().addClass("selected").end().addClass("selected").parents("ul, li").show(); И снова проблема! Скоро буду наверное волосы на голове вырывать! Я не знаю как этот процесс зациклить(( Ведь "детей " у кликнутого элемента может быть не один, а несколько. А у меня подсвечивает и открывает только один первый элемент. Сделала так: var childs = $.makeArray(current.parent().parent().find("a").not(current)); А далее как-то надо применить each.. Подскажите, специалисты.... |
childs.each(function(){ //$(this) - current element in childs object array //$(this).text("it's works!!!!"); }) |
Оставила так:
var childs = current.parent().parent().find("a").not(current); jQuery.each( childs, function (index, value){ var cur_child = childs.attr('name'); var s ="a[name="+cur_child+"]"; var act_child = $('ol.filetree').find(s).addClass('current'); var act_child1 = $('ul.filetree').find(s) .addClass('current').parent().addClass("selected").end().addClass("selected").parents("ul, li").show(); И массив childs не перебирает. Я просто не знаю совершенно синтаксис... Взяла пример alert(index+':' + childs) - все отлично работает,но как к себе применить не знаю. А сейчас у меня cur_child и s остаются равны первому значению в списке. |
Я понимаю так,
1) кто-то щёлкает по ссылке. и она попадает в current 2) ты поднимаешся на два уровня вверх и выбираешь все <a> кроме той на которую щёлкнули 3) начинаешь перебирать все ссылки 4) А ДАЛЬШЕ ЧТО-ТО НЕПОНЯТНО ты пытаешся получить атрибут name у всей коллекции ссылок childs сразу. хотя для того чтобы получить name каждой ссылки в коллекции нужно this.attr, а если только того по которому щёлкнули то current.attr и перед циклом а не внутри него. Нафига childs.attr не понимаю, думаю дело в этом. |
Что касается стиля.
Обычно принято оформлять объявление переменных вот так.
var cur_child = childs.attr('name'), // странная строка s = "a[name = " + cur_child + "]", act_child = $('ol.filetree').find(s).addClass('current'), act_child1 = $('ul.filetree').find(s); |
Цитата:
2) да 3) все так 4) мне нужны все name всех найденных детей childs всех ссылок current. childs.attr - атрибуты детей текущей ссылки, а не атрибут самой ссылки. 5) далее этих детей надо открыть и подсветить. Вы правы, сделала так: var childs = current.parent().parent().find("a").not(current); childs.addClass('current').parent().addClass("selected").end().addClass("selected").parents("ul, li").show(); Тогда открывает всех! детей. НО только в двух деревьях(( Есть еще просто - список ol li, где мне нужно подсвечивать ссылки с childs.attr('name') - и дерево, где потомки у нужных детей не current(здесь тоже поэтому поиск по name) - здесь этих детей тоже нужно открыть и подсветить. не знаю, понятно ли объяснила.. |
Беда в том что совершенно непонятно что требуется.
Я представляю себе это так. Есть три элемента интерфейса c информацией в виде дерева, мы назовём такие элементы tree. Допустим каждый tree отображает структуру папок на жёстком диске. 1й tree - диск C, 2й tree - диск D, 3й tree - диск E. 1) когда пользователь щёлкает по папке любого диска, скрипт запоминает имя папки 2) скрипт ищет на всех 3х tree, папки с этими именами. 3) Затем раскрывает все найденные папки на всех дисках, и подсвечивает и найденные папки и их вложенные папки. Правильно ? |
Часовой пояс GMT +3, время: 15:31. |