Есть ли способ автоматически добавлять классы в многоуровневые списки с помощью jQuery? - PullRequest
2 голосов
/ 27 апреля 2010

У меня есть многоуровневые списки, подобные этому:

<ul>
    <li>Item 1
        <ul>
            <li>Item 1's 1st Child
                <ul>
                    <li>Item 1's 1st Grandchild
                        <ul>
                            <li>Item 1's Grand Grandchild</li>
                        </ul>
                    </li>
                    <li>Item 1's 2nd Grandchild</li>
                    <li>Item 1's 3rd Grandchild</li>
                </ul>
            </li>
            <li>Item 1's 2nd Child</li>
            <li>Item 1's 3rd Child</li>
        </ul>
    </li>
    <li>Item 2</li>
</ul>

Я хочу, чтобы у каждого li был класс 'level' согласно их позициям. Результат будет таким:

<ul>
    <li class="level-1">Item 1
        <ul>
            <li class="level-2">Item 1's 1st Child
                <ul>
                    <li class="level-3">Item 1's 1st Grandchild
                        <ul>
                            <li class="level-4">Item 1's Grand Grandchild</li>
                        </ul>
                    </li>
                    <li class="level-3">Item 1's 2nd Grandchild</li>
                    <li class="level-3">Item 1's 3rd Grandchild</li>
                </ul>
            </li>
            <li class="level-2">Item 1's 2nd Child</li>
            <li class="level-2">Item 1's 3rd Child</li>
        </ul>
    </li>
    <li class="level-1">Item 2</li>
</ul>

Есть ли способ добиться этого с помощью jQuery?

Большое спасибо за внимание.

Ответы [ 4 ]

3 голосов
/ 27 апреля 2010

Не самый быстрый из-за обходов DOM, но вы можете сделать это всего за:

​$("​​​li").each(function() {
   $(this).addClass("level-" + ($(this).parents("li").length+1)); 
});​​​

Рабочий пример можно посмотреть здесь

2 голосов
/ 27 апреля 2010

Думаю, что это общее решение:

var current = $('ul:first');
var depth = 1;

while (current.length) {
  current = current.children('li').addClass('level-' + depth++).children('ul');
};
2 голосов
/ 27 апреля 2010

Если у вас есть только 4 уровня списков

$("ul > li").addClass("level-1"); 
$("li.level-1 > ul > li").addClass("level-2"); 
$("li.level-2 > ul > li").addClass("level-3"); 
$("li.level-3 > ul > li").addClass("level-4");

Возможно, есть более программный способ сделать это и учесть произвольную глубину, но это было быстро.

0 голосов
/ 27 апреля 2010

Я сыграю ... ты всегда можешь сделать это рекурсивным:)

$(function() {
    addLevel($('ul:first'));
});

function addLevel($ul, level) {
    ( ! level ) ? level = 1 : level += 1;
    $ul.children('li').each(function() {
        $(this).addClass('level-' + level);
        $(this).children('ul').each(function() { addLevel($(this), level) });
    });
}
...