2012-01-17 101 views
0

給出一個無序列表任意長度,但僅過1嵌套的附加級別:格式列表爲列,當有嵌套

<nav id="top_nav"> 
    <nav id="nav1"> 
    <ul> 
     <li>saws</li> 
     <li>drills 
     <ul> 
      <li>hammer-drills</li> 
      <li>drill-drivers</li> 
     </ul> 
     </li> 
    </ul> 
    </nav> 
    <nav id="nav2">...</nav> 
    <nav id="nav3">...</nav> 
</nav> 

我想打破了原有的列表到格式化列表的列同胞列表(每隔14個元素分割)。

搜索插件後,我發現沒有列出基於內部li的嵌套列表。我想我會寫我自己的腳本,我會將列表分成額外的第一層ul並將它們左移(這是我迄今爲止所得到的):

對於每個導航塊,我獲取li元素的大小和找到分割點:

var max_height = 14; 
$('#top_nav nav').each(function(){ 
    //step 1: mark 2nd tier li's with level2 class 
    $(this).find('li ul li').addClass('level2'); 
    //step 2: mark 1st tier li's with level1 class 
    $(this).find('li').not('.level2').addClass('level1'); 

    var li_list = $(this).find('li'); 
    var list_size = li_list.size(); 
    //find which elements to split on and number of times 
    var split_points = (list_size/max_height) | 0; //bitwise OR is faster than Math.floor 
    var split_point = max_height - 1; 
    for (var i = 0; i < split_points; i++) { 

    split_list(li_list.eq(split_point), li_list.eq(split_point + 1)); 
    split_point += max_height; 

    } 
}); 

函數「split_list以」兩個連續的李的(但不一定是嵌套在同一UL)和通過注入對和

    分開並將它們拆分。

    function split_list(li_obj, next_li_obj) { 
        if (li_obj.length == 0 || next_li_obj.length == 0) { 
        return false; 
        } 
        if (li_obj.attr('class') == 'level2' && next_li_obj.attr('class') == 'level2') { 
    
        li_obj.append('</ul></ul>'); 
        next_li_obj.prepend('<ul><ul>'); 
        } else { 
        li_obj.append('</ul>'); 
        next_li_obj.prepend('<ul>'); 
        } 
    
    
    } 
    

    我認爲這應該工作,因爲它關閉列表

然後開始在正確的地方一個新的。但似乎jQuery「追加」和「前置」不允許我添加未封閉的標籤。它爲我關閉了它們。

有沒有辦法強制jQuery插入我想要的確切字符串?或者有更好的方法來做到這一點?

回答

0

只需構建一個HTML字符串,然後在最後附加/前綴它。這不僅可以讓你在必要時通過未封閉的標籤一塊一塊地構建它,它也是更好的性能(不是你會注意到的!)。

+0

我不知道我明白。是不是我現在附加/預先添加html字符串? – Homan 2012-01-17 23:49:39

+0

是的,但你要等到最後,在這一點上,HTML字符串將會完成,這意味着沒有未封閉的標籤。 – maxedison 2012-01-17 23:51:13