javascript - 替代 nextElementSibling
问题描述
我目前有一个代码,当单击 div 时,它会使用nextElementSibling
.
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.nextElementSibling;
console.log(panel)
if (panel.style.display === "block") {
panel.style.display = "none";
} else {
panel.style.display = "block";
}
});
}
<div class="accordion">
<p>Resources</p>
</div>
<div class=panel ">
Test message
</div>
这会使用 class 向 div 添加样式panel
。我需要将类移动accordion
到p
标签而不是div
像这样:
<div>
<p class="accordion">Resources</p>
</div>
<div class= panel">
Test message
</div>
现在我如何定位面板,accordion
不再是旁边的panel
?
解决方案
由于p
is now child 的div
which 是 的兄弟.panel
,因此您可以parentElement
在使用 之前返回到 DOM 的该级别nextElementSibling
,如下所示:
var acc = document.getElementsByClassName("accordion");
var i;
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
this.classList.toggle("active");
var panel = this.parentElement.nextElementSibling;
if (panel.style.display === "block") {
panel.style.display = "none";
} else {
panel.style.display = "block";
}
});
}
.panel { display: none; }
.active { color: #C00; }
<div><p class="accordion">Resources</p></div>
<div class="panel">Test message</div>
<div><p class="accordion">Resources</p></div>
<div class="panel">Test message</div>
<div><p class="accordion">Resources</p></div>
<div class="panel">Test message</div>
另请注意,如果您不需要支持 IE,您可以使用更现代的方法更简洁地实现相同的 JS 逻辑:
document.querySelectorAll('.accordion').forEach(el => {
el.addEventListener('click', e => {
let accordion = e.target;
accordion.classList.toggle('active');
accordion.parentElement.nextElementSibling.classList.toggle('show');
});
});
.panel { display: none; }
.panel.show { display: block; }
.active { color: #C00; }
<div><p class="accordion">Resources</p></div>
<div class="panel">Test message</div>
<div><p class="accordion">Resources</p></div>
<div class="panel">Test message</div>
<div><p class="accordion">Resources</p></div>
<div class="panel">Test message</div>
推荐阅读
- javascript - 获取 sessionStorage.getItem(...).focus 不是函数错误
- c++ - API 函数可以初始化 const 全局变量吗?
- r - 动态变量名称以在 for 循环中改变变量
- regex - FSM(正则表达式)的设计
- excel - Excel:搜索功能不适用于其他工作表
- sqlite - 在插入之前检查值的动态 sql 字符串
- c# - ASP.NET 找不到 API 控制器
- r - 为什么 R 的 tensorflow::install_tensorflow() 命令会尝试将 python3.7 安装到 r-reticulate conda 环境中?
- ios - Xamarin Forms IOS,API 请求返回 Internet 连接似乎已脱机
- java - [org.springframework.aop.support.DefaultPointcutAdvisor] 类型的 Bean“顾问”不符合所有 BeanPostProcessors 处理的条件