我的任务:嗨!我在学校里做了一项作业,我应该用Javascript编写代码,以便在网页的导航栏中切换子菜单的可见性,每个子菜单都属于自己的顶部菜单。默认情况下,可见性应设置为隐藏,并且应在单击顶部菜单时显示。我知道如何切换属于顶层菜单的一个子菜单的可见性,但无法使我的代码适用于多个元素。我的HTML代码:
<a class="left_top1" onclick = "toggle()">Opinion</a><br>
<div class="left_submenu_1" style="display: none;">
<a class="left_sub1">Leaders</a><br>
<a class="left_sub1">Debates</a><br>
</div>
<br>
<a class="left_top2" onclick = "toggle()">Economy</a><br>
<div class="left_submenu_2" style="display: none;">
<a class="left_sub2">News</a><br>
<a class="left_sub2">Your Economy</a><br>
</div>
我的问题:我所说的最重要的是"意见"one_answers"经济"。当您单击顶部菜单"left_top1"时,应切换类为"left_submenu_1"的div的可见性。因此,当您单击最上面的菜单"left_top2"时,是否应该切换类为"left_submenu_2"的div的可见性。这就是我失败的地方。我的Javascript代码到目前为止是:
function toggle() {
var e = document.querySelectorAll("div.left_submenu_1, div.left_submenu_2");
for (var i=0; i < e.length; i++) { // I know this will enable/disable the visibility for ALL elements selected from the querySelectorAll, which should NOT happen
if(e[i].style.display == "none") {
e[i].style.display = "block";
} else if(e[i].style.display == "block") {
e[i].style.display = "none";
}
}
}
有谁知道如何解决我的这个问题吗?我知道for循环中有错误(正如我在旁边写的那样),但这是我目前能处理的最好的错误。
请注意:我们不允许使用jQuery或提供最顶层的id:s,因为我们的想法是使用一个通用函数来切换可见性。此外,启用切换功能的代码应该用Javascript完成
我会通过将要显示(或隐藏)的div的类名传递到函数中来处理它。
HTML
<a class="left_top1" onclick = "toggle('.left_submenu_1')">Opinion</a>
然后在函数中,您可以获取元素并切换其显示状态。
JavaScript
function toggle(qs) {
var e = document.querySelector(qs);
e.style.display = e.style.display === 'block' ? 'none' : 'block';
}
e.style.display === 'block' ? 'none' : 'block'
部分表示,如果元素显示状态等于block,则返回none,否则返回block。
返回值由于e.style.display =
而被预先设置为新元素显示状态。
Tring以使其尽可能少地修改:
-在锚点标记中使用onClick="toggle(this)"
-使用一个稍微不同的切换功能,如:
function toggle (el) {
var e = document.querySelectorAll('.' + el.className.replace('top', 'submenu_'))[0];
e.style.display = e.style.display.match(/none/) ? '' : 'none';
}
希望它能有所帮助,但我不得不建议你向前迈出一小步,搜索event delegation
。再见