將鼠標了層導致事件冒泡兒童元素:
在您可能需要當鼠標離開一個層,以便它可以被關閉知道基於層的導航。因此,您向該圖層註冊一個onmouseout事件處理程序。但是,當鼠標離開圖層內的任何元素時,事件冒泡也會導致此事件處理程序觸發。
--------------
| Layer |.onmouseout = doSomething;
| -------- |
| | Link | ----> We want to know about this mouseout
| | | |
| -------- |
| -------- |
| | Link | |
| | ----> | but not about this one
| -------- |
--------------
---->: mouse movement
另一個顯示塞是,當你將鼠標移動到該層,然後到一個鏈接時,瀏覽器層上註冊mouseOut事件!對我來說這沒什麼意義(鼠標仍在圖層中),但所有瀏覽器都贊同這一點。
那麼我們如何拒絕鼠標實際離開圖層時不會發生的任何鼠標移動?
function doSomething(e) {
if (!e) var e = window.event;
var tg = (window.event) ? e.srcElement : e.target;
if (tg.nodeName != 'DIV') return;
var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
while (reltg != tg && reltg.nodeName != 'BODY')
reltg= reltg.parentNode
if (reltg== tg) return;
// Mouseout took place when mouse actually left layer
// Handle event
}
首先獲取事件目標,即。鼠標移出的元素。如果目標不是DIV(圖層),立即結束該功能,因爲鼠標確實沒有離開圖層。
如果目標是圖層,我們仍不確定鼠標是否離開圖層或在圖層中輸入了鏈接。因此,我們要檢查事件的relatedTarget/toElement,即。鼠標移動到的元素。
我們讀出這個元素,然後我們要向上移動DOM樹,直到遇到事件的目標(即DIV)或body元素。
如果我們遇到目標,鼠標將移動到圖層的子元素,因此鼠標實際上並未離開圖層。我們停止了這個功能。
當函數在所有這些檢查中倖存時,我們確定鼠標實際上離開了圖層,我們可以採取適當的操作(通常使圖層不可見)。
的mouseenter和鼠標離開:
微軟有另一種解決方案。它創建了兩個新事件mouseenter和mouseleave。它們幾乎與mouseover和mouseout相同,只是它們不會對事件冒泡作出反應。因此,他們將整個HTML元素註冊爲一個實體塊,並且不會對塊內發生的鼠標懸停和滾動操作做出反應。
因此,使用這些事件也解決了我們的問題:它們只對它們註冊的元素的鼠標懸停/跳出作出反應。
目前,這些事件僅在Windows和更高版本的Explorer 5.5上受支持。也許其他瀏覽器供應商會複製這些事件。
所以最好使用mouseleave而不是mouseout,因爲它會引起事件冒泡。
問題標題很奇怪。 –
好吧,我會把它改成無聊的。 –
它不是關於有趣的無聊,它關於與你的問題的相關性,以便你可以從別人那裏得到更好的幫助,因爲這個問題本身很好。爲什麼讓它得到消極的 –