mouseover与mouseenter的区别
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