所以在阅读了最近回答的question后,我不清楚我是否真的理解mouseenter()
和mouseover()
之间的区别。帖子陈述
鼠标悬停():
进入元素时以及任何鼠标移动时都会触发 发生在元素内。
的MouseEnter():
进入元素时会触发。
我想出了一个使用两者的fiddle,它们看起来非常相似。有人可以向我解释两者之间的区别吗?
我也尝试过阅读JQuery定义,两者都说同样的事情。
当鼠标指针进入元素
时,鼠标悬停事件将发送到元素当鼠标指针进入元素时,mouseenter事件将发送到元素。
有人可以用一个例子来澄清吗?
答案 0 :(得分:258)
您可以看到目标元素包含子元素时的行为:
每次鼠标进入或离开子元素时,都会触发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>
答案 1 :(得分:27)
答案 2 :(得分:11)
尽管它们以相同的方式运行,但只有当鼠标指针进入所选元素时才会触发mouseenter
事件。如果鼠标指针同时进入任何子元素,则会触发{strong>事件
答案 3 :(得分:4)
请参阅jquery文档页面底部的示例代码和演示:
http://api.jquery.com/mouseenter/
...当指针移动到子元素中时,mouseover将触发 好吧,只有当指针移入时,mouseenter才会触发 绑定元素。
答案 4 :(得分:4)
mouseenter 事件与鼠标悬停的区别在于鼠标悬停处理事件冒泡的方式。 mouseenter 事件,当鼠标进入鼠标时触发,触发 。 请参阅:https://api.jquery.com/mouseenter/
mouseleave 事件 mouseout 与处理事件冒泡的方式不同。 mouseleave 事件,当鼠标离开元素时,触发其处理程序 。 请参阅:https://api.jquery.com/mouseleave/
答案 5 :(得分:1)
此示例演示了 mousemove , mouseenter 和 mouseover 事件之间的区别:
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)。答案 6 :(得分:0)
旧问题,但对于有洞察力的imo仍然没有很好的最新答案。
这几天,所有浏览器都支持mouseover/mouseout
和mouseenter/mouseleave
。不过,jQuery不会将您的处理程序注册到mouseenter/mouseleave
,而是静静地将它们放置在mouseover/mouseout
周围的包装中,如以下代码所示,并对mouseenter/mouseleave
做出自己的稍有不同。
事件的确切行为与“委托处理程序”尤其相关。不幸的是,jQuery对什么是委托处理程序以及事件应该接收什么有不同的解释。在another answer中显示的事实是更简单的click事件。
那么,如何正确回答有关jQuery的问题呢?jQuery使用Javascript编写事件和处理程序,但两者却有所不同,甚至在文档中都没有提及?
首先是“真实” JavaScript的区别:
enter/over
得到一个相应的leave/out
(可能是迟来的/跳跃的)mouseenter/mouseleave
mouseover/mouseout
经过一些测试,结果表明,只要您不使用jQuery“具有选择器注册的委托处理程序”,该模拟都是不必要的,但很合理:它过滤掉mouseover/mouseout
个事件,这些事件mouseenter/mouseleave
不会得到。但是目标很混乱。真实的mouseenter/mouseleave
将把handler元素作为目标,仿真可能会指示该元素的子元素,即mouseover/mouseout
所携带的内容。
const list = document.getElementById('log');
const outer = document.getElementById('outer');
const $outer = $(outer);
function log(tag, event) {
const li = list.insertBefore(document.createElement('li'), list.firstChild);
// only jQuery handlers have originalEvent
const e = event.originalEvent || event;
li.append(`${tag} got ${e.type} on ${e.target.id}`);
}
outer.addEventListener('mouseenter', log.bind(null, 'JSmouseenter'));
$outer.on('mouseenter', log.bind(null, '$mouseenter'));
div {
margin: 20px;
border: solid black 2px;
}
#inner {
min-height: 80px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<div id=outer>
<ul id=log>
</ul>
</div>
</body>