如何創建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