jQuery遍历无序列表/树视图

时间:2014-01-10 16:13:31

标签: jquery treeview html-lists tree-traversal

我基本上使用了没有搜索功能的jquery treeview插件http://bassistance.de/jquery-plugins/jquery-plugin-treeview/ - 我解决了 - 但是一旦我找到了项目,我也必须打开整个树视图 - 我只能这样做通过遍历树。所以我有以下问题:

假设我有以下UL

<ul id="mainlist" class="level1">
  <li>
      <div class="hitarea a1"></div>
      <div class="b1"></div>
  </li>
  <li>
      <div class="hitarea a2"></div>
      <div class="b1"></div>
  </li>
  <li>
     <div class="hitarea a3"></div>
     <div class="b1"></div>
     <ul class="level3">
       <li>
          <div class="hitarea a4"></div>
          <div class="b1"></div>
          <ul class="level2">
             <li>
               <div class="hitarea a5"></div>
               <div class="b1"></div>
             </li>
             <li>
               <div class="hitarea a6"></div>
              <div class="b1"></div>
            </li>
            <li>
              <div class="hitarea a7"></div>
              <div class="b1"></div>
            </li>
         </ul>
       </li>
       <li>
          <div class="hitarea a8"></div>
          <div class="b1"></div>
       </li>
       <li>
          <div class="hitarea a9"></div>
          <div class="b1"></div>
       </li>
    </ul>
  </li>
</ul>

我想要的是以下内容:

如果我点击带有“hitarea a5”类的div我希望获得所有以前的元素(div)和“hitarea”类 - 这样我就可以手动应用.click()来打开它们。这些将是以下内容:

  1. hitarea a4
  2. hitarea a3
  3. 以下我只得到第一个(hitarea a4):

       $("#mainlist .a5").parent().prev('.hitarea')
    

    但我想要所有先前的a4和a3 ....直到达到UL的根。

    prevAll也无济于事。

    ========================== 解决方案 ============= ===========================

    对于那些在jquery treeview插件(http://bassistance.de/jquery-plugins/jquery-plugin-treeview/)中寻找搜索功能的人来说,以下是我对开源社区的贡献(@ arun-p-johny)。他们可能想以某种方式在代码中包含它:

    <style>
    #search-bottom-div {
    z-index: 999;
    position: absolute;
    background: #FFF;
    padding: 5px;
    width: 220px;
    border: 1px solid #CCC;
    left: 125;
    top: 27;
    min-height: 50px;
    display: none;
    color: #000;
    }
    </style>
    
    <div style="float:left;">
         <input placeholder="Suchen" id="searchtreeitem" name="searchtreeitem"/>    
    </div>
    <div id="search-bottom-div">
        <div id="search-bottom-div-content"></div>
        <div id="search-bottom-div-close" style="text-align:right;text-decoration:underline;cursor:pointer;"><br/><br/>Close</div>
    </div>  
    
    
    
    
    $('#searchtreeitem').keyup(function(e) {  
            textval = $(this).val();
            $("#search-bottom-div-content").empty();
            $("#search-bottom-div").show();
    
            foundItems = $("#mainList").find("span:Contains("+textval+")");
    
            $.each(foundItems, function(index, value) {         
                $("#search-bottom-div-content").append($(value).clone()).append("<br/>");
            });
    
         });
    
        $("#search-bottom-div-content span").live( "click", function() {
            foundClass = $(this).attr("class");
            $("#mainList ."+foundClass).click();
    
            var $this = $("#mainList ."+foundClass);
            $lis = $this.parentsUntil('#mainList', 'li');
            $hitareas = $lis.children('.hitarea').not(this);
    
            $.each($hitareas, function(index, value) {
                if($(value).next('.orgeinhItem').find('.toporg').length == 0){
                    $(value).click();
                }           
            });
    
            $("#searchtreeitem").val("");
            $("#search-bottom-div").hide();
        });
    
        $("#search-bottom-div-close").live( "click", function() {
            $("#searchtreeitem").val("");
            $("#search-bottom-div").hide();
        }); 
    
        jQuery.expr[':'].Contains = function(a, i, m) { 
              return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
            };
    

1 个答案:

答案 0 :(得分:2)

尝试

jQuery(function () {
    $('.hitarea').click(function () {
        var $this = $(this),
            //find all li element between the clicked hitarea and the root ul
            $lis = $this.parentsUntil('#mainlist', 'li'),
            //find all hitarea elements in those li elements excludint the clicked hitaread
            $hitareas = $lis.children('.hitarea').not(this);

        //create an array which contains the class attribute values of hitareas
        var classes = $hitareas.map(function () {
            return this.className
        }).get();
        console.log(classes)
    })
})

演示:Fiddle