JQuery: 如何给嵌套元素一个一个地添加一个class?
JQuery: How to add a class to nested elements, one by one?
好的,我正在创建一个多级菜单,当一个 sub-menu 打开时,所有其他菜单都关闭,除非 sub-menu 嵌套了另一个 sub-menu,在在这种情况下,除了 parent 和当前的 sub-menu.
之外,所有其他 sub-menu 都已关闭
我用这段代码来解决问题:
$('li').on('click', function(){
$('li').not(this).each(function(){
$(this).find('ul').removeClass('red');
});
$(this).find('ul').addClass('red');
});
在此示例中,出于演示目的仅使用颜色更改,但问题是相同的,单击一个 <li> 元素并将颜色更改为下一个 <ul>children。我的代码运行得不是很好,单击时将所有嵌套的 <ul> 更改为红色。有什么问题?请帮助,提前致谢。
这里的主要问题是,当您执行 $('li').on(...)
时,您正在为每个 li
创建一个事件处理程序。所以当你点击一个子层时,它也会触发所有父层的点击事件。
您可以在主 ul
上有一个事件,并通过一个函数处理所有事情:
$('.menu').on('click', function(e){
// get clicked item
var clickedItem = $(e.target).closest('li')[0];
// remove all active classes
$('.menu ul').removeClass('red')
// find the ul inside the clicked item
.filter(function(_index, _ul){
return $.contains(clickedItem, _ul);
})
// add active class
.addClass('red');
});
工作 fiddle - https://jsfiddle.net/ttkqqd64/2/
使用 stopPropagation 来阻止 li 的父级接收点击事件。然后只把红色的class应用到李兄的身上。
$('li').on('click', function(ev){
ev.preventDefault();
ev.stopPropagation();
$(this).siblings().find('ul').removeClass('red');
$(this).find('ul').addClass('red');
});
好的,我正在创建一个多级菜单,当一个 sub-menu 打开时,所有其他菜单都关闭,除非 sub-menu 嵌套了另一个 sub-menu,在在这种情况下,除了 parent 和当前的 sub-menu.
之外,所有其他 sub-menu 都已关闭我用这段代码来解决问题:
$('li').on('click', function(){
$('li').not(this).each(function(){
$(this).find('ul').removeClass('red');
});
$(this).find('ul').addClass('red');
});
在此示例中,出于演示目的仅使用颜色更改,但问题是相同的,单击一个 <li> 元素并将颜色更改为下一个 <ul>children。我的代码运行得不是很好,单击时将所有嵌套的 <ul> 更改为红色。有什么问题?请帮助,提前致谢。
这里的主要问题是,当您执行 $('li').on(...)
时,您正在为每个 li
创建一个事件处理程序。所以当你点击一个子层时,它也会触发所有父层的点击事件。
您可以在主 ul
上有一个事件,并通过一个函数处理所有事情:
$('.menu').on('click', function(e){
// get clicked item
var clickedItem = $(e.target).closest('li')[0];
// remove all active classes
$('.menu ul').removeClass('red')
// find the ul inside the clicked item
.filter(function(_index, _ul){
return $.contains(clickedItem, _ul);
})
// add active class
.addClass('red');
});
工作 fiddle - https://jsfiddle.net/ttkqqd64/2/
使用 stopPropagation 来阻止 li 的父级接收点击事件。然后只把红色的class应用到李兄的身上。
$('li').on('click', function(ev){
ev.preventDefault();
ev.stopPropagation();
$(this).siblings().find('ul').removeClass('red');
$(this).find('ul').addClass('red');
});