我有一组项目,每个项目都有一个或多个数据属性(在数组中)。在它们上面,有一组选项卡,每个选项卡都有一个与其标签相同的数据属性。当我单击一个选项卡时,我想隐藏所有不具有相同数据属性的项。如果每个项目只有一个数据属性,这将很容易,但有些项目有多个数据属性,如果它们匹配,则需要显示。我有点陷入JS,但我觉得我很接近。有人看出我哪里做错了吗?
谢谢你
(function($) {
$(document).ready(function() {
$(".main .tabs .tab").click(function() {
let currentTab;
currentTab = $(this).data('dept');
$(".main .tabs .tab").removeClass('active');
$(this).addClass('active');
// loop through all members and match those of currentTab
$(".member-container .member").each(function(i, member) {
if (currentTab == 'all') {
$(member).removeClass('hide');
} else {
$(member).removeClass('hide');
let memberDepts = $(member).data('dept');
$(memberDepts).each(function(j, dept) {
if ($(member).data('dept') != dept) {
$(member).addClass('hide')
}
})
}
})
})
});
})(jQuery);
body {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.tabs {
display: flex;
column-gap: 15px;
padding-top: 100px;
justify-content: center;
}
.tabs .tab {
padding: 20px;
border: 2px solid green;
cursor: pointer;
}
.tabs .tab.active {
background-color: green;
color: #fff;
}
.member-container {
display: flex;
width: 90%;
padding-top: 100px;
margin: 0 auto;
flex-wrap: wrap;
column-gap: 20px;
row-gap: 20px;
}
.member-container .member {
width: 30%;
border: 2px solid red;
height: 100px;
display: flex;
align-items: center;
justify-content: center;
font-size: 25px;
}
.member-container .member.hide {
display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<main class="main">
<div class="tabs">
<div data-dept="all" class="tab">All</div>
<div data-dept="finance" class="tab">Finance</div>
<div data-dept="adminisration" class="tab">Admin</div>
<div data-dept="marketing" class="tab">Marketing</div>
<div data-dept="executive" class="tab">Executive</div>
<div data-dept="senior" class="tab">Senior</div>
<div data-dept="organization" class="tab">Org</div>
</div>
<div class="member-container">
<div data-dept="["finance"]" class="member">John Doe</div>
<div data-dept="["finance", "marketing"]" class="member">Jane Doe</div>
<div data-dept="["senior"]" class="member">Billy Bob</div>
<div data-dept="["adminisration", "senior"]" class="member">Suzy Q</div>
<div data-dept="["executive"]" class="member">Random Name</div>
<div data-dept="["marketing"]" class="member">Another Name</div>
<div data-dept="["organization","executive","marketing"]" class="member">Foo Bar</div>
<div data-dept="["adminisration"]" class="member">Does it Matter?</div>
</div>
</main>
我也有一个Codepen的链接:https://codepen.io/paul-molnar/pen/QWzazKq
4条答案
按热度按时间lh80um4z1#
试试这个基本上你的问题是围绕着这段代码:
memberDepts
是一个字符串数组,一个部门列表。然后,您尝试选择它作为jQuery对象,就像它是一个HTML元素一样,并在它上面循环。在这个循环中,你试图查看每个成员是否被包含。由于我们已经将当前选定的department作为一个字符串,并且我们有一个字符串数组,因此我们可以使用
.includes()
来大大简化并纠正这个问题。我还做了一些其他的改变,主要是围绕尽可能少地选择元素。如果在一个包含10个元素的循环中调用
$(member)
3次,那就是30次选择元素的调用!它只需要发生一次。tsm1rwdh2#
试试这个。我只是用空格作为dept之间的分隔符。如果你有一个部门。名称与空格,你可以选择一个不同的字符作为字符或使用破折号来表示一个空格。
你可以用add/remove类替换.show()和.hide()。我只是拿它们做例子。
r3i60tvu3#
使用array
.includes()
方法测试所选选项卡是否在data
属性的数组中。rslzwgfq4#
按空格分割 depts 数据集,并使用Array.prototype.includes()