【问题标题】:jquery mouseenter on child div with bigger dimensions than parent divjquery mouseenter 在子 div 上的尺寸大于父 div
【发布时间】:2025-12-24 19:30:10
【问题描述】:

我有一个 height=100px 的父 div,它小于 height=200px 的子 div。

当我在父 div 上附加 jquery mouseenter 时,即使我将指针悬停在子元素上(悬停在扩展父元素高度的子元素部分),事件也会触发。

谁能解释一下?

$(document).ready(function() {
		$(".parent").mouseover(function(e) {
			console.log(e.target);
		});
		$(".child").mouseover(function(e) {
			console.log(e.target);
		});
		$(".grandchild").mouseover(function(e) {
			console.log(e.target);
		});
	});
.parent {
			background-color: green;
			height: 50px;
		}
		.child {
			background-color: red;
			height: 100px;
		}
		.grandchild {
			background-color: blue;
			height: 200px;
		}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="parent">
		<div class="child">
			<div class="grandchild">
				Test
			</div>
		</div>
	</div>

--更新-- 起初我不清楚到底是什么问题。现在我想我明白了(我更新了代码)。

假设我们有一个带有 width=100pxheight=100px 的父 div。
然后我们有一个带有width=200pxheight=200px 的子div(比父级更大)。
当我将鼠标悬停在子级上时(但还没有在父级上),浏览器会计算出指针也在父级上,尽管它没有。
因此,如果我在子级和父级上都有一个处理程序,那么它们只会在我进入子 div 时触发。

谢谢。

【问题讨论】:

  • 触发器?触发什么?请改进标题
  • 我认为您应该更好地解释您想了解的内容。您是在问为什么当您将鼠标悬停在子对象上时会触发事件,还是希望事件仅在鼠标悬停在父对象而不是子对象上时触发?
  • @vsync 你是对的,我的标题是错误的。我改了。

标签: javascript jquery html css jquery-events


【解决方案1】:

您可以阻止事件从子级传播到父级,因此当您超过子级时它不会在父级上触发:

$(".child").mouseover(function(e) {
    e.stopPropagation();
});

【讨论】:

  • 是的,这是正确的。但是虽然我添加了它仍然会触发。
  • 我认为是因为您订阅了 mouseenter,而不是 mouseover。 Mouseenter 只会触发一个,但是 mouseover 会在 mousemove 上继续触发。我建议切换到 mouseover 和 mouseout。
  • 您的回答和评论是正确的,但如果您有更多要评论的内容,请阅读我的问题的更新。
  • @tioschi 由于两个元素都是静态的,因此外部(父)元素会随着内部(子)元素的尺寸增长。让孩子比父母大的唯一方法是让他们两个绝对定位。但是,这可能会完全破坏您的布局!
  • @KonstantinDinev 是的,mouseenter 和 mouseout 阻止了这种行为,尽管错误的触发器被触发了几毫秒。无论如何,你的小费对我有用,向你致敬
【解决方案2】:

试试这个:

    $(".child").mouseover(function(e) {
    e.stopImmediatePropagation();
    console.log(e.isPropagationStopped());
    console.log(e.currentTarget);
});

e.isPropagationStopped() 告诉你方法 e.stopImmediatePropagation();叫做。我试过了,这对我有用。而且你必须选择孩子而不是父母

【讨论】:

    【解决方案3】:

    在你的 CSS 中使用它。它删除子元素上的所有鼠标事件。 (也不能悬停...)

    .child{pointer-events: none}
    

    “指针事件:无”:

    元素永远不是鼠标事件的目标;但是,如果这些后代元素的指针事件设置为其他值,则鼠标事件可能会针对其后代元素。在这些情况下,鼠标事件将在事件捕获/冒泡阶段期间适当地触发此父元素上的事件侦听器。

    来源:https://developer.mozilla.org/en/docs/Web/CSS/pointer-events

    【讨论】:

    • 请使用edit链接来解释这段代码是如何工作的,不要只给出代码,因为解释更有可能帮助未来的读者。另见How to Answersource
    • @xeno 虽然指针事件对我现在的目的不是很有帮助,但它是一个有用的信息,我将学习并可能在未来采用。不知道这个的存在。