在導航菜單開發中,將 `onmouseout` 綁定在父容器 `
`mouseout` 事件會在滑鼠離開「當前元素」時觸發,包含移入子元素。因為瀏覽器認為滑鼠已離開父元素範圍。這與 `mouseleave` 不同,後者不冒泡,僅在真正離開元素邊界時觸發。
利用 `setTimeout` 延遲執行隱藏邏輯,並在 `mouseover` 時清除定時器。
let hideTimer = null;
function hideSubMenu() {
// 隱藏所有子菜單邏輯
subMenuItems.forEach(item => item.style.display = 'none');
}
function scheduleHide() {
hideTimer = setTimeout(hideSubMenu, 300); // 300ms 延遲
}
function cancelHide() {
if (hideTimer) clearTimeout(hideTimer);
}
// 綁定事件
navElement.onmouseout = scheduleHide;
navElement.onmouseover = cancelHide;
// 子菜單同樣綁定
subMenuElement.onmouseout = scheduleHide;
subMenuElement.onmouseover = cancelHide;
<nav id="nav">
<ul id="A"><li>菜單1</li><li>菜單2</li></ul>
<ul id="B" class="sub-menu"><li>子項1</li><li>子項2</li></ul>
</nav>
<style>
#nav { position: relative; }
.sub-menu { display: none; position: absolute; top: 100%; left: 0; }
#nav:hover .sub-menu { display: block; } /* 純 CSS 方案 */
</style>
掌握事件冒泡機制與防抖技巧,能輕松應對各類下拉、懸浮交互場景。