親のイベントにサブナビゲーション<ul>
タグを表示しようとしています。問題は、要素が に設定されているため、のイベントが発生しないことです。<li>
mouseover
a
display:block
li
hover
jQuery を使用して動作しますが、プレーンな JavaScript では動作しません。リスナーをヘッダー要素に適用し、.matchesSelector
メソッドを使用してイベントターゲットが一致するかどうかを判断しています.nav > li;
親のイベントにサブナビゲーション<ul>
タグを表示しようとしています。問題は、要素が に設定されているため、のイベントが発生しないことです。<li>
mouseover
a
display:block
li
hover
jQuery を使用して動作しますが、プレーンな JavaScript では動作しません。リスナーをヘッダー要素に適用し、.matchesSelector
メソッドを使用してイベントターゲットが一致するかどうかを判断しています.nav > li;
コードがなければ、推測する必要がありますが、ホバリングを判断するためにmouseover
とを使用していると思います。イベントがバブルmouseout
するので、の子孫要素から受け取ることになり、誤って (ここでも推測していますが) カーソルがの子孫要素の 1 つを離れたのではなく、 を離れたと考えます。同様に、カーソルがそれ自体から子孫要素に移動すると、 がトリガーされます。jQuery はandを使用しないため、jQueryで動作します (おそらく を使用しますか?)。mouseout
mouseout
li
li
li
li
li
mouseout
hover
mouseover
mouseout
mouseenter
mouseleave
、このシナリオにより適しています。(そして、それらをネイティブに持っていないブラウザーでそれらをエミュレートします。元は IE のみでした。)
したがって、jQuery を使用している場合は、明らかにhover
. そうでなく、ライブラリを使用していないか、エミュレートしないライブラリを使用している場合はmouseenter
、操作がmouseleave
どの要素mouseout
から来ているかを確認し、li
それ自体でない限り無視する必要があります。
サブナビゲーションがそれを明らかにするものをul
カバーしない場合は、CSS のみのソリューションを検討してください。li
たとえば、構造は次のとおりです。
<ul class="mainnav"><!-- Main nav -->
<li><!-- Nav item 1 -->
Nav Text 1
<ul><!-- Menu for nav item 1 -->
...
</ul>
</li>
<li><!-- Nav item 2 -->
Nav Text 2
<ul><!-- Menu for nav item 2 -->
...
</ul>
</li>
</ul>
このCSSはそれを行います(配置のためにこれ以上が必要ですが、これは表示/非表示の部分を行います):
ul.mainnav > li > ul {
display: none;
}
ul.mainnav > li:hover > ul {
display: none;
}
これは IE6 では機能しません。IE7 以降で動作します (標準モードの場合)。
すべての子要素のイベント ハンドラーを定義してから、
event.cancelBubble = true; //IE
event.stopPropagation(); //FF, etc