В чем разница между событиями mouseover и mouseenter? - PullRequest
143 голосов
/ 09 июля 2009

Я всегда использовал событие mouseover, но, читая документацию jQuery, обнаружил mouseenter. Кажется, они функционируют точно так же.

Есть ли разница между ними, и если да, то когда мне их использовать?
(Также относится к mouseout против mouseleave).

Ответы [ 4 ]

111 голосов
/ 09 июля 2009

Вы можете попробовать следующий пример со страницы jQuery doc . Это симпатичная небольшая интерактивная демонстрация, которая очень наглядна, и вы действительно можете убедиться в этом сами.

var i = 0;
$("div.overout")
  .mouseover(function() {
    i += 1;
    $(this).find("span").text("mouse over x " + i);
  })
  .mouseout(function() {
    $(this).find("span").text("mouse out ");
  });

var n = 0;
$("div.enterleave")
  .mouseenter(function() {
    n += 1;
    $(this).find("span").text("mouse enter x " + n);
  })
  .mouseleave(function() {
    $(this).find("span").text("mouse leave");
  });
div.out {
  width: 40%;
  height: 120px;
  margin: 0 15px;
  background-color: #d6edfc;
  float: left;
}

div.in {
  width: 60%;
  height: 60%;
  background-color: #fc0;
  margin: 10px auto;
}

p {
  line-height: 1em;
  margin: 0;
  padding: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="out overout">
  <span>move your mouse</span>
  <div class="in">
  </div>
</div>

<div class="out enterleave">
  <span>move your mouse</span>
  <div class="in">
  </div>
</div>

Короче говоря, вы заметите, что при наведении мыши на элемент происходит событие, когда вы находитесь над ним - происходит от его дочернего или родительского элемента, но событие ввода мыши происходит только тогда, когда мышь перемещается из-за пределов этого элемента в этот элемент.

Или , как указано в mouseover() документах :

[.mouseover()] может вызвать много головных болей из-за пузырей событий. Например, когда указатель мыши перемещается по элементу Inner в этом примере, ему будет отправлено событие mouseover, а затем накапливается до Outer. Это может вызвать наш связанный обработчик при наведении мыши в неподходящее время. См. Обсуждение для .mouseenter() для полезной альтернативы.

41 голосов
/ 09 июля 2009

Mouseenter и mouseleave не не реагируют на всплывающие события, в то время как mouseover и mouseout do .

Вот статья , которая описывает поведение.

4 голосов
/ 09 июля 2009

Как часто бывает с такими вопросами, у Quirksmode есть лучший ответ .

Я бы предположил, что, поскольку одна из целей jQuery состоит в том, чтобы сделать браузер независимым, использование любого имени события вызовет такое же поведение. Редактировать: благодаря другим постам я теперь вижу, что это не так дело

0 голосов
/ 21 октября 2013
$(document).ready(function() {
$("#outer_mouseover").bind
("Mouse Over Mouse Out",function(event){
console.log(event.type," :: ",this.id);})
$("#outer_mouseenter").bind
("Mouse enter Mouse leave",function(event){
console.log(event.type," :: ",this.id);})
 });

...