jQuery mouseenter()vs mouseover()


172

所以阅读最近回答后,问题我很清楚,如果我真的明白之间的差别mouseenter()mouseover()。该帖子指出

鼠标移到():

输入元素时以及元素内发生任何鼠标移动时都会触发。

MouseEnter():

输入元素后会触发。

我想出了一种同时使用两者的小提琴,它们看起来非常相似。有人可以向我解释两者之间的区别吗?

我也尝试阅读JQuery定义,两者都说相同的话。

当鼠标指针进入元素时,mouseover事件将发送到该元素

当鼠标指针进入元素时,mouseenter事件将发送到该元素。

有人可以举例说明吗?


1
文档中的演示在imo上显示得很好。
Felix Kling

2
值得注意的是,mouseenter和mouseleave仅是IE中的专有事件,并由jQuery在其他浏览器中进行了仿真(尽管它们仍未在其他浏览器中实现,但它们似乎已成为规范,请参见quirksmode.org/dom/events/mouseover.html)。
Russ Cam

Answers:


274

当目标元素包含子元素时,您会看到行为:

http://jsfiddle.net/ZCWvJ/7/

每次您的鼠标进入或离开子元素时,mouseover都会触发,但不会触发mouseenter

$('#my_div').bind("mouseover mouseenter", function(e) {
  var el = $("#" + e.type);
  var n = +el.text();
  el.text(++n);
});
#my_div {
  padding: 0 20px 20px 0;
  background-color: #eee;
  margin-bottom: 10px;
  width: 90px;
  overflow: hidden;
}

#my_div>div {
  float: left;
  margin: 20px 0 0 20px;
  height: 25px;
  width: 25px;
  background-color: #aaa;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>

<div>MouseEnter: <span id="mouseenter">0</span></div>
<div>MouseOver: <span id="mouseover">0</span></div>

<div id="my_div">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>


2
@psychobrm-否。同时播放这两个跟踪mouseleave事件的演示: jsfiddle.net/ZCWvJ/232 jsfiddle.net/ZCWvJ/233 如果输入和离开的位置相同,则超过的计数为进入和离开的计数。
gilly3 2013年

1
是否有特定的原因var n = + el.text();代替var n = el.text();?我只是想好奇。
Fredrick Gauss

3
@FredrickGauss-我正在使用+运算符来强制将返回的字符串el.text()转换为数字。我需要吗?否。在这种情况下,使用的下n一条语句也会将其强制为数字。那么,为什么要使用它呢?我不确定...这是2年前。这是个好习惯。这使我的意图很明确。可能我本来n + 1在保存之前就拥有过,但是决定将我的代码缩小2个字符并只使用++nn + 1强制n为数字,而是将迫使1以导致输出,如一个字符串0111111
gilly3

2
@ gilly3-感谢您在脑海中对旅行的详细说明。
Fredrick Gauss 2013年

1
@ gilly3很好的总结,但有一个小的改进:鉴于孩子和父母之间存在间隙,“或留下子元素”应为“或留下子元素。您的小提琴具有边距/填充,因此是真的这样,无论何时离开子元素,您都将获得一个mouseover事件,但尝试时不使用填充/边距,则不会获得此事件
以色列

30

这是我发现的最好的例子之一:

  • 鼠标输入
  • 鼠标移到
  • 鼠标移出
  • 鼠标离开

http://bl.ocks.org/mbostock/5247027


这个例子很酷,但是您需要对答案进行更多的整理才能被接受。请记住,您正在尝试回答一个问题...如果您仅具有链接,则注释可能更合适。如果您由于声誉无法发表评论,请获取一些信息,然后再做。
scristalli 2014年

其实,我真的很喜欢这个答案。询问者已经给出了mouseover和mouseenter的定义。他们要求一个示例,这个示例演示了它们如何比此处的其他示例更好地工作。
patorjk 2015年

gilly3的答案有一个缺陷(请参阅我的评论)。即使结构不够好,此答案也指向更好的资源。
以色列

14

尽管它们的操作方式相同,但是mouseenter当鼠标指针进入所选元素时才会触发该事件。如果鼠标指针也输入任何子元素,mouseover则触发该事件。


3

请参阅jquery文档页面底部的示例代码和演示:

http://api.jquery.com/mouseenter/

...当鼠标指针也移入子元素时,将触发mouseover,而mouseenter仅在指针移入绑定的元素时,将触发。


3

的mouseenter事件不同,从鼠标悬停在它的方式处理事件冒泡。所述的mouseenter事件,仅触发当其处理程序鼠标进入元件它被绑定到,不后代。请参阅:https//api.jquery.com/mouseenter/

鼠标离开事件不同,从鼠标移出它的方式处理事件冒泡。该鼠标离开事件,只有触发时,其处理程序鼠标离开元素势必会,不是一个后代。请参阅:https//api.jquery.com/mouseleave/


2

此示例演示mousemovemouseentermouseover事件之间的区别:

https://jsfiddle.net/z8g613yd/

HTML:

<div onmousemove="myMoveFunction()">
    <p>onmousemove: <br> <span id="demo">Mouse over me!</span></p>
</div>

<div onmouseenter="myEnterFunction()">
    <p>onmouseenter: <br> <span id="demo2">Mouse over me!</span></p>
</div>

<div onmouseover="myOverFunction()">
    <p>onmouseover: <br> <span id="demo3">Mouse over me!</span></p>
</div>

CSS:

div {
    width: 200px;
    height: 100px;
    border: 1px solid black;
    margin: 10px;
    float: left;
    padding: 30px;
    text-align: center;
    background-color: lightgray;
}

p {
    background-color: white;
    height: 50px;
}

p span {
    background-color: #86fcd4;
    padding: 0 20px;
}

JS:

var x = 0;
var y = 0;
var z = 0;

function myMoveFunction() {
    document.getElementById("demo").innerHTML = z += 1;
}

function myEnterFunction() {
    document.getElementById("demo2").innerHTML = x += 1;
}

function myOverFunction() {
    document.getElementById("demo3").innerHTML = y += 1;
}
  • onmousemove :每次将鼠标指针移到div元素上时都会发生。
  • onmouseenter :仅在鼠标指针进入div元素时发生。
  • onmouseover :当鼠标指针进入div元素及其子元素(p和span)时发生。

jsfiddle以某种方式被打破,说功能未定义-我只是将所有js分支并将其移至<script> jsfiddle.net/orc8empd
godblessstrawberry,

0

旧问题,但对于imo洞察力仍然没有很好的最新答案。

如今,所有浏览器都支持mouseover/mouseoutmouseenter/mouseleave。不过,jQuery不会将您的处理程序注册到mouseenter/mouseleave,而是mouseover/mouseout按照下面的代码所示静默地将它们放置在包装上,并对它做出自己稍有不同的解释mouseenter/mouseleave

事件的确切行为在“委托处理程序”上尤其重要。不幸的是,jQuery对什么是委托处理程序以及事件应该接收什么有不同的解释。这个事实在另一个简单点击事件的答案中得到了体现。

那么,如何正确回答有关jQuery的问题呢?jQuery使用Javascript编写事件和处理程序,却又有所不同,甚至在文档中都没有提及?

首先,“真实” JavaScript的区别:

    • 当鼠标移动的速度快于浏览器采样位置时,鼠标可以从外部/外部元素“跳到”内部/内部元素
    • 任何enter/over得到相应的leave/out(可能是晚/跳跃)
    • 事件进入指针下方的可见元素(不可见→不能成为目标)
  • mouseenter/mouseleave
    • 交付给已注册的元素(目标)
    • 每当元素或任何后代输入或离开(例如,通过跳转)时
    • 它不会冒泡,因为从概念上讲,后代被认为是所涉及元素的一部分,即没有子代可能发生其他事件(含义为“进入/离开”父代?!)
    • 子级可能也注册了类似的处理程序,它们可以正确输入/离开,但与父母的输入/离开周期无关
  • mouseover/mouseout
    • 目标是指针下方的实际元素
      • 一个目标不能是两件事:即不能同时有父母和孩子
    • 该活动不能“嵌套”
      • 在孩子被“压倒”之前,父母需要“离开”
    • 可能会冒泡,因为target / relatedTarget指示事件发生的位置

经过一些测试,结果表明,只要您不使用jQuery“使用选择器注册的委托处理程序”,该模拟都是不必要的,但很合理:它将过滤掉mouseover/mouseouta mouseenter/mouseleave不会得到的事件。但是目标很混乱。实数mouseenter/mouseleave会将处理程序元素作为目标,仿真可能会指示该元素的子元素,即所mouseover/mouseout携带的内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.