Mouseover和mouseout 再看看这个例子,换成mouserover然后试试。这个例子只是在ev3上添加了onmouseover的事件处理程序。然而你会注意到不仅仅在ev3上会触发事件在ev4或者span上都会触发。在Mozilla 1.3之前,当鼠标进入一个文本区域的时候都会触发。 原因当然就是事件冒泡。用户在ev4上触发了mouseover事件。在这个元素上没有onmouseover事件处理程序,但是在ev3上有。所以当事件冒泡到ev3上的时候,程序就执行了。 现在这样的设置虽然都完全正确,但是还有一个问题。首要问题就是目标。假设鼠标进入了ev4: ----------------------------------------- | This is div id="ev3" | | ----------------------------- | | | This is div id="ev4" | | | | -------- <-------- | | | | span | | |
| | -------- | | | ----------------------------- | ----------------------------------------- <--------: mouse movement 现在这个事件的target/srcElement就是ev4:就是事件发生的元素,因为鼠标移动到了他上面。但是当下面的发生时候: ----------------------------------------- | This is div id="ev3" | | ----------------------------- | | | This is div id="ev4" | | | | -------- | | | | | span | | | | | | --------> | | | | -------- | | | ----------------------------- | ----------------------------------------- -------->: mouse movement 这个事件的target/srcElement是一样的。在这一样还是鼠标进入ev4。然而你可能会当鼠标从ev3来或者从SPAN来的时候做不同的事。所以我们需要知道鼠标到底从哪来的。 relatedTarget,fromElement,toElement W3C把relatedTarget属性加进了mouseover和mouseout事件中。在mouseover事件下就是包括鼠标从哪来,在mouseout下就是包括鼠标到哪去。 微软也有包含以下信息的两个属性: 1、fromElement指的是鼠标来之前的元素。在mouseover的状况下比较有用 2、toElement表示鼠标将要去的那个元素。在mouseout的情况下比较有用。 在我们的第一个例子里面,relatedTarget/fromElement包含一个ev3的引用,在我们的第二个例子是SPAN。现在你就知道鼠标的来源了。 跨浏览器的代码 所以如果你想在mouseover的情况下想知道鼠标从哪来,那么: 复制代码 代码如下: function doSomething(e) { if (!e) var e = window.event; var relTarg = e.relatedTarget || e.fromElement; }
如果在mouseout的情况下想知道鼠标的去向那么: 复制代码 代码如下: function doSomething(e) { if (!e) var e = window.event; var relTarg = e.relatedTarget || e.toElement; }
鼠标离开一个层 在一个基于层的导航菜单里面你可能需要知道鼠标什么时候离开层这样你才能把那个层关闭。所以你给这个层的onmouseout注册了一个事件处理程序。然后事件冒泡会导致当鼠标离开任意一个层的时候都会触发这个onmouseout。 -------------- | Layer |.onmouseout = doSomething; | -------- | | | Link | ----> We want to know about this mouseout
| -------- | | -------- | | | Link | | | | ----> | but not about this one | -------- | -------------- ---->: mouse movement 另外的一个停止的方法是当你把鼠标移入这个层,然后到了一个链接上,浏览器就在这个层上注册一个mouseout事件。这个让我很不明白(鼠标依然在层里),但是所有的浏览器都没问题。 那么我们如何在鼠标真正离开的层的时候让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 }