我的 jQuery 代码查找第一个父项有什么问题?
What's wrong with my jQuery code finding the first 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>
我试图突出显示单击的 li 元素,并向其添加 .active
class。但是,当您单击子元素时,我还想突出显示父元素。例如,如果您单击 ELEMENT 2.1
我还想突出显示 ELEMENT 2
。
这是我要获取的 jQuery 代码,首先是单击的元素,然后是 li 父元素(由于其他原因,如果没有 :not
选择器,我无法做到:
$(".sidebar-menu").on("click", "li:not(.treeview)", function(e){
$(e.delegateTarget).parents("li").first();
}
if 语句按预期工作,但第二行总是在控制台中给我一个 undefined
错误。
您可以使用引用当前单击元素的 jQuery 对象 $(this)
然后 addClss()
添加 class 活动 class :
$(this).parents('li').addClass('active');
注意: 您必须使用 $('li').removeClass('active');
从所有其他 li 中删除活动的 class。
希望对您有所帮助。
$(".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');
})
.active{
background-color: yellow;
}
<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>
使用$(this)
代替$(e.delegateTarget)
$(".sidebar-menu").on("click", "li:not(.treeview)", function(e){
$(this).parents("li").first();
}
我的提案基于 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>
我正在开发一个带有树视图菜单的小应用程序,所以这是 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>
我试图突出显示单击的 li 元素,并向其添加 .active
class。但是,当您单击子元素时,我还想突出显示父元素。例如,如果您单击 ELEMENT 2.1
我还想突出显示 ELEMENT 2
。
这是我要获取的 jQuery 代码,首先是单击的元素,然后是 li 父元素(由于其他原因,如果没有 :not
选择器,我无法做到:
$(".sidebar-menu").on("click", "li:not(.treeview)", function(e){
$(e.delegateTarget).parents("li").first();
}
if 语句按预期工作,但第二行总是在控制台中给我一个 undefined
错误。
您可以使用引用当前单击元素的 jQuery 对象 $(this)
然后 addClss()
添加 class 活动 class :
$(this).parents('li').addClass('active');
注意: 您必须使用 $('li').removeClass('active');
从所有其他 li 中删除活动的 class。
希望对您有所帮助。
$(".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');
})
.active{
background-color: yellow;
}
<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>
使用$(this)
代替$(e.delegateTarget)
$(".sidebar-menu").on("click", "li:not(.treeview)", function(e){
$(this).parents("li").first();
}
我的提案基于 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>