使用 jQuery 将嵌套无序列表转换为面包屑

发布于 2024-12-11 01:52:13 字数 2102 浏览 0 评论 0原文

我有一个由 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>

所以我点击纽约市,我得到: 根组>美国大西洋中部>纽约市

我点击 North Attleboro,我得到: 根组>美国东北部>马萨诸塞州> North Attleboro

有没有办法使用 jQuery 遍历来构建这条路径?

I have a nested unordered list populated by ajax and I am looking to create breadcrumb-style navigation out of it. The end result should be I click on any node in the list and the parent list items show up in the breadcrumb navigation.

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

So I click on New York City and I get:
Root Group > Mid-Atlantic US > New York City

I click on North Attleboro and I get:
Root Group > Northeast US > Massachusetts > North Attleboro

Is there a way to build this path using jQuery traversal?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

千里故人稀 2024-12-18 01:52:13

您可以从单击的 元素开始,使用 parents() 匹配其祖先链中的

    元素,然后应用 prev() 到结果中获得紧邻

  • 元素之前。

从那里,您可以使用 find() 来匹配 列表项中的元素。如果您add()将单击的超链接本身添加到结果集中,您将拥有一个包含所有内容的 jQuery 对象路径中的超链接,按正确的顺序。

现在您只需使用 map()构建内部文本值数组 元素,以及 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'...
});

您可以在 this fiddle 中测试它。

You can start from the clicked <a> element, use parents() to match the <ul> elements in its ancestor chain, then apply prev() to the result to obtain the immediately preceding <li> elements.

From there, you can use find() to match the <a> elements within the list items. If you add() the clicked hyperlink itself to the result set, you will have a jQuery object containing all the hyperlinks in the path, in the proper order.

Now you only have to use map() to build an array of inner text values from the <a> elements, along with Array.join() to concatenate a path string. The end result is something like:

$("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'...
});

You can test it in this fiddle.

↘人皮目录ツ 2024-12-18 01:52:13

您可以使用以下代码获取单击的

  • 的所有
  • 上升元素:
  • $('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);
    });
    

    这会找到所有上升元素

    被单击的

  • 的 code> 标签,迭代它们,从非 .node 中选择文本
  • 的。
  • 这是一个 jsfiddle,它输出一个可用于面包屑的数组: http://jsfiddle.net/rE9x8/1 /

    You can get all the <li> ascendants of the clicked <li> with the following code:

    $('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);
    });
    

    This finds all the ascendant <ul> tags of the <li> that was clicked, the iterates through them, selecting the text from non .node <li>'s.

    Here is a jsfiddle that outputs an array you can use for your breadcrums: http://jsfiddle.net/rE9x8/1/

    标点 2024-12-18 01:52:13

    我只是粗略地浏览了结构:

    $('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('>'));
    });
    

    I just crudely navigated the structure:

    $('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('>'));
    });
    
    ~没有更多了~
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文