如何创建2个复选框,显示(即)1.食品和2音乐家......如何使用复选框过滤多个列表项目?
凡
1)如果两个复选框被选中,食品和音乐家都显示;
2)如果食物被检查并且音乐家未被检查,元素仍然可见,因为它包含食物,因为它还包含音乐家;
3)如果音乐家被选中并且食物未被选中,它也是可见的,因为它包含音乐家,尽管它也包含食物;
4)如果食物和音乐家都未选中,则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)如果食物被检查并且音乐家未被检查,元素仍然可见,因为它包含食物,因为它还包含音乐家;
3)如果音乐家被选中并且食物未被选中,它也是可见的,因为它包含音乐家,尽管它也包含食物;
4)如果食物和音乐家都未选中,则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
获胜的答案获得一块巧克力。
非常感谢!
工作实施例:http://www.kompagniekistemaker.nl – Riddlemethis