您的代码中有许多错误;我将尝试逐一解释这些问题并提供解决方案,希望这些解决方案能够在未来带来更好的理解(和实践)。
首先,id
“...为元素分配一个名称。该名称在文档中必须是唯一的。” 1 . 请注意“必须”,这意味着具有重复的文档id
(多个共享相同 id
值的元素会使文档无效,并导致 JavaScript 出现问题,因为它只会查找具有给定的元素id
,并从具有不可预知结果的无效文档)。
在这种情况下,我通过有效地添加字符串来修改元素的id
s ,并将元素的 s 修改为单个单词和小写,以便可以预测地使它们相互引用。这给出了以下 HTML:div
Content
id
li
<nav id="nav">
<ul class="main_nav">
<li id="about"><a href="#" onclick="About_Me_Sel()">About Me</a></li>
<li id="home"><a href="#" onclick="Home_Sel()">Home</a></li>
</ul>
</nav>
<div id="aboutContent">
<p>Hello</p>
</div>
<div id="homeContent">
<p>hi</p>
</div>
JS Fiddle(这仍然不能按您的意愿工作,因为其他问题仍然存在;它只是为了显示更正/修改的 HTML)。
现在,JavaScript。
正如@Jeffman 在他的回答中所指出的那样,它无法工作的原因是因为仅引用元素的内联样式(使用属性设置的样式),而不是使用样式表或头部设置的样式文档。这意味着您正在将变量与字符串进行比较,该字符串始终为.element.style
style
undefined
false
您还使用两个函数来做同样的事情,这是浪费和不必要的。这是我修改id
各种元素的 s 的第二个原因。一个修改后的(单个)函数来做你想做的事情:
function sel(e, self) {
// e is the click event,
// self is the 'this' DOM node
var id = self.parentNode.id,
toggle = document.getElementById(id + 'Content'),
display = toggle.style.display;
toggle.style.display = display == 'block' ? 'none' : 'block';
}
a
上面的元素需要以下 HTML :
<a href="#" onclick="sel(event, this)">About Me</a>
JS 小提琴演示。
现在,这仍然需要插入式 JavaScript(在 HTML 本身中使用内联事件处理,每次您可能想要添加进一步的事件处理或更改函数以调用这些事件时都需要更新)。因此,我建议转向更不显眼的版本,例如:
function sel(e, self) {
// e is the click event,
// self is the 'this' DOM node
var id = self.parentNode.id,
toggle = document.getElementById(id + 'Content'),
display = toggle.style.display;
toggle.style.display = display == 'block' ? 'none' : 'block';
}
var links = document.getElementById('nav').getElementsByTagName('a');
for (var i = 0, len = links.length; i < len; i++) {
links[i].onclick = function (e){
sel(e, this);
};
}
JS 小提琴演示。
现在,虽然这可行,但这仍然需要将事件处理程序分配给多个元素(尽管使用 JavaScript 本身中的循环更容易完成)。
更简单的方法是将事件处理委托给父元素,并在函数本身中评估事件起源的位置。这将给出以下JavaScript:
function sel(e) {
// e is the click event,
// self is the 'this' DOM node
var self = e.target,
id = self.parentNode.id,
toggle = document.getElementById(id + 'Content'),
display = toggle.style.display;
toggle.style.display = display == 'block' ? 'none' : 'block';
}
var nav = document.getElementById('nav');
nav.addEventListener('click', sel);
JS 小提琴演示。
笔记:
- http://www.w3.org/TR/html401/struct/global.html#h-7.5.2。
参考: