从简单列表创建下拉菜单
我有当前列表看起来像:
如何使用Jquery创建这样的下拉菜单。
这意味着具有“_”的主项目之后的一些项目将被添加为主项目的下拉项目。 谢谢您帮忙。
您可以使用以下逻辑实现您正在寻找的效果。
- 创建一个公共缓存变量来保存上一个顶级菜单。
- 遍历所有菜单列表项,检查文本是否以下划线开头。
- 如果是,请将其附加到上一个顶级菜单。
- 如果没有,则将新的无序列表元素附加到此列表项,并将新列表缓存到上一个顶级菜单变量中。
- 循环完成后,您可以选择所有空列表并将其删除(
.find('ul:empty').remove()
)。
在下面的示例中,我赞成使用Native DOM API方法,而不是在几个实例中使用jQuery对应方法,因为:
-
$(this).append('
返回')
$(this)
而不是新创建的列表。 解决方法是添加另一行代码,或者只使用DOM APIthis.appendChild($('
确实返回新创建的列表。 和…- ')[0])
- 在使用DOM API这样简单的情况下使用jQuery似乎很浪费。 请参阅: youmightnotneedjquery.com
var prev; $('.menu li').each(function(){ if(/^_/.test(this.textContent) && prev) { prev.appendChild(this); } else { prev = this.appendChild($('')[0]); } }).find('ul:empty').remove();
// Create custom selectors $.extend($.expr[':'], { startsWith: function(e, i, m) { return $(e).text().trim().indexOf(m[3]) === 0; } }); $("li:not(:startsWith(_))").each(function(){ // LI that are not _Sub if($(this).next("li:startsWith(_)").length) // If my next() is _Sub, start grouping: $("
", { html: $(this).nextUntil("li:not(:startsWith(_))"), appendTo: this }); });
$('.group1').wrapAll('
'); $('.group2').wrapAll('
');