コードにいくつかのエラーがあります。それらの問題を 1 つずつ調べて、これらの問題を明確にし、うまくいけば、将来のより良い理解 (および実践) につながる解決策を提供します。
まず、id
「...要素に名前を割り当てます。この名前はドキュメント内で一意でなければなりません。」1 . 「必須」に注意してください。これは、重複した(同じ値を共有するid
複数の要素があると、ドキュメントが無効になり、JavaScript で問題が発生することを意味します。予測できない結果を伴う無効なドキュメント)。 id
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
また、同じことを行うために 2 つの関数を使用していますが、これは無駄で不必要です。これがid
、さまざまな要素の s を変更した 2 つ目の理由です。あなたがやりたいことをするための修正された(単一の)関数:
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 .
参考文献: