javascript - 使用 javascript 将分层无序列表转换为选择列表

标签 javascript jquery html

我想实现类似问题 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 和普通 JavaScript 就可以了。

最佳答案

这里有一些 jQuery 代码可以完成您想要的操作。因为我不知道你想要<select>在哪里已附加,我只是将其直接附加到 <body> 。还有一个问题是 $('li')选择器太贪婪(它将选择文档中的所有 <li> 元素),但考虑到有关 <ul> 的父元素的知识,很容易修复您发布的元素。

(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);

我还会考虑使用 <optgroup> 而不是 -前缀作为指示层次结构级别的一种方式。

关于javascript - 使用 javascript 将分层无序列表转换为选择列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7385509/

相关文章:

javascript - 如何添加格式的图像?

python - 防止换行符复制粘贴以进行 JSON 验证

javascript - 正则表达式匹配 Javascript 数字

javascript - 无法在图像上定位文本

javascript - 如何将 Canvas 数据保存到文件

bind - Jquery 将多个函数绑定(bind)到一个元素

CSS 文本与多个 Div 对齐

javascript - 中间的 Ion.RangeSlider 颜色

php - 将 Javascript 放在 .php 文件中有什么好处?

javascript - NPM ELIFECYCLE 错误 - 使用 node server.js 命令