[英]How do I filter an unorderded list to display only selected items using Javascript?
我在此嘗試創建JSFiddle ,以便僅當下拉列表中選擇的選項與其類匹配時,無序列表中的項目才可見。 列表項可能具有多個類別,但是只要至少一個類別匹配,就應該使該項目可見。
Javascript如下所示:
function showListCategories() {
var selection = document.getElementById("listDisplayer").selectedIndex;
var unHidden = document.getElementsByClassName(selection);
for (var i = 0; i < unHidden.length; i++) {
unHidden[i].style.display = 'visible';
}
};
這個想法是,它從下拉列表中獲取當前選擇,基於匹配的類創建一個數組,然后遍歷每個項目並將CSS隱藏在每個項目上。
但是,它不起作用。 誰能告訴我我要去哪里?
請注意,我尚未編碼“全部顯示”選項。 我想一旦解決了第一個問題,我也許就能弄清楚。
在您的提琴中,更改加載腳本No wrap - in <head>
。
只需像下面那樣更改您的功能
function showListCategories() {
var lis = document.getElementsByTagName('li');
for (var i = 0; i < lis.length; i++) {
lis[i].style.display = 'none';
}
//above code to reset all lis if they are already shown
var selection = document.getElementById("listDisplayer").value;
lis = document.getElementsByClassName(selection);
for (var i = 0; i < lis.length; i++) {
lis[i].style.display = 'block';
}
};
並且在css
應該none
hidden
.cats, .rats, .bats {
display: none;
}
如果要在選擇showAll
時顯示所有li
,請將all
類添加到所有lis。
您發生了一些事情。 首先,您的小提琴未正確設置,如果打開控制台,則會看到:
未捕獲的ReferenceError:showListCategories未定義
這意味着該函數在附加事件時不存在,或者該函數超出范圍,因為默認情況下,jsFiddle會將代碼包裝在onLoad
事件中。 要修復它,您需要將腳本加載為No wrap - in <body>
。
其次,CSS中沒有display:visible
屬性。 您要切換的屬性是display:none
和display:list-item
,因為這是<li>
元素的默認樣式。
現在,要進行此工作,如果將通用類添加到所有項,例如item
,則可以更輕松地將它們全部隱藏,並通過檢查其是否具有特定類來顯示所需的類,這相對容易一些。多次查詢DOM。 您應該緩存選擇器,不必每次調用該函數時都進行查詢:
var select = document.getElementById('listDisplayer');
var items = document.getElementsByClassName('item');
function showListCategories() {
var selection = select.options[select.selectedIndex].value;
for (var i=0; i<items.length; i++) {
if (items[i].className.indexOf(selection) > -1) {
items[i].style.display = 'list-item';
} else {
items[i].style.display = 'none';
}
}
}
演示: http : //jsfiddle.net/E2DKh/28/
您的代碼中有很多錯誤,而jsFiddle中的設置卻有錯誤。 這是一個可以實現“全部”選項的工作版本:
工作演示: http : //jsfiddle.net/jfriend00/5Efc5/
function applyToList(list, fn) {
for (var i = 0; i < list.length; i++) {
fn(list[i], list);
}
}
function hide(list) {
applyToList(list, function(item) {
item.style.display = "none";
});
}
function show(list) {
applyToList(list, function(item) {
item.style.display = "block";
});
}
function showListCategories() {
var value = document.getElementById("listDisplayer").value;
var itemList = document.getElementById("itemList");
var items = itemList.getElementsByTagName("li");
if (value === "all") {
show(items);
} else {
// hide all items by default
hide(items);
show(itemList.getElementsByClassName(value));
}
}
所做的更改:
.value
才能查看所選擇的選項的值。 您正在使用selectedIndex
,它只是一個數字。 <ul>
而不是整個文檔。 我在該<ul>
標記中添加了一個id,以便可以找到它然后進行搜索。 "block"
和"none"
因為"visible"
不是style.display
的有效設置。 首先,Css中沒有諸如display:hidden;
類的屬性display:hidden;
它應該display: none;
這是解決方案,請不要讓我通過定位ID完成
JS功能
var selection = document.getElementById("listDisplayer");
var list = document.getElementsByTagName('li');
selection.onchange = function () {
var value = selection.options[selection.selectedIndex].value; // to get Value
for (var i = 0; i < list.length; i++) {
if (list[i].className.indexOf(value) > -1) {
list[i].style.display = "list-item";
} else {
list[i].style.display = "none"
}
}
}
CSS代碼
.cats, .rats, .bats {
display: none;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.