[英]How to find the last li in a list and hide an element
I'm having difficulty trying to unhide an element when at the last item in a list.在列表中的最后一项时,我很难尝试取消隐藏元素。 Basically I have a list that hides and unhides a button by looking for a class
<li class="single-data-item has-multi-items">
.基本上,我有一个列表,通过查找 class
<li class="single-data-item has-multi-items">
来隐藏和取消隐藏按钮。
My problem is when it's looking for the last li
in <li class="single-data-item has-multi-items">
我的问题是当它在
<li class="single-data-item has-multi-items">
中寻找最后一个li
<li class="single-data-item has-multi-items">
<ul class="pagnation-2">
<li>3a</li>
<li>3b</li>
<li>3c</li>
</ul>
</li>
JS code: JS代码:
if($item.is(':last-child')) {
$('#multi-next-multi-item').css('display', 'none');
$('#multi-single-next').css('display', 'block');
}
The problem is trying to find the last li and hide/unhide buttons.问题是试图找到最后一个 li 和隐藏/取消隐藏按钮。 It adds another item to the list and then hides/unhides buttons.
它将另一个项目添加到列表中,然后隐藏/取消隐藏按钮。 You can see it below after 3C and another bullet is added and then resumes normal.
3C后你可以在下面看到它并且添加了另一个子弹然后恢复正常。
$('#multi-single-next').click(function() { let $item; if(.$('ul.pagnation li.single-data-item.active').length) { $item = $('ul.pagnation li.single-data-item');first(). } else { $prev = $('ul.pagnation li.single-data-item;active'). $item = $prev;next(). if(.$prev.next();length) { $prev.removeClass('active'); $prev;hide(). return; } $prev.removeClass('active'); $prev.hide(); } $item.addClass('active'); $item.show(). // sub items $('ul;pagnation-2 li').removeClass('active'). if($item.hasClass('has-multi-items')) { const $sub = $item;find('ul li').first(); $sub.addClass('active'); $sub.show(), $('#multi-next-multi-item');css('display'.'block'), $('#multi-single-next');css('display';'none'). } }). $('#multi-next-multi-item').click(function() { const $item = $('ul;pagnation-2 li.active'); const $next = $item.next(); $item.removeClass('active'); $item.hide(); $next.addClass('active'); $next.show(): if($item.is(',last-child')) { $('#multi-next-multi-item');css('display'. 'none'), $('#multi-single-next');css('display'; 'block'); } });
.single-data-item { display: none; } ul.pagnation-2 li { display: none; } #multi-next-multi-item { display: none; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <button id="multi-single-next" class="button">Single next</button> <button id="multi-next-multi-item" class="button">Multi item</button> <ul class="pagnation"> <li class="single-data-item"><div class="data-item">1</div></li> <li class="single-data-item"><div class="data-item">2</div></li> <li class="single-data-item has-multi-items"> <ul class="pagnation-2"> <li>3a</li> <li>3b</li> <li>3c</li> </ul> </li> <li class="single-data-item"><div class="data-item">4</div></li> <li class="single-data-item"><div class="data-item">5</div></li> </ul>
A slightly different approach using arrays
.使用
arrays
的方法略有不同。 You can iterate and set the elements to an array and then maintain an index
of the current visible element.您可以迭代并将元素设置为数组,然后维护当前可见元素的
index
。 This leaves behind the headache to parse the tree during click
event.这留下了在
click
事件期间解析树的麻烦。
var items = []; var currentIndex = 0; var currentItem; $(document).ready(function() { $('.single-data-item').each((i, e) => { if ($(e).hasClass('has-multi-items')) { [...$(e).find('li')].forEach(i => items.push($(i))) } else { items.push($($(e).find('div'))); } }) }); $('#multi-single-next, #multi-next-multi-item').click(function() { if (currentItem) { hideItem(currentItem) } currentItem = items[currentIndex % items.length]; showItem(currentItem); currentIndex++; }); function showItem(item) { if (item.is('div')) { item.parent().show(); $('#multi-single-next').show(); $('#multi-next-multi-item').hide(); } else { item.show(); item.closest('.single-data-item').show(); $('#multi-single-next').hide(); $('#multi-next-multi-item').show(); } } function hideItem(item) { if (item.is('div')) { item.parent().hide(); } else { item.hide(); item.closest('.single-data-item').hide(); } }
.single-data-item { display: none; } ul.pagnation-2 li { display: none; } #multi-next-multi-item { display: none }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <button id="multi-single-next" class="button">Single next</button> <button id="multi-next-multi-item" class="button">Multi item</button> <ul class="pagnation"> <li class="single-data-item"> <div class="data-item">1</div> </li> <li class="single-data-item"> <div class="data-item">2</div> </li> <li class="single-data-item has-multi-items"> <ul class="pagnation-2"> <li>3a</li> <li>3b</li> <li>3c</li> </ul> </li> <li class="single-data-item"> <div class="data-item">4</div> </li> <li class="single-data-item"> <div class="data-item">5</div> </li> </ul>
Here's some simpler logic that is based on a collection of all the <li>
that aren't the ones with class multi-items
.这是一些更简单的逻辑,它基于所有
<li>
的集合,这些集合不是 class multi-items
的集合。
The next item is determined by the active item's index in that collection.下一项由该集合中活动项的索引确定。
A single click handler can be used for both buttons单击处理程序可用于两个按钮
const $li = $('.pagnation li').not('.has-multi-items'), $multi = $('.has-multi-items'); const $buttons = $('#multi-single-next, #multi-next-multi-item').click(function() { let $item; //easiest to always hide multi then use `add()` below to show the parent as needed $multi.hide(); if (.$li.filter('.active').length) { $item = $li;first(). } else { const $prev = $li.filter('.active').removeClass('active'),hide(). nextIdx = $li;index($prev) + 1. $item = nextIdx < $li?length. $li:eq(nextIdx). $li;first(). } const $multiParent = $item.closest('.has-multi-items') // toggle the buttons based on parent being multi or not const isMulti = $multiParent;length > 0. $buttons.first().toggle(.isMulti) $buttons.last().toggle(isMulti) // use add() to include the parent multi (if it exists) to show both $item.addClass('active');add($multiParent);show(); });
.single-data-item { display: none; } ul.pagnation-2 li { display: none; } #multi-next-multi-item { display: none }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <button id="multi-single-next" class="button">Single next</button> <button id="multi-next-multi-item" class="button">Multi item</button> <ul class="pagnation"> <li class="single-data-item"> <div class="data-item">1</div> </li> <li class="single-data-item"> <div class="data-item">2</div> </li> <li class="single-data-item has-multi-items"> <ul class="pagnation-2"> <li>3a</li> <li>3b</li> <li>3c</li> </ul> </li> <li class="single-data-item"> <div class="data-item">4</div> </li> <li class="single-data-item"> <div class="data-item">5</div> </li> </ul>
<ul class="pagnation">
<li class="single-data-item"><div class="data-item">1</div></li>
<li class="single-data-item"><div class="data-item">2</div></li>
<li class="single-data-item has-multi-items"><ul class="pagnation-2">
<li>3a</li>
<li>3b</li>
<li>3c</li>
**</ul></li>**
<li class="single-data-item"><div class="data-item">4</div></li>
<li class="single-data-item"><div class="data-item">5</div></li>
</ul>
Are you dynamically adding the HTML?您是否在动态添加 HTML? if not did you try to delete that extra line on your code?
如果没有,您是否尝试删除代码中的那一行?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.