我的jQuery代码找到第一个父级有什么问题?

时间:2016-07-30 12:03:48

标签: jquery parent

我正在开发一个具有树视图菜单的小应用程序,所以这是html:

<ul class="sidebar-menu">
    <li class="active"><a href="javascript:;"> ELEMENT 1 </a></li>
    <li class="treeview">
        <a href="javascript:;"> ELEMENT 2 <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span></a>
        <ul class="treeview-menu">
            <li><a href="javascript:;"> ELEMENT 2.1 </a></li>
            <li><a href="javascript:;"> ELEMENT 2.2 </a></li>
        </ul>
    </li>
    <li><a href="javascript:;"> ELEMENT 3 </a></li>
</ul>

我正在尝试突出显示已添加.active类的单击li元素。但是,当您单击子元素时,我还要突出显示父元素。例如,如果您点击ELEMENT 2.1我想要突出显示ELEMENT 2

这是我要获取的jQuery代码,首先是单击的元素,然后它是li parent(由于其他原因,我不能在没有:not选择器的情况下执行此操作:

$(".sidebar-menu").on("click", "li:not(.treeview)", function(e){
    $(e.delegateTarget).parents("li").first();
}

if语句按预期工作,但第二行总是在控制台中给出undefined错误。

3 个答案:

答案 0 :(得分:4)

<强> Working Fiddle

您可以使用引用当前单击元素的jQuery对象$(this),然后addClss()添加类活动类:

$(this).parents('li').addClass('active');

注意:您必须使用$('li').removeClass('active');从所有其他邮件中删除活动课程。

希望这有帮助。

&#13;
&#13;
$(".sidebar-menu").on("click", "li:not(.treeview)", function(e){
  //remove active class from all the other li's
  $('li').removeClass('active');
 
  $(this).addClass('active'); //add active class to the clicked li

  //Add active class to the parent if exist
  if( $(this).parents('li').length > 0)
      $(this).parents('li').addClass('active');
})
&#13;
.active{
  background-color: yellow;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="sidebar-menu">
  <li class="active"><a href="javascript:;"> ELEMENT 1 </a></li>
  <li class="treeview">
    <a href="javascript:;"> ELEMENT 2 <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span></a>
    <ul class="treeview-menu">
      <li><a href="javascript:;"> ELEMENT 2.1 </a></li>
      <li><a href="javascript:;"> ELEMENT 2.2 </a></li>
    </ul>
  </li>
  <li><a href="javascript:;"> ELEMENT 3 </a></li>
</ul>
&#13;
&#13;
&#13;

答案 1 :(得分:3)

使用$(this)代替$(e.delegateTarget)

$(".sidebar-menu").on("click", "li:not(.treeview)", function(e){
    $(this).parents("li").first();
}

答案 2 :(得分:1)

我的建议基于toggleclass和事件stopPropagation:

$(function () {
  $(".sidebar-menu").on("click", "li", function(e){
    $(".sidebar-menu").find('.active').toggleClass('active');
    if ($(this).is('li.treeview')) {
      $(e.target).toggleClass('active');
    } else {
      $(e.target).closest("li").toggleClass('active');
      if ($(e.target).closest('.treeview').length == 1) {
        $(e.target).closest('.treeview-menu').prev().toggleClass('active');
        e.stopPropagation();
      }
    }
  });
});
.active {
  background-color: red;
}
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>

<ul class="sidebar-menu">
    <li class="active"><a href="javascript:;"> ELEMENT 1 </a></li>
    <li class="treeview">
        <a href="javascript:;"> ELEMENT 2 <span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span></a>
        <ul class="treeview-menu">
            <li><a href="javascript:;"> ELEMENT 2.1 </a></li>
            <li><a href="javascript:;"> ELEMENT 2.2 </a></li>
        </ul>
    </li>
    <li><a href="javascript:;"> ELEMENT 3 </a></li>
</ul>