IMO, вы используете этот список неправильно. Свернуть / Открыть / Добавить в избранное ... эти элементы не принадлежат дереву, но вы относитесь к ним, как если бы они были его частью.
Ваше дерево должно иметь следующую структуру:
<ul>
<li>
<span>menu item 1<span>
<ul>
<li>
<span>child node 1</span>
</li>
<li>
<span>child node 2</span>
</li>
</ul>
</li>
...
</ul>
Это основание дерева. Теперь вы должны добавить действия (открыть / добавить ... и т. Д.). Они могут быть размещены как другой, независимый список после span
элемента. Затем просто используйте class
, чтобы отделить список childNodes от списка actions :
...
<li>
<div>
<span>menu item 1</span>
<ul class="actions"> ... </ul>
</div>
<ul class="childNodes"> ... </ul>
</li>
...
Ну ... в теории классы не требуются, но с классами работать гораздо проще, чем ... ul > li > div > ul
селекторы и т. Д.
Согласно первому комментарию
Базовая функциональность сайта не должна опираться на JavaScript. Вот почему я считаю, что добавление всего дерева с использованием JS - плохая идея. Действия вроде add to favs должны быть доступны без JS, но вы можете свободно контролировать это действие и перезаписывать его функциональность. Итак, в HTML у вас есть:
<a href="/tree/action/add_to_favs?id=123">Add to favs</a>
Но используя JS, вы делаете что-то вроде этого (псевдокод):
actionLink.addEventListener("click", function...
var id = take id: 123
do ajax request here
return false;
});
Это лучший способ обеспечить хорошую доступность и функциональность одновременно.
Об открытии / развале действий. Это требует JS по своей природе, поэтому JS может добавить их в список действий. Но еще раз ... помните о "не-JS пользователей". HTML / CSS должен отображать целое дерево - JS должен свернуть его ветви.