mouseenter在domlevel3中才被定義,目前在chrome中不被原生支持,但是各大框架的事件系統都摸了了mouseenter事件。大多數情況下,mouseover和mouseenter產生的結果都差不多,那為什么還要搞一個mouseenter呢?
我認為,mouseover是邏輯關系上的事件,即一旦某dom元素的子元素被mouseover了,它自己也就被mouseover了,而mouseenter卻是物理上的,即只有你眼睛看到光標進入了的元素,才會觸發mouseenter事件,mouseleave同理。
為了便於理解,我們還是看例子吧(在firefox里運行):
mouseover:
之所以是這種結果,主要是由於mouseover是會冒泡的,而mouseenter是不冒泡的。這樣也帶來了一個問題,那就是mouseover是可以在冒泡過程中阻止的,而mouseenter只要是檢測到光標進入了元素的區域就會在元素上觸發的。
測試中發現一點跟我預期不一樣的東西,那就是mouseenter事件雖然是不冒泡的,但是我們看到當鼠標移入div3的時候,即使從最下方移入(div3在下方是超出了div1范圍的)他的祖先元素div1的mouseenter事件也被觸發了,這樣是不是可以得出一個結論:mouseenter事件在某個元素放觸發時,如果這個元素的某個祖先元素還沒有觸發mouseenter事件,則會觸發這個祖先元素的mouseenter事件。
最后我們得出一個結論:
mouseenter事件在鼠標進入某個元素,或第一次進入這個元素的某個子元素時觸發。一旦觸發后,在mouseleave之前,鼠標在這個元素的子元素上觸發mouseenter事件都不會觸發這個元素的mouseenter事件。即:一旦進入,在子元素間的mouseenter不算是在本元素上的mouseenter。
而mouseover事件是必然冒泡的,一旦子元素mouseover了,本元素必然mouseover(除非子元素上禁止冒泡了)。
參考https://developer.mozilla.org/en/DOM/DOM_event_reference/mouseenter