jQuery mouseleave イベントでプルダウンメニューが閉じる前にわずかに待つようにするにはsetTimeout
#jQuery

created: 2025/01/13, modified: 2025/01/13

標準のサムネイル 2024-06

メニューから少しでもマウスカーソルが外れてしまうと、閉じてイラッとすることがあります。メニューが閉じる前にわずかに待つようにする動作を入れるには setTimeout を使い実現します。

jQuery コード

修正前

完成

試行錯誤で【失敗】の方の解説

menuTimeout 変数の使用

タイマーを制御するために、グローバルまたはスコープ内の変数を用意します

mouseenter イベント

マウスが要素に入ったとき、タイマーをクリア (clearTimeout) して、プルダウンメニューを即座に表示します。

mouseleave イベント

マウスが要素から離れた際に、setTimeout を使用して一定時間後にメニューを閉じる処理を実行します。この例では 200 ミリ秒待機しています。

clearTimeout の重要性

タイマーをクリアしないと、マウスの動きに関係なく指定した待機時間後にメニューが閉じる動作が発生してしまいます。

うまくいった方の解説

さっき失敗したのは、マウスを移動した際に、隣の .with-child 要素にカーソルが移動すると、mouseleave イベントが適切に発火しないことが原因です。
各 .with-child 要素ごとに個別の動作を設定することで、隣接要素間の問題を解消しやすくなります。

each を使用して個別に処理

  • 各 .with-child 要素に対して独自のタイマー (menuTimeout_) を管理します。
  • 隣接要素への移動時に他のタイマーが干渉しないようにできます。

親子関係の明示的な選択

$menuItem.find('> ul') を使用して、対象の子要素のみを操作

stop(true, true) の使用

アニメーションを途中で停止し、キューをクリアすることでスムーズな表示/非表示を実現。

遅延時間の設定

setTimeout を使用して、mouseleave で少し遅らせてからメニューを閉じます。

結びに

この方法を使うと、ユーザーがメニューから少し外れて再度戻る場合でも、メニューがすぐに閉じるのを防ぐことができます。