【问题标题】:Convert a hierarchical unordered list to a select list using javascript使用 javascript 将分层无序列表转换为选择列表
【发布时间】:2011-09-12 09:03:59
【问题描述】:

我想实现类似于How to convert unordered list into nicely styled dropdown using jquery? 的问题,但使用分层 ul 列表。我想转换这个 HTML:

<ul>
    <li><a href="/">Home</a></li>
    <li><a href="/about">About us</a>
        <ul>
            <li><a href="/about/staff">Staff</a></li>
                <ul>
                    <li class="current-page"><a href="/about/staff/john-doe">John Doe</a></li>
                    <li><a href="/about/staff/jane-doe">Jane Doe</a></li>
                </ul>
        </ul>
    </li>
    <li><a href="/products">Products</a>
        <ul>
            <li><a href="/products/games">Games</a>
                <ul>
                    <li><a href="/products/games/xbox">XBOX</a></li>
                    <li><a href="/products/games/ps3">PlayStation 3</a></li>
                    <li><a href="/products/games/ipad">iPad</a></li>
                    <li><a href="/products/games/iphone">iPhone</a></li>
                </ul>
            </li>
            <li><a href="/products/hardware">Hardware</a>
                <ul>
                    <li><a href="/products/hardware/controllers">Controllers</a></li>
                    <li><a href="/products/hardware/memory">Memory units</a></li>
                </ul>
            </li>
            <li><a href="/products/upcoming">Upcoming</a></li>
        </ul>
    </li>
    <li><a href="/contact">Contact us</a></li>
</ul>

到这里:

<select>
    <option value="/">Home</option>
    <option value="/about">About us</option>
    <option value="/about/staff">- Staff</option>
    <option value="/about/staff/john-doe" selected>-- John Doe</option>
    <option value="/about/staff/jane-doe">-- Jane Doe</option>
    <option value="/products">Products</option>
    <option value="/products/games">- Games</option>
    <option value="/products/games/xbox">-- XBOX</option>
    <option value="/products/games/ps3">-- PlayStation 3</option>
    <option value="/products/games/ipad">-- iPad</option>
    <option value="/products/games/iphone">-- iPhone</option>
    <option value="/products/hardware">- Hardware</option>
    <option value="/products/hardware/controllers">-- Controllers</option>
    <option value="/products/hardware/memory">-- Memory</option>
    <option value="/products/upcoming">- Upcoming</option>
    <option value="/contact">Contact us</option>
</select>

li 上的“current-page”类应将select 中的相应选项标记为selected。 jQuery 和 vanilla JavaScript 都可以。

【问题讨论】:

  • 澄清一下:ul 列表在其层次结构中可以有三个以上的级别,因此不应对此有任何限制。
  • 你有没有尝试过?请发布您的代码示例。
  • 您是否尝试过从您与稍有不同的选择器链接的问题中的脚本开始?如果你让你的选择器选择你的根 ul 的所有 li 元素,然后将它们放在一个列表中,那么这应该可以解决大部分问题......

标签: javascript jquery html


【解决方案1】:

这里有一些 jQuery 代码做你想做的事。因为我不知道你想在哪里附加&lt;select&gt;,所以我只是将它直接附加到&lt;body&gt;。还有一个$('li') 选择器过于贪婪的问题(它将选择文档中的所有&lt;li&gt; 元素),但鉴于您已发布有关&lt;ul&gt; 元素的父元素的知识,它很容易修复。

(function($) { $(function() {
    var $select = $('<select>')
        .appendTo('body');

    $('li').each(function() {
        var $li    = $(this),
            $a     = $li.find('> a'),
            $p     = $li.parents('li'),
            prefix = new Array($p.length + 1).join('-');

        var $option = $('<option>')
            .text(prefix + ' ' + $a.text())
            .val($a.attr('href'))                       
            .appendTo($select);

        if ($li.hasClass('current-page')) {
            $option.attr('selected', 'selected');
        }
    });
});})(jQuery);

我还会考虑使用&lt;optgroup&gt; 代替- 前缀来表示层次结构级别。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2021-04-10
  • 2021-09-22
  • 1970-01-01
  • 2019-05-26
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多