hover本质是jquery对mouseenter和mouseleave的封装,仅当鼠标真正穿过元素自身边界时触发,避免子元素移动导致的冒泡干扰,确保悬停效果稳定。

要在网页中实现鼠标悬停时稳定触发一次进入、一次离开的效果,又不想让子元素反复干扰父容器的动画或样式切换,就必须分清hover和mouseenter的本质差异——它们表面相似,底层行为却完全不同。
hover方法的底层机制
hover()不是独立事件,而是jQuery封装的语法糖:它内部自动调用mouseenter和mouseleave两个原生事件绑定。
写法是$(selector).hover(overFn, outFn),等价于$(selector).mouseenter(overFn).mouseleave(outFn)。
如果只传一个函数,比如$(el).hover(fn),那这个fn会在mouseenter和mouseleave时都执行——这点容易被忽略,【必须显式传入两个函数才能区分进入与离开逻辑】。
mouseenter为何比mouseover更可靠
当鼠标从父容器div移入其内部的img标签时,mouseover会再次触发——因为事件冒泡且子元素也属于“被选元素的后代”,导致动画反复启停、UI闪烁。
jQuery 1.12.4是jQuery 1.x系列的最后一个正式稳定版本,由jQuery团队于2016年发布。该版本主要面向需要兼容旧版浏览器环境的网站和Web应用,尤其适用于仍需支持Internet Explorer 6、Internet Explorer 7、Internet Explorer 8等老旧浏览器的项目。
mouseenter则严格限定:只有鼠标真正穿过绑定元素自身的边界时才触发,子元素内部移动完全不触发。
这正是解决“wrapper里放point层,鼠标在img/text间滑动却不该反复缩放point”的关键。
三步验证事件触发差异
第一步:准备嵌套结构——外层
第二步:分别绑定两组监听:
① $(#outer).mouseover(() => console.log('outer over'));
② $(#outer).mouseenter(() => console.log('outer enter'));
第三步:把鼠标从页面空白处移入outer → 停留 → 移入inner → 在inner内小幅移动 → 移出outer。
你会看到mouseover日志刷出3~5条,而mouseenter只打印1次进入、1次离开。










