当我从今天早些时候(if interested, find it here)找到我的问题的解决方案时遇到此问题。当鼠标从孩子进入父母时触发父级鼠标
我的div结构简单:
<div id="outer">
<div id="inner">
<div id="content"></div>
<div id="handle">HOVER HERE</div>
</div>
</div>
有注册outer
mouseOut事件:(你可以看到整个工作示例here)
$('#outer').on('mouseout', function(event) {
if (!(event.relatedTarget.id == "outer") &&
!$(event.relatedTarget).isChildOf("outer")) {
mouseIsOverMenu = false;
menu_rollin();
}
});
这是具有slideDown/slideUp效果的菜单的简单版本。
现在,这里是我的问题:
我完全明白,在进入一个子元素的鼠标移开火(这是为isChildOf
检查的原因)。我不明白的是,当我将鼠标从content
移动到outer
(inner
仅仅是实际内容的中心,而content
是滑动部分并且具有与inner
相同的宽度)时,该事件被激发。)这就是为什么我添加了检查relatedTarget是否是元素本身。
对于我的理解,不应该有任何鼠标事件对儿童(ren)。然而,在老式的'警报调试'期间,事实证明,如果鼠标从content
回到outer
,并且检查本身(它是relatedTarget)失败,那么事件似乎会触发。
我读过关于冒泡和再次捕捉的内容,但我这样理解,只有当一个特定事件的多个事件处理程序存在时它才是相关的。
我会感谢任何解释或资源,这有助于理解这个原因。
非常感谢您的回答!如果我说得对,那么事件(我认为这是相同的)总是被触发,但是如果没有处理程序存在,那么它们只是不被捕获? (通过元素本身,它可能通过冒泡被捕获。) – Dennis
类似的东西。我不知道事件处理是如何完全在jQuery中完成的。如果您有可能尝试从Nicholas Zakas获得一本书_Professional JavaScript for Web Developers_,其中他解释了事件和不同事件流(事件捕获和事件冒泡)。很可能也有一些关于它的好文章。 –
再次感谢。我认为你的答案已经澄清了“问题”来自何处。我会尽力拿到这本书,听起来很有趣。 – Dennis