jQuery - 查找最接近列表项的兄弟 - 下一个或上一个
jQuery - Find closest sibling to list item - next or previous
我有一个功能,可以在单击按钮时删除带有活动 class 的 li。当活动的 li 被移除时,我需要将活动的 class 转移到最近的 li。 .next 和 .prev 都很好,但如果我要删除第一个或最后一个 li,请不要考虑。在这种情况下,.next 或 .prev 将不起作用。
除了使用 if 语句之外,我还可以在这里使用其他功能吗?不幸的是,closest 对我不起作用。
HTML
<ul>
<li class="active">List item #1</li>
<li>List item #2</li>
<li>List item #3</li>
<li>List item #4</li>
<li>List item #5</li>
</ul>
JS
$('.conversations-wrap').on('click', '.delete-message', function(){
// delete sidebar element
$('.message-details.active').remove();
// change sidebar active
$('.message-details.active').closest('li').addClass('active');
});
你可以试试这个
$(document).on('click', '.delete-message', function(){
//add a fake class to the li you need to remove
$('ul > li.active').addClass('toDelete');
//check if the active li is the last one in the list or not
//if it is a last one add the class active to previous li
if($('ul > li.toDelete').index() == $('ul > li').length - 1){
$('ul > li.toDelete').prev('li').addClass('active');
}else{ // if not the last add the class active to the next li
$('ul > li.toDelete').next('li').addClass('active');
}
// remove sidebar element
$('ul > li.toDelete').remove();
});
.active{
color : red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<li>List item #1</li>
<li>List item #2</li>
<li>List item #3</li>
<li>List item #4</li>
<li class="active">List item #5</li>
</ul>
<button class="delete-message">Delete Active li</button>
Note: be sure to make all actions before you remove the item
当您尝试将活动 class 添加到最接近的 li
时,您的 jQuery 选择器将找不到任何匹配项。这是因为您删除了上一行代码中的匹配元素。尝试将当前活动元素保存到变量,更改活动侧边栏元素,然后删除该元素。
$('.conversations-wrap').on('click', '.delete-message', function(){
// Get the current active element.
var currentActive = $('.message-details.active');
// Change the active sidebar element.
currentActive.closest('li').addClass('active');
// Delete the current sidebar element.
currentActive.remove();
});
这是我最终采用的解决方案。感谢@Mohamed-Yousef 为我指明了正确的方向。
$('.conversations-wrap').on('click', '.delete-message', function(){
// replace active class, otherwise we have two active classes later on
$('.message-details.active').removeClass('active').addClass('toRemove');
// change active class to closest li
if ( $('.message-inbox ul li:first-of-type').hasClass('toRemove') ) {
$('.message-details.toRemove').next('li').addClass('active');
} else {
$('.message-details.toRemove').prev('li').addClass('active');
}
// delete sidebar element
$('.message-details.toRemove').fadeOut(300, function() { $(this).remove();
});
我有一个功能,可以在单击按钮时删除带有活动 class 的 li。当活动的 li 被移除时,我需要将活动的 class 转移到最近的 li。 .next 和 .prev 都很好,但如果我要删除第一个或最后一个 li,请不要考虑。在这种情况下,.next 或 .prev 将不起作用。
除了使用 if 语句之外,我还可以在这里使用其他功能吗?不幸的是,closest 对我不起作用。
HTML
<ul>
<li class="active">List item #1</li>
<li>List item #2</li>
<li>List item #3</li>
<li>List item #4</li>
<li>List item #5</li>
</ul>
JS
$('.conversations-wrap').on('click', '.delete-message', function(){
// delete sidebar element
$('.message-details.active').remove();
// change sidebar active
$('.message-details.active').closest('li').addClass('active');
});
你可以试试这个
$(document).on('click', '.delete-message', function(){
//add a fake class to the li you need to remove
$('ul > li.active').addClass('toDelete');
//check if the active li is the last one in the list or not
//if it is a last one add the class active to previous li
if($('ul > li.toDelete').index() == $('ul > li').length - 1){
$('ul > li.toDelete').prev('li').addClass('active');
}else{ // if not the last add the class active to the next li
$('ul > li.toDelete').next('li').addClass('active');
}
// remove sidebar element
$('ul > li.toDelete').remove();
});
.active{
color : red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
<li>List item #1</li>
<li>List item #2</li>
<li>List item #3</li>
<li>List item #4</li>
<li class="active">List item #5</li>
</ul>
<button class="delete-message">Delete Active li</button>
Note: be sure to make all actions before you remove the item
当您尝试将活动 class 添加到最接近的 li
时,您的 jQuery 选择器将找不到任何匹配项。这是因为您删除了上一行代码中的匹配元素。尝试将当前活动元素保存到变量,更改活动侧边栏元素,然后删除该元素。
$('.conversations-wrap').on('click', '.delete-message', function(){
// Get the current active element.
var currentActive = $('.message-details.active');
// Change the active sidebar element.
currentActive.closest('li').addClass('active');
// Delete the current sidebar element.
currentActive.remove();
});
这是我最终采用的解决方案。感谢@Mohamed-Yousef 为我指明了正确的方向。
$('.conversations-wrap').on('click', '.delete-message', function(){
// replace active class, otherwise we have two active classes later on
$('.message-details.active').removeClass('active').addClass('toRemove');
// change active class to closest li
if ( $('.message-inbox ul li:first-of-type').hasClass('toRemove') ) {
$('.message-details.toRemove').next('li').addClass('active');
} else {
$('.message-details.toRemove').prev('li').addClass('active');
}
// delete sidebar element
$('.message-details.toRemove').fadeOut(300, function() { $(this).remove();
});