Jquery mouseenter () против mouseover ()


172

Поэтому после прочтения недавно отвеченного вопроса мне неясно, действительно ли я понимаю разницу междуmouseenter() и mouseover(). Почта заявляет

MouseOver ():

Срабатывает при входе в элемент и всякий раз, когда в элементе происходят движения мыши.

MouseEnter ():

Будет стрелять при входе в элемент.

Я придумал скрипку, которая использует оба, и они кажутся довольно похожими. Может кто-нибудь, пожалуйста, объясните мне разницу между ними?

Я также попытался прочитать определения JQuery, оба говорят одно и то же.

Событие mouseover отправляется элементу, когда указатель мыши входит в элемент

Событие mouseenter отправляется элементу, когда указатель мыши входит в элемент.

Может кто-нибудь уточнить с примером?


1
Демонстрация в документации показывает это довольно хорошо.
Феликс Клинг

2
Стоит отметить, что mouseenter и mouseleave были проприетарными событиями только в IE и эмулировались в других браузерах с помощью jQuery (теперь они, похоже, включены в спецификацию, хотя все еще не реализованы в других браузерах. См. Quirksmode.org/dom/events/mouseover.html )
Russ Cam

Ответы:


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

1
есть ли конкретная причина писать var n = + el.text();вместо var n = el.text();? Я просто прошу любопытства.
Фредрик Гаусс

3
@FredrickGauss - я использую +оператор для приведения строки, возвращаемой из el.text()числа. Мне нужно было? Нет. В этом случае следующее используемое утверждение nтакже приведёт его к числу. Итак, почему я использовал это? Я не уверен ... это было 2 года назад. Это хорошая привычка. Это делает мое намерение явным. Вероятно, у меня изначально было, n + 1прежде чем я сохранил, но решил уменьшить свой код на 2 символа и просто использовать ++n. n + 1бы не принуждать nк ряду, но вместо этого будет принуждать 1к строке , в результате чего выход, например 0111111.
gilly3

2
@ gilly3 - спасибо за подробное объяснение вашего путешествия в уме.
Фредрик Гаусс

1
@ gilly3 Хорошая сводка, но с небольшим улучшением: «или оставляет дочерний элемент« должен быть », или оставляет дочерний элемент, учитывая, что между дочерним и родительским элементами есть пробел. Ваша скрипка имеет поле / отступы, и, следовательно, это правда» что всякий раз , когда вы покидаете дочерний элемент вы получаете событие наведения мыши, но попробовать его без заполнения / полями, и вы не получите это событие.
Израиль

30

Это один из лучших примеров, которые я нашел:

  • MouseEnter
  • Mouseover
  • MouseOut
  • MouseLeave

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


Пример довольно крутой, но вам нужно немного структурировать свой ответ, чтобы получить голосование. Помните, что вы пытаетесь ответить на вопрос ... если у вас есть только ссылка, возможно, комментарий будет более уместным. Если вы не можете комментировать из-за своей репутации, наберите немного и сделайте это позже.
scristalli

На самом деле мне очень нравится этот ответ. Аскер уже дал определения мышиного и мышиного центра. Они просили пример, и этот пример демонстрирует, как они работают намного лучше, чем другие примеры здесь.
patorjk

У ответа gilly3 есть недостаток (см. мой комментарий). Хотя этот ответ не очень хорошо структурирован, это указывает на лучший ресурс.
Израиль

14

Хотя они работают одинаково, однако, mouseenterсобытие срабатывает только тогда, когда указатель мыши входит в выбранный элемент . mouseoverСобытие срабатывает , если указатель мыши входит в дочерние элементы , а также .


3

Посмотрите пример кода и демонстрацию внизу страницы документации jquery:

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

... mouseover срабатывает, когда указатель перемещается и в дочерний элемент, а mouseenter срабатывает только тогда, когда указатель перемещается в связанный элемент.


3

В MouseEnter событие отличается от наведения курсора мыши в том , как она обрабатывает бульканье события . MouseEnter событие, только запускает свой обработчик , когда мышь входит в элемент он обязан, а не потомок . См: https://api.jquery.com/mouseenter/.

В MouseLeave события отличаются от отведения указателя мыши в том , как он обрабатывает бульканье события . MouseLeave событие, только запускает свой обработчик , когда мышь покидает элемент он обязан, а не потомок . См .: https://api.jquery.com/mouseleave/.


2

Этот пример демонстрирует разницу между перемещением мыши , указателем мыши и наведением мыши :

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/mouseoutи mouseenter/mouseleave. Тем не менее, jQuery не регистрирует ваш обработчик mouseenter/mouseleave, но молча помещает их в обертки, mouseover/mouseoutкак показано в следующем коде, и дает свою немного отличную интерпретацию mouseenter/mouseleave.

Точное поведение событий особенно важно для «обработчиков делегатов». К сожалению, jQuery также имеет свою собственную интерпретацию того, что представляют собой обработчики делегатов и что они должны получать для событий. Этот факт показан в другом ответе для более простого события щелчка.

Итак, как правильно ответить на вопрос о jQuery, который использует формулировку Javascript для событий и обработчиков, но делает оба отличия и даже не упоминает об этом в своей документации?

Сначала различия в «реальном» Javascript:

  • обе
    • мышь может «перепрыгивать» из внешних / внешних элементов во внутренние / самые внутренние элементы, когда она перемещается быстрее, чем браузер определяет ее положение
    • любой enter/overполучает соответствующий leave/out(возможно поздно / нервный)
    • события идут к видимому элементу под указателем (невидимый → не может быть целью)
  • mouseenter/mouseleave
    • доставляется до элемента, где зарегистрирован (цель)
    • всякий раз, когда элемент или любой потомок (например, путем прыжка) вводится / оставляется
    • он не может пузыриться, потому что концептуально потомки считаются частью рассматриваемого элемента, то есть нет дочерних элементов, из которых могло бы произойти другое событие (со значением «ввели / оставили» родительский элемент ?!)
    • у детей также могут быть зарегистрированы похожие обработчики, которые вводятся / уходят правильно, но не связаны с родительским циклом ввода / вывода
  • mouseover/mouseout
    • цель - фактический элемент под указателем
      • целью не может быть две вещи: т.е. не родитель и ребенок одновременно
    • событие не может «гнездиться»
      • прежде чем ребенок может быть «переедан», родитель должен «выйти»
    • может всплыть, потому что target / relatedTarget указывает, где произошло событие

После некоторого тестирования это показывает, что пока вы не используете jQuery «делегировать обработчики с регистрацией селектора», эмуляция не нужна, но разумна: она отфильтровывает mouseover/mouseout события, которые a mouseenter/mouseleaveне получит. Цель перепутана, хотя. Реальный mouseenter/mouseleaveдаст элемент обработчика в качестве цели, эмуляция может указывать на потомок этого элемента, то есть независимо от mouseover/mouseoutпроводимого.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.