當我從今天早些時候(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