mouseenter不冒泡,僅在綁定元素進入時觸發一次;mouseover冒泡,滑入子元素也會在父元素上再次觸發。
<div id="outer" style="width:300px;height:300px;background:green;">
<div id="inner" style="width:100px;height:100px;background:red;"></div>
</div>
<div id="log"></div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
$('#outer').mouseenter(function(){ $('#log').append('enter<br/>'); })
.mouseover(function(){ $('#log').append('over<br/>'); });
</script>
| 操作 | mouseenter | mouseover |
|---|---|---|
| 鼠標從外部移入 outer | 觸發 1 次 | 觸發 1 次 |
| 鼠標在 outer 內移動 | 不觸發 | 不觸發 |
| 鼠標從 outer 移入 inner | 不觸發(離開 outer 視為 leave) | 觸發 outer 的 mouseover(冒泡) |
| 鼠標從 inner 移回 outer | 觸發 outer 的 mouseenter | 觸發 outer 的 mouseover |
| 鼠標離開 outer | 觸發 mouseleave | 觸發 mouseout |
mouseenter/mouseleave:jQuery 封裝,基於 IE 專有 onmouseenter/onmouseleave 實現,**不冒泡**,通過事件代理模擬。mouseover/mouseout:原生 DOM 事件,**冒泡**,event.relatedTarget 可判斷來源/目標元素。event.relatedTarget 過濾。:hover 或 IntersectionObserver 替代 JS 事件。理解冒泡與否是關鍵。mouseenter 適合「進入區域」語義,mouseover 適合「掠過元素」語義,混用極易產生重複觸發 Bug。