你有一些代碼中的錯誤的;我會逐個嘗試通過它們來澄清這些問題並提供解決方案,希望這些解決方案有望在未來導致更好的理解(和實踐)。
首先,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爲'家' –