【发布时间】:2017-03-19 08:47:43
【问题描述】:
如何创建 2 个复选框,显示(即)1. 食物和 2. 音乐家……
在哪里
1) 如果两个复选框都被选中,则会显示食物和音乐家;
2) 如果勾选了 food 而未勾选了音乐家,该元素仍然可见,因为它包含了食物,尽管它也包含了音乐家;
3)如果选中了音乐家而未选中食物,它仍然是可见的,因为它包含音乐家,尽管它也包含食物;
4)如果food和music都没有勾选,li项就消失了。
我的html是:
<html>
<head>
</head>
<body>
<ul class="filterSection">
<li>
<input checked="true" type="checkbox" value="Food"/>
<label>Food</label>
</li>
<li>
<input checked="true" type="checkbox" value="Musician"/>
<label>Musician</label>
</li>
</ul>
<ul id="itemsToFilter">
<li data-type="Food">Food</li>
<li data-type="Musician">Musician</li>
<li data-type="Food Musician">Food & Musician</li>
<ul>
</body>
</html>
以及以下 javascript 代码(集成在两个列表下方):
<script>
// get all of our list items
var itemsToFilter = document.querySelectorAll("#itemsToFilter li");
//setup click event handlers on our checkboxes
var checkBoxes = document.querySelectorAll(".filterSection li input");
for (var i = 0; i < checkBoxes.length; i++) {
checkBoxes[i].addEventListener("click", filterItems, false);
checkBoxes[i].checked = true;
}
// the event handler!
function filterItems(e) {
var clickedItem = e.target;
if (clickedItem.checked == true) {
hideOrShowItems(clickedItem.value, "hideItem", "showItem");
} else if (clickedItem.checked == false) {
hideOrShowItems(clickedItem.value, "showItem", "hideItem");
} else {
// deal with the indeterminate state if needed
}
}
// add or remove classes to show or hide our content
function hideOrShowItems(itemType, classToRemove, classToAdd) {
for (var i = 0; i < itemsToFilter.length; i++) {
var currentItem = itemsToFilter[i];
if (currentItem.getAttribute("data-type") == itemType) {
removeClass(currentItem, classToRemove);
addClass(currentItem, classToAdd);
}
}
}
//
// Helper functions for adding and removing class values
//
function addClass(element, classToAdd) {
var currentClassValue = element.className;
if (currentClassValue.indexOf(classToAdd) == -1) {
if ((currentClassValue == null) || (currentClassValue === "")) {
element.className = classToAdd;
} else {
element.className += " " + classToAdd;
}
}
}
function removeClass(element, classToRemove) {
var currentClassValue = element.className;
if (currentClassValue == classToRemove) {
element.className = "";
return;
}
var classValues = currentClassValue.split(" ");
var filteredList = [];
for (var i = 0 ; i < classValues.length; i++) {
if (classToRemove != classValues[i]) {
filteredList.push(classValues[i]);
}
}
element.className = filteredList.join(" ");
}
</script>
我发现在 css 中你可以做到以下几点:
#itemsToFilter li[data-type*=Food] {background-color: green;}
#itemsToFilter li[data-type*=Musician] {background-color: yellow;}
(星号导致识别一个或多个数据类型属性)
那里没有问题,所以我对javascript部分感兴趣:
在哪里
1) 如果两个复选框都被选中,则会显示食物和音乐家;
2) 如果勾选了 food 而未勾选了音乐家,该元素仍然可见,因为它包含了食物,尽管它也包含了音乐家;
3)如果选中了音乐家而未选中食物,它仍然是可见的,因为它包含音乐家,尽管它也包含食物;
4)如果food和music都没有勾选,li项就消失了。
我想要这个,而不必创建一个名为“美食音乐家”的新复选框。这可以通过添加来完成
#itemsToFilter li[data-type*='Food Musician'] {background:pink;}
所以只能使用复选框“食物”和“音乐家”。
在http://test.kompagniekistemaker.nl上查看或关注此示例
我的问题是在阅读了 Kirupa 的这篇文章后提出的:
https://www.kirupa.com/html5/filtering_items_in_a_list.htm
我也找到了这个例子,这正是我想要的:
Filter by multiple data attribute elements
获胜的答案将获得一块巧克力。
提前非常感谢!
【问题讨论】:
标签: javascript html css checkbox filter