我正在尝试将(使用jQuery)多级UL
转换为SELECT
下拉列表,其中嵌套的UL
组包含在OPTGROUPS
中。我正在搞乱利用这种技术制作响应式网站菜单的想法(想想下拉菜单)。
我过去曾将列表项转换为选项下拉列表,但从未使用过optgroups,我无法弄明白。
我UL
结构的一个例子;
<ul id="sitemap">
<li><a href="www.google.com">Home</a></li>
<li><a href="www.google.com">Small Business</a>
<ul>
<li><a href="www.google.com">Laptops</a></li>
<li><a href="www.google.com">Workstations</a></li>
<li><a href="www.google.com">Workstations</a></li>
<li><a href="www.google.com">Printers</a></li>
<li><a href="www.google.com">Mobile Phones</a></li>
</ul>
</li>
<li><a href="www.google.com">Public Sector</a>
<ul>
<li><a href="www.google.com">State Government</a></li>
<li><a href="www.google.com">Federal Government</a></li>
<li><a href="www.google.com">Support and Drivers</a></li>
</ul>
</li>
<li><a href="www.google.com">Large Enterprise</a>
<ul>
<li><a href="www.google.com">Services</a></li>
<li><a href="www.google.com">Solutions</a></li>
</ul>
</li>
</ul>
我要成为什么的例子;
<select id="sitemap">
<option href="www.google.com">Home</option>
<optgroup label="Small Business">
<option href="www.google.com">Laptops</option>
<option href="www.google.com">Workstations</option>
<option href="www.google.com">Printers</option>
<option href="www.google.com">Mobile Phones</option>
</optgroup>
<optgroup label="Public Sector">
<option href="www.google.com">State Government</option>
<option href="www.google.com">Federal Government</option>
<option href="www.google.com">Support and Drivers</option>
</optgroup>
<optgroup label="Large Enterprise">
<option href="www.google.com">Services</option>
<option href="www.google.com">Solutions</option>
</optgroup>
</select>
它不需要深入到一个级别 - 而且我很确定optgroups并不能真正地工作得那么深。您可以提供任何帮助,非常欢迎。感谢。
答案 0 :(得分:4)
这个简单的解决方案
var markUp = ["<select id='sitemap'>"], $li, $a;
$("#sitemap > li").each(function(){
$li = $(this);
if($li.find(">li").length){
markUp.push("<optgroup label='"+$li.find(">a").text()+"'>");
$li.find(">li").each(function(){
$a = $(this).find("a");
markUp.push("<option value='"+$a.attr("href")+"'>"+$a.text()+"</option>")
});
markUp.push("</optgroup>");
}
else{
$a = $li.find("a");
markUp.push("<option value='"+$a.attr("href")+"'>"+$a.text()+"</option>")
}
});
markUp.push("</select>");
$("#sitemap").replaceWith(markUp.join(''));
$("#sitemap").change(function(){ window.location = $(this).val(); });
答案 1 :(得分:1)
您可以替换:
$("#sitemap ul").each(function(){
$(this).parent().replaceWith('<optgroup label="'+$(this).prev().text()+'">'+$(this).html().replace(/<li><a href="([^"]*)">([^<]*)<\/a><\/li>/g,'<option value="$1">$2</option>')+'</optgroup>');
});
$("#sitemap li").each(function(){
$(this).replaceWith('<option value="'+$(this).children().attr('href')+'">'+$(this).text()+'</option>');
});
$("#sitemap").removeAttr("id").wrapInner('<select id="sitemap" />').children().unwrap();
或者构建然后删除ul#sitemap:
function sitemapCycle(){
if(typeof(sitemapNode)==="undefined") sitemapNode= $("#sitemap");
if($(this).find("ul").length)
{
sitemapNode= $(sitemapNode).append('<optgroup label="'+$(this).children().first().text()+'" />').children().last();
$(this).find("ul li").each(sitemapCycle);
sitemapNode= $(sitemapNode).parent();
}
else
{
$(sitemapNode).append('<option value="'+$(this).children().attr("href")+'">'+$(this).text()+'</option>');
}
}
var sitemapNode;
$("#sitemap").removeAttr("id").after('<select id="sitemap" />').children().each(sitemapCycle).parent().remove();
答案 2 :(得分:0)
// #ShankarSangoli code changed a little
var markUp = ["<select id='sitemap'>"], $li, $a;
$("#sitemap > li").each(function() {
$li = $(this);
if ($li.find("> ul")) {
markUp.push("<optgroup label='"+$li.find(">a").text()+"'>");
$li.find("li").each(function() {
$a = $(this).find("a");
markUp.push("<option value='"+$a.attr("href")+"'>"+$a.text()+"</option>");
});
markUp.push("</optgroup>");
} else {
$a = $li.find("a");
markUp.push("<option value='"+$a.attr("href")+"'>"+$a.text()+"</option>")
}
});
markUp.push("</select>");
$("#sitemap").replaceWith(markUp.join(''));
$("#sitemap").change(function(){ window.location = $(this).val(); });