Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Задать класс дочернему элементу (https://javascript.ru/forum/jquery/21220-zadat-klass-dochernemu-ehlementu.html)

Juli@ 01.09.2011 18:08

Задать класс дочернему элементу
 
Ребята, привет!

Подскажите,пожалуйста, такую вещь:

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>';

Black_Prince 01.09.2011 20:15

>>current.find(">li").addClass('current').add( current.next() ).show();

может так?:

current.find("li").addClass('current').add( current.next() ).show();

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

Juli@ 02.09.2011 09:25

Цитата:

может так?:

current.find("li").addClass('current').add( current.next() ).show();
Так тоже пробовала.
firebug ошибок не выдает, но и значение передает пустое.((

Juli@ 02.09.2011 17:34

Нашла решение. Оказывается надо было поднятся сначала до родителя с тегом 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..
Подскажите, специалисты....

Black_Prince 02.09.2011 18:27

childs.each(function(){
    //$(this) - current element in childs object array
    //$(this).text("it's works!!!!");
})

Juli@ 02.09.2011 19:03

Оставила так:
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 остаются равны первому значению в списке.

DjDiablo 03.09.2011 21:37

Я понимаю так,
1) кто-то щёлкает по ссылке. и она попадает в current
2) ты поднимаешся на два уровня вверх и выбираешь все <a> кроме той на которую щёлкнули
3) начинаешь перебирать все ссылки
4) А ДАЛЬШЕ ЧТО-ТО НЕПОНЯТНО ты пытаешся получить атрибут name у всей коллекции ссылок childs сразу. хотя для того чтобы получить name каждой ссылки в коллекции нужно this.attr, а если только того по которому щёлкнули то current.attr и перед циклом а не внутри него. Нафига childs.attr не понимаю, думаю дело в этом.

DjDiablo 03.09.2011 21:44

Что касается стиля.
 
Обычно принято оформлять объявление переменных вот так.

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);

Juli@ 05.09.2011 09:36

Цитата:

Сообщение от DjDiablo
Я понимаю так,
1) кто-то щёлкает по ссылке. и она попадает в current
2) ты поднимаешся на два уровня вверх и выбираешь все <a> кроме той на которую щёлкнули
3) начинаешь перебирать все ссылки
4) А ДАЛЬШЕ ЧТО-ТО НЕПОНЯТНО ты пытаешся получить атрибут name у всей коллекции ссылок childs сразу. хотя для того чтобы получить name каждой ссылки в коллекции нужно this.attr, а если только того по которому щёлкнули то current.attr и перед циклом а не внутри него. Нафига childs.attr не понимаю, думаю дело в этом.

1) попадает в current не только кликнутая ссылка, но и все с таким же name().
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) - здесь этих детей тоже нужно открыть и подсветить. не знаю, понятно ли объяснила..

DjDiablo 05.09.2011 16:40

Беда в том что совершенно непонятно что требуется.
Я представляю себе это так.

Есть три элемента интерфейса c информацией в виде дерева, мы назовём такие элементы tree. Допустим каждый tree отображает структуру папок на жёстком диске. 1й tree - диск C, 2й tree - диск D, 3й tree - диск E.

1) когда пользователь щёлкает по папке любого диска, скрипт запоминает имя папки
2) скрипт ищет на всех 3х tree, папки с этими именами.
3) Затем раскрывает все найденные папки на всех дисках, и подсвечивает и найденные папки и их вложенные папки.

Правильно ?


Часовой пояс GMT +3, время: 15:31.