Convert UL to SELECT w/OPTGROUPs

前端 未结 3 1521
不知归路
不知归路 2021-02-10 15:47

I\'m trying to convert (with jQuery) a multi-level UL into a SELECT dropdown with the nested UL group being wrapped in OPTGROUPS

相关标签:
3条回答
  • 2021-02-10 15:58
        // #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(); });
    
    0 讨论(0)
  • 2021-02-10 16:10

    You can replace :

    $("#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();
    

    Or build and then remove the 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();
    
    0 讨论(0)
  • 2021-02-10 16:19

    Something simple solution for this

    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(); });
    
    0 讨论(0)
提交回复
热议问题