如何使用 JQuery 在每列上仅显示前 5 次,并使用“更多”和“更少”链接来显示更多结果。
我所追求的类似于 hide all li elements and show the first 2 and toggle them by button - 但我需要更多和更少的链接来显示/隐藏每个医生的所有时间段(即:更多/更少的链接应该一键显示/隐藏每个医生的 7 列中的所有时间)。
--这就是当前的情况--
--这就是我正在寻找的结果--
--我的 HTML 代码--
<div class="appointmentDetails">
<div class="staffInfo">
<div>Dr John Doe</div>
</div>
<div class="appointmentInfo">
<ul>
<li>
<div></div>
</li>
<li class="timeSlots bg">
<div><a href="#">08:00</a></div>
<div><a href="#">09:00</a></div>
<div><a href="#">10:00</a></div>
<div><a href="#">11:00</a></div>
<div><a href="#">12:00</a></div>
<div><a href="#">13:00</a></div>
<div><a href="#">14:00</a></div>
<div><a href="#">15:00</a></div>
<div><a href="#">16:00</a></div>
<div><a href="#">17:00</a></div>
<div><a href="#">18:00</a></div>
</li>
<li class="timeSlots">
<div><a href="#">08:00</a></div>
<div><a href="#">09:00</a></div>
<div><a href="#">10:00</a></div>
<div><a href="#">11:00</a></div>
<div><a href="#">12:00</a></div>
<div><a href="#">13:00</a></div>
<div><a href="#">14:00</a></div>
<div><a href="#">15:00</a></div>
<div><a href="#">16:00</a></div>
<div><a href="#">17:00</a></div>
<div><a href="#">18:00</a></div>
</li>
<li class="timeSlots bg">
<div><a href="#">08:00</a></div>
<div><a href="#">09:00</a></div>
<div><a href="#">10:00</a></div>
<div><a href="#">11:00</a></div>
<div><a href="#">12:00</a></div>
<div><a href="#">13:00</a></div>
<div><a href="#">14:00</a></div>
<div><a href="#">15:00</a></div>
<div><a href="#">16:00</a></div>
<div><a href="#">17:00</a></div>
<div><a href="#">18:00</a></div>
</li>
<li class="timeSlots">
<div><a href="#">08:00</a></div>
</li>
<li class="timeSlots bg">
<div><a href="#">09:00</a></div>
</li>
<li class="timeSlots">
<div><a href="#">09:00</a></div>
</li>
<li class="timeSlots bg">
<div><a href="#">08:00</a></div>
</li>
<li>
<div></div>
</li>
</ul>
</div>
</div>
<div class="appointmentDetails">
<div class="staffInfo">
<div>Dr Tom Smith</div>
</div>
<div class="appointmentInfo">
<ul>
<li>
<div></div>
</li>
<li class="timeSlots bg">
<div><a href="#">08:00</a></div>
<div><a href="#">09:00</a></div>
<div><a href="#">10:00</a></div>
<div><a href="#">11:00</a></div>
<div><a href="#">12:00</a></div>
<div><a href="#">13:00</a></div>
<div><a href="#">14:00</a></div>
<div><a href="#">15:00</a></div>
<div><a href="#">16:00</a></div>
<div><a href="#">17:00</a></div>
<div><a href="#">18:00</a></div>
</li>
<li class="timeSlots">
<div><a href="#">08:00</a></div>
<div><a href="#">09:00</a></div>
<div><a href="#">10:00</a></div>
<div><a href="#">11:00</a></div>
<div><a href="#">12:00</a></div>
</li>
<li class="timeSlots bg">
<div><a href="#">10:00</a></div>
</li>
<li class="timeSlots">
<div><a href="#">10:00</a></div>
</li>
<li class="timeSlots bg">
<div><a href="#">10:00</a></div>
</li>
<li class="timeSlots">
<div><a href="#">10:00</a></div>
</li>
<li class="timeSlots bg">
<div><a href="#">10:00</a></div>
</li>
<li>
<div></div>
</li>
</ul>
</div>
</div>
--这是我的 HTML/JAVASCRIPT/CSS 的实时演示--
请您参考如下方法:
在我们找到“解决方案”之前:您的标记不是很语义化。您正在显示时间列表,因此时间应该位于列表中,而不是 DIV 中。这些列表可以向左浮动或内联阻止,并且您可以消除标记中的大量内容。
假设您现在的时间如下所示:
<ul class="timeList">
<li class="timeSlot">8:00</li>
<li class="timeSlot">9:00</li>
...
<li class="timeSlot">18:00</li>
</ul>
你想做一些事情:
- 如果列表的位置超过 5 个,请隐藏 #5 之后的所有内容,并添加“更多”链接。
- 点击 MORE 链接时,显示 #5 之后的所有内容,然后更改为 LESS 链接
- 点击 LESS 链接时,隐藏 #5 之后的所有内容并改回 MORE 链接
如果您还没有使用 jQuery,我建议您使用 jQuery,因为它使事情变得更加容易,因此我对如何进行这些操作的建议使用它。
对于数字 1,您可以隐藏某个索引之后的元素,如下所示:
jQuery(".someClass").children(":gt(4)").hide();
这将隐藏第五个及更多元素。 但是:这也会隐藏其他列表的所有 LI,因为上面的代码将每个列表的所有子项放入一个大集合中,然后在第 5 个列表之后将它们全部隐藏元素。因此,您要做的就是迭代每个列表并仅隐藏其子列表。
我在这里创建了一个示例,将它们变成红色而不是隐藏它们,以便您可以直观地看到发生了什么:
jQuery(function () {
jQuery(".timeList").each(function () {
jQuery(this).children(":gt(4)").css('color','red');
});
});
您可以在此处查看它的实际效果:http://jsfiddle.net/7PeVj/
对于#2,您需要检查每个列表是否超过 5 个,并添加一个“更多”链接。由于我们已经迭代了每个列表,因此我们可以在那里实现该代码。您可以使用子结果的长度来查看是否超过 5,然后使用 jQuery 的 append() 函数添加按钮。
这是一个例子。请注意,我们现在只要求 timeSlots 的子级
jQuery(".timeList").each(function () {
// reference to the list
var theList = jQuery(this);
// reference to it's LIs that have .timeSlot
var kids = theList.children(".timeSlot");
// manipulate after element 5
kids.filter(":gt(4)").css('color','red');
//add a MORE link if we have more than 5
if (kids.length > 5) {
theList.append('<li class="slotMoreLess">MORE</li>');
}
});
工作示例:http://jsfiddle.net/7PeVj/2/
最后,您需要“连接”更多/更少以适本地隐藏和显示项目。您需要使用 jQuery 的 on() 来附加这些按钮的处理程序,因为它们在页面加载时不存在。
再次,工作示例位于:http://jsfiddle.net/7PeVj/4/
隐藏和显示可以使用上面代码中看到的内容来完成。您可以检查并设置 MORE 列表项的 text(),以在 LESS 和 MORE 之间来回切换,并根据需要隐藏显示。
