跟随my previous question - 我想使用一个按钮来显示/隐藏使用JS具有相同类名的多个元素,但似乎我只能更改具有特定类名的第一个元素,并且页面上具有相同类的所有其他元素将被忽略。
我该如何解决这个问题?
function designInfo() {
document.getElementsByClassName("design")[0].style.display = "block";
document.getElementsByClassName("it")[0].style.display = "none";
document.getElementsByClassName("other")[0].style.display = "none";
}
function itInfo() {
document.getElementsByClassName("design")[0].style.display = "none";
document.getElementsByClassName("it")[0].style.display = "block";
document.getElementsByClassName("other")[0].style.display = "none";
}
function allInfo() {
document.getElementsByClassName("design")[0].style.display = "block";
document.getElementsByClassName("it")[0].style.display = "block";
document.getElementsByClassName("other")[0].style.display = "block";
}
.it {}
.design {}
.other {}
.indent {
margin: .5em 1em .5em 1em;
}
<button onclick="designInfo()">show design stuff</button>
<button onclick="itInfo()">show IT stuff</button>
<button onclick="allInfo()">show all</button>
<div class="indent">
<div class="it">• boring IT stuff</div>
<div class="design">• cool design stuff</div>
<div class="it">• it stuff and things</div>
<div class="design">• design stuff</div>
<div class="it">• it stuff and more</div>
<div class="other">• more it stuff</div>
<div class="other">• it stuff</div>
</div>
答案 0 :(得分:4)
您需要对document.getElementsByClassName()
方法中获得的所有项目使用for循环,如下面的代码段所示:
function setDisplay(className, displayValue) {
var items = document.getElementsByClassName(className);
for (var i=0; i < items.length; i++) {
items[i].style.display = displayValue;
}
}
function designInfo() {
setDisplay("design", "block");
setDisplay("it", "none");
setDisplay("other", "none");
}
function itInfo() {
setDisplay("design", "none");
setDisplay("it", "block");
setDisplay("other", "none");
}
function allInfo() {
setDisplay("design", "block");
setDisplay("it", "block");
setDisplay("other", "block");
}
.it {}
.design {}
.other {}
.indent {
margin: .5em 1em .5em 1em;
}
<button onclick="designInfo()">show design stuff</button>
<button onclick="itInfo()">show IT stuff</button>
<button onclick="allInfo()">show all</button>
<div class="indent">
<div class="it">• boring IT stuff</div>
<div class="design">• cool design stuff</div>
<div class="it">• it stuff and things</div>
<div class="design">• design stuff</div>
<div class="it">• it stuff and more</div>
<div class="other">• more it stuff</div>
<div class="other">• it stuff</div>
</div>
<强>更新强> 此外,它可以用更少的代码编写如下:
function filter(designDisp, itDisp, otherDisp) {
setDisplay("design", designDisp);
setDisplay("it", itDisp);
setDisplay("other", otherDisp);
}
function setDisplay(className, displayValue) {
var items = document.getElementsByClassName(className);
for (var i=0; i < items.length; i++) {
items[i].style.display = (displayValue? "block" : "none");
}
}
.it {}
.design {}
.other {}
.indent {
margin: .5em 1em .5em 1em;
}
<button onclick="filter(1,0,0)">show design stuff</button>
<button onclick="filter(0,1,0)">show IT stuff</button>
<button onclick="filter(1,1,1)">show all</button>
<div class="indent">
<div class="it">• boring IT stuff</div>
<div class="design">• cool design stuff</div>
<div class="it">• it stuff and things</div>
<div class="design">• design stuff</div>
<div class="it">• it stuff and more</div>
<div class="other">• more it stuff</div>
<div class="other">• it stuff</div>
</div>
答案 1 :(得分:2)
最好使用显示/隐藏元素的类来执行此操作。您的问题是您正在使用匹配数组的第一个索引[0]。您需要遍历数组中的每个元素来操作元素。
这样的事情可以解决问题:
let els = document.querySelectorAll('.myclass');
els.forEach(function(el) {
el.classList.add('hidden');
});
您可以使用el.classList.remove(className);
删除班级
注意:forEach是一个ECMAScript 5函数
答案 2 :(得分:0)
你已经到了一半:
使用此功能并通过类名称和“阻止”或“无”
function toggle(className, state){
elementArray = document.getElementsByClassName(className);
for(var i = 0; i < elementArray.length; i++){
elementArray[i].style.display = state;
}
}
答案 3 :(得分:0)
与jQuery
一起制作的简易解决方案。我只提供了一个函数,它接受一个参数,这个参数是你想要留在列表中的元素的名称。
var elems = $('.indent').children('div');
function filter(v) {
elems.filter(function() {
$(this).show();
if (!$(this).hasClass(v) && v) {
$(this).hide();
}
});
}
&#13;
.indent {
margin: .5em 1em .5em 1em;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button onclick="filter('design')">show design stuff</button>
<button onclick="filter('it')">show IT stuff</button>
<button onclick="filter()">show all</button>
<div class="indent">
<div class="it">• boring IT stuff</div>
<div class="design">• cool design stuff</div>
<div class="it">• it stuff and things</div>
<div class="design">• design stuff</div>
<div class="it">• it stuff and more</div>
<div class="other">• more it stuff</div>
<div class="other">• it stuff</div>
</div>
&#13;
答案 4 :(得分:0)
var X = document.querySelectorAll(".className");
for (var i = 0; i < X.length; i++) {
X[i].style.cssProperty = someNumber + "unitType";
}
示例:X[i].style.width = 100 + "%";
如果您希望它应用随机整数:
var X = document.querySelectorAll(".className");
for (var i = 0; i < X.length; i++) {
var rand = Math.floor(Math.random() * someNumber);
X[i].style.cssProperty = rand + "unitType";
}