你有一些代码中的错误的;我会逐个尝试通过它们来澄清这些问题并提供解决方案,希望这些解决方案有望在未来导致更好的理解(和实践)。
首先,id
“...为元素指定名称,该名称在文档中必须是唯一的。 。请注意,“必须”,这意味着有重复id
(不止一个元素共享相同id
有价票证,使文件无效,并导致问题的JavaScript,因为它只会不断找一个元素与给定id
,并从无效的文档中恢复具有不可预知的结果)。
既然如此,我修改了id
S中div
元素的,有效的,添加Content
字符串,并修订了id
S中li
元素的是单个字和小写,使他们能可预测地做出引用彼此。这给出了以下HTML:
<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注意到his answer是因为element.style
引用仅在-线型的元件(那些具有style
属性集)的,而不是样式任一个设置样式表或文档的头部。这意味着您将undefined
变量与字符串进行比较,该字符串始终为false
。
你是也使用两个功能做同样的事情,这是浪费和不必要的。这是我修改各种元素的第二个原因。一种改进的(单)功能做你想做的事:
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 Fiddle demo。现在
,这仍然需要生硬的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 Fiddle demo。
现在,虽然这可行,但仍需要将事件处理程序分配给多个元素(尽管在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 Fiddle demo。
注:
- http://www.w3.org/TR/html401/struct/global.html#h-7.5.2。
参考文献:
你有两个不同的元素ID为'家' –