Javascript 对li标记重复onmouseover/onmouseout调用

Javascript 对li标记重复onmouseover/onmouseout调用,javascript,onmouseover,onmouseout,Javascript,Onmouseover,Onmouseout,我有以下代码。(您可以将其复制到文件中,以便在Firefox中进行调试,并在Firebug的控制台选项卡中查看输出) 当我将onmouseoverenvent添加到li标记中,并将鼠标移动到li区域时,控制台信息会显示出来 问题是当我将鼠标从图像(谷歌徽标)移动到它下面的文本时,会打印出多个信息。既然我没有离开li区域,为什么会触发onmouseout事件 在这种情况下,我应该如何防止触发onmouseout事件 谢谢 <html> <body> <div>

我有以下代码。(您可以将其复制到文件中,以便在Firefox中进行调试,并在Firebug的控制台选项卡中查看输出)

当我将
onmouseover
envent添加到
li
标记中,并将鼠标移动到
li
区域时,控制台信息会显示出来

问题是当我将鼠标从图像(谷歌徽标)移动到它下面的文本时,会打印出多个信息。既然我没有离开
li
区域,为什么会触发
onmouseout
事件

在这种情况下,我应该如何防止触发
onmouseout
事件

谢谢

<html>
<body>

<div>
    <ul>
        <li onmouseover="console.info('over')" onmouseout="console.info('out')" style="float:left;display:block;width:30%;height:200px;border: 2px solid red;">
            <img src="https://www.google.com/intl/en_com/images/srpr/logo3w.png">
            <br/>
            <br/>
            <a href="#">Google</a>
        </li>
        <li style="float:left;display:block;width:30%;">
            <img src="https://www.google.com/intl/en_com/images/srpr/logo3w.png">
            <br/>
            <br/>
            <a href="#">Google</a>
        </li>
        <li style="float:left;display:block;width:30%;">
            <img src="https://www.google.com/intl/en_com/images/srpr/logo3w.png">
            <br/>
            <br/>
            <a href="#">Google</a>
        </li>
    </ul>
</div>

</body>
</html>







。因此,当光标离开
img
元素时,将生成
mouseout
事件,并触发绑定到父
li
元素的事件处理程序

有两种方法可以处理这种情况:

防止事件冒泡

如果要防止事件冒泡,请将事件处理程序分配给事件发起的元素,并调用
事件
对象的
停止冒泡
方法(或IE中的
取消冒泡
属性):

问题是必须将此处理程序绑定到每个子元素,这不是很方便。因此,以下方法更容易实现

测试事件发生的位置

您可以通过IE中的
event.target
(或
event.srcElement
)获取对事件起源元素的引用。绑定到
li
元素的事件处理程序应该如下所示:

function handler(event) {
    event = event || window.event; // IE
    var target = event.target || event.srcElement; // IE

    if(target === this) {   // event originated where the handler was bound to
        console.info('out');
    }
}
并称之为

onmouseout="handler.call(this, event);"
请注意,像您一样绑定事件处理程序是一种糟糕的设计,因为它混合了表示和应用程序逻辑。有几种方法可以绑定事件处理程序


我建议您阅读。

。因此,当光标离开
img
元素时,将生成
mouseout
事件,并触发绑定到父
li
元素的事件处理程序

有两种方法可以处理这种情况:

防止事件冒泡

如果要防止事件冒泡,请将事件处理程序分配给事件发起的元素,并调用
事件
对象的
停止冒泡
方法(或IE中的
取消冒泡
属性):

问题是必须将此处理程序绑定到每个子元素,这不是很方便。因此,以下方法更容易实现

测试事件发生的位置

您可以通过IE中的
event.target
(或
event.srcElement
)获取对事件起源元素的引用。绑定到
li
元素的事件处理程序应该如下所示:

function handler(event) {
    event = event || window.event; // IE
    var target = event.target || event.srcElement; // IE

    if(target === this) {   // event originated where the handler was bound to
        console.info('out');
    }
}
并称之为

onmouseout="handler.call(this, event);"
请注意,像您一样绑定事件处理程序是一种糟糕的设计,因为它混合了表示和应用程序逻辑。有几种方法可以绑定事件处理程序



我建议阅读。

除了
onMouseOver
和onMouseOut之外,还有
onMouseEnter
onMouseLeave
的概念。实际上,我不知道它是如何在不同的浏览器中实现的。我使用jQuery,它为我做所有的事情。阅读所有相关内容,并在页面底部提供一个很好的示例,说明使用不同事件时会发生什么。

除了
onMouseOver
和onMouseOver之外,还有
onMouseEnter
onMouseLeave
的概念。实际上,我不知道它是如何在不同的浏览器中实现的。我使用jQuery,它为我做所有的事情。阅读所有内容,并在页面底部提供一个很好的示例,说明使用不同事件时会发生什么。

mouseenter
mouseover
仅存在于IE中。
mouseenter
mouseover
仅存在于IE中。是的,在实践中,使用js框架将使您的生活更轻松。感谢您的详细回答。我快速尝试了一下,发现事件起源的测试似乎不起作用(在
li
标记中,我离开并输入
img
onmouseover
事件多次触发。这不是我想要的,因为
img
li
中)。不过,谢谢你的推荐,我想我可以在读完这些文章后解决这个问题。不客气:)确保你的设置正确。下面是一个例子:图像没有采用父元素的全宽和全高。因此,当您离开图像时,光标再次位于
li
元素上,并在
li
元素上触发
mouseover
事件。老实说,我不明白你的问题,你想什么时候触发
mouseover
?嗨,菲利克斯,当光标从
li
的其他部分移动到
img
上时,它也(仍然)在
li
的上方/内部,换句话说,它没有离开
li
,因此不应触发onmouseout的
onmouseout
。当光标从内部
img
移回
li
时,也不应触发
onmouseover
。将
li
中的所有元素视为t的一部分