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

#jquery #navigation #html-lists

#jquery #навигация #html-списки

Вопрос:

У меня есть вложенный неупорядоченный список, заполненный ajax, и я хочу создать из него навигацию в стиле хлебных крошек. Конечным результатом должно быть, что я нажимаю на любой узел в списке, и элементы родительского списка отображаются в навигации по хлебным крошкам.

 <div id="list">
    <ul>
        <li class="expanded">
            <a href="#" id="1122">Root Group</a>
        </li>
        <ul>
            <li class="expanded">
                <a href="#" id="1126">Northeast US</a>
            </li>
            <ul>
                <li class="collapsed">
                    <a href="#" id="1127">Massachusetts</a>
                </li>
                <ul style="display: none; ">
                    <li class="expanded node">
                        <a href="#" id="1128">Mansfield-Foxboro</a>
                    </li>
                    <li class="expanded node">
                        <a href="#" id="1129">North Attleboro</a>
                    </li>
                </ul>
                <li class="expanded">
                    <a href="#" id="1144">New Hampshire</a>
                </li>
                <ul>
                    <li class="expanded node">
                        <a href="#" id="1145">Manchester</a>
                    </li>
                </ul>
            </ul>
            <li class="expanded">
                <a href="#" id="1181">Mid-Atlantic US</a>
            </li>
            <ul>
                <li class="expanded">
                    <a href="#" id="1182">New York City</a>
                </li>
                <ul>
                    <li class="expanded node">
                        <a href="#" id="1183">Time Square</a>
                    </li>
                </ul>
            </ul>
        </ul>
    </ul>
</div>
  

Итак, я нажимаю на Нью-Йорк и получаю:
Корневая группа> Среднеатлантический регион США> Нью-Йорк

Я нажимаю на Северный Эттлборо и получаю: Корневая группа> Северо-восток США> Массачусетс> Северный Эттлборо

Есть ли способ построить этот путь с помощью обхода jQuery?

Ответ №1:

Вы можете начать с выбранного <a> элемента, использовать parents() для сопоставления <ul> элементов в его цепочке предков, затем применить prev() к результату, чтобы получить непосредственно предшествующие <li> элементы.

Оттуда вы можете использовать find() для сопоставления <a> элементов в элементах списка. Если вы добавите () саму гиперссылку, по которой вы щелкнули, в результирующий набор, у вас будет объект jQuery, содержащий все гиперссылки в пути в правильном порядке.

Теперь вам нужно только использовать map() для создания массива внутренних текстовых значений из <a> элементов, а также Array.join() для объединения строки пути. Конечный результат выглядит примерно так:

 $("a").click(function() {
    var path = $(this).parents("ul").prev("li").find("a").add(this)
        .map(function() {
            return $(this).text();
        }).get().join(" > ");

    // Do something with 'path'...
});
  

Вы можете протестировать это в этой скрипке.

Комментарии:

1. Это идеально — я не хотел вводить какую-либо ненужную разметку, и это находит точный набор, также не зависящий от класса .node. Спасибо!

Ответ №2:

Вы можете получить все <li> восходящие значения щелчка <li> с помощью следующего кода:

 $('li').bind('click', function () {
    var $ascendants = $(this).parents('ul'),
        output      = [];
    $.each($ascendants, function (index, value) {
        output.push($(value).children('li').not('.node').children('a:first').text());
    });
    //output is not an array of all the text within parent li tags of the clicked li tag
    console.log(output);
});
  

Это находит все восходящие <ul> теги того <li> , на который был нажат, перебирает их, выбирая текст из не .node <li> «s.

Вот jsfiddle, который выводит массив, который вы можете использовать для своих хлебных крошек: http://jsfiddle.net/rE9x8/1 /

Ответ №3:

Я просто грубо перемещался по структуре:

 $('a').click(function(e){
    e.preventDefault();
    for (var current = $(this),string = [];current.parent().parent().parent().attr('id') != 'list';current = current.parent().parent().prev().children('a'))
        string.push(current.text());
    string.push(current.text());
    alert(string.reverse().join('>'));
});