Jquery mouseenter () vs mouseover ()


172

Então, depois de ler uma pergunta respondida recentemente, não estou claro se realmente entendo a diferença entre o mouseenter()e mouseover(). A postagem afirma

Passe o rato por cima():

Dispara ao entrar em um elemento e sempre que qualquer movimento do mouse ocorrer dentro do elemento.

MouseEnter ():

Dispara ao entrar em um elemento.

Eu vim com um violino que usa os dois e eles parecem ser bem parecidos. Alguém por favor pode me explicar a diferença entre os dois?

Eu também tentei ler as definições de JQuery, ambas dizem a mesma coisa.

O evento mouseover é enviado para um elemento quando o ponteiro do mouse entra no elemento

O evento mouseenter é enviado para um elemento quando o ponteiro do mouse entra no elemento.

Alguém pode esclarecer com um exemplo?


1
A demonstração na documentação mostra muito bem a imo.
— Felix Kling

2
Vale notar que mouseenter e mouseleave foram eventos proprietários apenas no IE e emulados em outros navegadores pelo jQuery (eles parecem estar agora nas especificações, embora ainda não tenham sido implementados em outros navegadores. Veja quirksmode.org/dom/events/mouseover.html )
— Russ Cam

Respostas:


274

Você vê o comportamento quando seu elemento de destino contém elementos filhos:

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

Cada vez que o mouse entra ou sai de um elemento filho, mouseoveré acionado, mas não 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 - Não. Jogue com essas duas demos que também acompanham o mouseleaveevento: jsfiddle.net/ZCWvJ/232 jsfiddle.net/ZCWvJ/233 Se estiver onde o mesmo que digitar + sair, a contagem de mais será a soma de as contagens para entrar e sair.
— precisa saber é o seguinte

1
existe um motivo específico para escrever em var n = + el.text();vez de var n = el.text();? Estou apenas pedindo curiosidade.
— Fredrick Gauss

3
@FredrickGauss - estou usando o +operador para coagir a string retornada de el.text()para um número. Eu preciso ? Não. Nesse caso, a próxima instrução que usa ntambém a obrigaria a um número. Então, por que eu usei? Eu não tenho certeza ... isso foi há 2 anos atrás. É um bom hábito. Isso torna minha intenção explícita. Provavelmente eu tinha n + 1antes de salvar, mas decidi diminuir meu código em 2 caracteres e apenas usar ++n. n + 1se não coagir na um número, mas em vez disso, coagir 1a uma cadeia resultante na produção de, por exemplo 0111111.
— precisa saber é o seguinte

2
@ gilly3 - obrigado pela explicação detalhada de sua viagem em mente.
— precisa saber é o seguinte

1
@ gilly3 Bom resumo, mas uma pequena melhoria: "ou deixa um elemento filho" deve ser "ou deixa um elemento filho, uma vez que existe uma lacuna entre a criança e o pai. seu violino tem uma margem / preenchimento e, portanto, é verdade que sempre que você deixar o elemento filho você recebe um evento de mouseover, mas experimentá-lo sem padding / margens, e você não vai conseguir este evento.
— Israel

30

Este é um dos melhores exemplos que encontrei:

  • mouseenter
  • passe o rato por cima
  • mouseout
  • ratoeira

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


O exemplo é bem legal, mas você precisa estruturar sua resposta um pouco mais para ser votado. Lembre-se de que você está tentando responder a uma pergunta ... se você tiver apenas o link, talvez um comentário seja mais apropriado. Se você ainda não pode comentar por causa da reputação, obtenha alguns e faça depois.
— 21814 scristalli

Na verdade, eu realmente gosto desta resposta. O autor da pergunta já deu as definições de mouseover e mouseenter. Eles estavam pedindo um exemplo, e este exemplo demonstra como eles funcionam muito melhor do que os outros exemplos aqui.
— 5135 Patorjk

A resposta de gilly3 tem uma falha (veja meu comentário). Embora não esteja bem estruturada, essa resposta aponta para um recurso melhor.
— Israel

14

Embora eles operem da mesma maneira, no entanto, o mouseenterevento é acionado apenas quando o ponteiro do mouse entra no elemento selecionado . O mouseoverevento é acionado se um ponteiro do mouse inserir qualquer elemento filho também .


3

Veja o código de exemplo e a demonstração na parte inferior da página de documentação do jquery:

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

... o mouseover é acionado quando o ponteiro se move para o elemento filho também, enquanto o mouseenter é acionado apenas quando o ponteiro se move para o elemento associado.


3

Os mouseenter evento difere de mouseover na forma como ele lida com subida do evento . O evento mouseenter , somente aciona seu manipulador quando o mouse entra no elemento ao qual está vinculado, e não um descendente . Consulte: https://api.jquery.com/mouseenter/

O evento mouseleave difere da saída do mouse na maneira como lida com a subida do evento . O evento mouseleave , somente aciona seu manipulador quando o mouse deixa o elemento ao qual está vinculado, não um descendente . Consulte: https://api.jquery.com/mouseleave/


2

Este exemplo demonstra a diferença entre os eventos mousemove , mouseenter e 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 : ocorre toda vez que o ponteiro do mouse é movido sobre o elemento div.
  • onmouseenter : ocorre apenas quando o ponteiro do mouse entra no elemento div.
  • onmouseover : ocorre quando o ponteiro do mouse entra no elemento div e seus elementos filhos (pe espaço).

de alguma forma jsFiddle está quebrado dizendo funcitons são indefinidos - Eu só bifurcada e mudou-se todos os js para <script> jsfiddle.net/orc8empd
— godblessstrawberry

0

Pergunta antiga, mas ainda não há uma resposta boa e atualizada com insight imo.

Atualmente, todos os navegadores suportam mouseover/mouseoute mouseenter/mouseleave. No entanto, o jQuery não registra seu manipulador mouseenter/mouseleave, mas silenciosamente os coloca em um invólucro, mouseover/mouseoutcomo mostra o código a seguir e faz sua própria interpretação ligeiramente diferente mouseenter/mouseleave.

O comportamento exato dos eventos é especialmente relevante em "delegados manipuladores". Infelizmente, o jQuery também tem sua própria interpretação diferente do que são os manipuladores delegados e o que eles devem receber para eventos. Esse fato é mostrado em outra resposta para o evento de clique mais simples.

Então, como responder adequadamente a uma pergunta sobre o jQuery, que usa o texto Javascript para eventos e manipuladores, mas torna os dois diferentes e nem menciona isso na documentação?

Primeiro as diferenças no Javascript "real":

  • ambos
    • o mouse pode "pular" de elementos externos / externos para elementos internos / internos quando movido mais rapidamente do que o navegador mostra sua posição
    • qualquer enter/overum recebe um correspondente leave/out(possivelmente atrasado / nervoso)
    • os eventos vão para o elemento visível abaixo do ponteiro (invisível → não pode ser alvo)
  • mouseenter/mouseleave
    • é entregue ao elemento em que está registrado (destino)
    • sempre que o elemento ou qualquer descendente (por exemplo, saltando) for inserido / deixado
    • não pode borbulhar, porque conceitualmente os descendentes são considerados parte do elemento em questão, ou seja, não há filhos de onde possa vir outro evento (com o significado de "entrou / saiu" dos pais ?!)
    • os filhos também podem ter manipuladores semelhantes registrados, que entram / saem corretamente, mas não relacionados ao ciclo de entrada / saída dos pais
  • mouseover/mouseout
    • o alvo é o elemento real abaixo do ponteiro
      • um alvo não pode ser duas coisas: ou seja, pai e filho ao mesmo tempo
    • o evento não pode "aninhar"
      • antes que uma criança possa ser “exagerada”, os pais precisam sair
    • pode borbulhar, porque target / relatedTarget indica onde o evento ocorreu

Após alguns testes, mostra que, desde que você não use o jQuery "delegar manipuladores com registro de seletor", a emulação é desnecessária, mas razoável: filtra os mouseover/mouseouteventos que mouseenter/mouseleavenão seriam obtidos. O alvo está confuso, no entanto. O real mouseenter/mouseleavedaria o elemento manipulador como alvo, a emulação pode indicar filhos desse elemento, ou seja, o que for mouseover/mouseoutcarregado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.