我有this 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设置为隐藏在每个项目上。
然而,它不起作用。谁能告诉我我要去哪儿?
请注意,我还没有编写“show all”选项。我想,一旦我解决了第一个问题,我就可能能够解决这个问题。
答案 0 :(得分:3)
在你的小提琴改变加载脚本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;
}
如果您想在选择li
时显示所有showAll
,请向所有lis添加all
个类。
答案 1 :(得分:2)
你有一些事情在发生。首先,你的小提琴设置不正确,如果你打开控制台,你会看到:
未捕获的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';
}
}
}
答案 2 :(得分:1)
你的代码中有很多错误,而jsFiddle中的设置错误。这是一个工作版本,它也实现了“all”选项:
工作演示: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
的有效设置。答案 3 :(得分:1)
首先,像display:hidden;
这样的Css中没有属性,它应该是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;
}