gpt4 book ai didi

使用 querySelectorAll() 的 JavaScript Accordion 菜单

转载 作者:行者123 更新时间:2023-12-03 10:03:35 25 4
gpt4 key购买 nike

我正在尝试使用 querySelectorAll() 构建一个 Accordion 菜单,但不确定检查单击的列表项的子项是否为最佳方法 ( .toggleContent.toggleIcon)属于其单击的父级 toggle_li[i]

如果我错了,请纠正我,但我认为在 onclick 函数中控制它会比影响 toggleDataAttr 函数更灵活?

我对 querySelector 还很陌生,因此非常感谢您的指导。

代码笔:http://codepen.io/seejaeger/pen/qdqxGy

// data attribute toggle
var toggleDataAttr = function (toggleElem, opt1, opt2, dataAttr) {
//
// ? belongs to clicked element (parent toggle_li[i])?
//
var toggleElem = document.querySelector(toggleElem);

toggleElem.setAttribute(dataAttr,
toggleElem.getAttribute(dataAttr) === opt1 ? opt2 : opt1);
};

// declare toggle onclick element
var toggle_li = document.querySelectorAll('li');

// iterate query and listen for clicks
for (var i = 0; i < toggle_li.length; i++) {

toggle_li[i].onclick = function() {
//
// ? belongs to clicked element (parent toggle_li[i])?
//
toggleDataAttr('.toggleContent', 'closed', 'open', 'data-state');
toggleDataAttr('.toggleIcon', 'plus', 'minus', 'data-icon');
};
}

最佳答案

这是我认为你应该做的:

  • 更新您的 toggleDataAttr 函数以再接收一个参数 parentElem
  • 将这个新的 parentElem 用于 querySelector,而不是 toggleDataAttr 中的 document
  • 然后在循环中,传递 this 作为参数以用作 parentElem

代码片段:

var toggleDataAttr = function(parentElem, toggleElem, opt1, opt2, dataAttr) {
var toggleElem = parentElem.querySelector(toggleElem);
toggleElem.setAttribute(dataAttr, toggleElem.getAttribute(dataAttr) === opt1 ? opt2 : opt1);
};

var toggle_li = document.querySelectorAll('li');

for (var i = 0; i < toggle_li.length; i++) {
toggle_li[i].onclick = function() {
toggleDataAttr(this, '.toggleContent', 'closed', 'open', 'data-state');
toggleDataAttr(this, '.toggleIcon', 'plus', 'minus', 'data-icon');
};
}
body {
background: #034;
opacity: 0.9;
font-family: sans-serif;
font-size: 24px;
font-weight: 300;
letter-spacing: 2px;
}
ul {
list-style: none;
padding: 0 24px;
width: 30%;
overflow: hidden;
color: #333;
}
li {
background: #eee;
padding: 0px;
border-bottom: 2px solid #aaa;
}
i {
font-style: normal;
}
.li-label {
padding: 18px;
}
.toggleContent {
padding: 18px 14px;
border-top: 2px solid #bac;
background: #334;
color: #eee;
}
.toggleContent[data-state=closed] {
display: none;
}
.toggleContent[data-state=open] {
display: block;
}
.toggleIcon[data-icon=plus]:after {
content: '+';
float: right;
}
.toggleIcon[data-icon=minus]:after {
content: '-';
float: right;
}
<ul>
<li>
<div class="li-label">
list item one <i class="toggleIcon" data-icon="plus"></i>
</div>
<div class="toggleContent" data-state="closed">toggle content one</div>
</li>
<li>
<div class="li-label">
list item two <i class="toggleIcon" data-icon="plus"></i>
</div>
<div class="toggleContent" data-state="closed">toggle content two</div>
</li>
<li>
<div class="li-label">
list item three <i class="toggleIcon" data-icon="plus"></i>
</div>
<div class="toggleContent" data-state="closed">toggle content three</div>
</li>
</ul>

希望有帮助。

关于使用 querySelectorAll() 的 JavaScript Accordion 菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30473599/

25 4 0