【发布时间】:2021-04-10 02:26:33
【问题描述】:
一直在绞尽脑汁想弄清楚这一点。我试过添加 $( document ).ready(function() { 并在脚本周围再次关闭它,但不是快乐。
这是一个简单的过滤器。应该根据按钮显示/隐藏 div 元素。该脚本将“活动”添加到单击的按钮并将其从其他按钮中删除。
它完全按照 Code Pen 的预期工作。但是,当在本地或服务器上运行它时,过滤器工作正常,“活动”被添加到单击的按钮中,但“活动”不会从最后一个按钮中删除并保持堆叠(即,如果我单击 snowdonia 4 次, class 'active' 被应用了 4 次。如果我然后点击 tryfan,active 会正确应用,但不会从上一个按钮中删除)
我正在使用的代码如下。任何帮助将非常感激。 Javascript 与我的 filter.js 文件中出现的完全相同
filterSelection("all")
function filterSelection(c) {
var x, i;
x = document.getElementsByClassName("filterDiv");
if (c == "all") c = "";
for (i = 0; i < x.length; i++) {
w3RemoveClass(x[i], "show");
if (x[i].className.indexOf(c) > -1) w3AddClass(x[i], "show");
}
}
function w3AddClass(element, name) {
var i, arr1, arr2;
arr1 = element.className.split(" ");
arr2 = name.split(" ");
for (i = 0; i < arr2.length; i++) {
if (arr1.indexOf(arr2[i]) == -1) {element.className += " " + arr2[i];}
}
}
function w3RemoveClass(element, name) {
var i, arr1, arr2;
arr1 = element.className.split(" ");
arr2 = name.split(" ");
for (i = 0; i < arr2.length; i++) {
while (arr1.indexOf(arr2[i]) > -1) {
arr1.splice(arr1.indexOf(arr2[i]), 1);
}
}
element.className = arr1.join(" ");
}
var header = document.getElementById("myBtnContainer");
var btns = header.getElementsByClassName("btn-filter");
for (var i = 0; i < btns.length; i++) {
btns[i].addEventListener("click", function() {
var current = document.getElementsByClassName("active");
if (current.length > 0) {
current[0].className = current[0].className.replace(" active", "");
}
this.className += " active";
});
}
.filterDiv {
display: none;
/* Hidden by default */
}
/* The "show" class is added to the filtered elements */
.show {
display: block;
}
.btn-filter {
background-color: #fff;
border-radius: 0;
padding-right: 5px;
padding-left: 5px;
padding-top: 4px;
padding-bottom: 4px;
text-transform: uppercase;
font-family: 'Montserrat';
font-size: 14px;
font-weight: 600;
color: #91227e;
border: 2px;
border-style: solid;
border-color: #91227e;
}
.active,
.btn-filter:hover {
background-color: #91227e;
color: #fff;
}
<div id="myBtnContainer">
<button class="btn-filter active" onclick="filterSelection('all')"> Show all</button>
<button class="btn-filter" onclick="filterSelection('snowdon')"> Snowdon</button>
<button class="btn-filter" onclick="filterSelection('tryfan')"> Tryfan</button>
<button class="btn-filter" onclick="filterSelection('glyder')"> Glyder</button>
</div>
这是我在 html 文件中链接的脚本:
这里是codepen中工作版本的链接:https://codepen.io/dan-anderton-the-sasster/pen/vYgWdER
【问题讨论】:
-
控制台有错误吗?另外,您能否将代码示例减少到minimal reproducible example;就目前而言,它有点混乱,有些重复,不会帮助人们找到解决方案。
-
不,完全没有错误。
-
尝试使用
window.addEventListener('load', function() {//this initialization}); -
当我试图自己解决这个问题并试一试时,我遇到了这个问题。不幸的是,它没有用。
-
这段代码中有很多地方会发生奇怪的事情。不要在
if语句中加上{},这是自找麻烦。如果没有所有这些占位符数组,你真的可以简化事情。直接用.filter()、.map()、.reduce()等数组方法进行操作。
标签: javascript html