jquery mouseenter () 대 mouseover ()


172

그래서 최근에 답변 된 질문 을 읽은 후 mouseenter()와 의 차이점을 실제로 이해하고 있는지 확실하지 않습니다 mouseover(). 게시물 상태

MouseOver () :

요소에 들어가거나 요소 내에서 마우스 움직임이 발생할 때마다 발생합니다.

MouseEnter () :

요소를 입력하면 발사됩니다.

나는 두 가지를 모두 사용 하는 바이올린을 생각해 냈고 꽤 비슷해 보입니다. 누군가 나에게 둘 사이의 차이점을 설명해 줄 수 있습니까?

나는 또한 JQuery 정의를 읽으려고 노력했다. 둘 다 같은 것을 말한다.

마우스 포인터가 요소에 들어가면 mouseover 이벤트가 요소로 전송됩니다.

마우스 포인터가 요소에 들어가면 mouseenter 이벤트가 요소로 전송됩니다.

누군가 예를 들어 설명해 주시겠습니까?


1
문서 의 데모는 꽤 잘 보여줍니다.
Felix Kling

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 좋은 요약이지만 약간의 개선 : "자식 요소를 남겨 둡니다"는 "자식과 부모 사이에 간격이있는 경우 자식 요소를 남겨 둡니다"바이올린에는 여백 / 패딩이 있으므로 사실입니다. 자식 요소를 떠날 때마다 마우스 오버 이벤트가 발생하지만 패딩 / 여백없이 시도해도이 이벤트가 발생하지 않습니다.
Israel

30

이것은 내가 찾은 최고의 예 중 하나입니다.

  • 마우스
  • 마우스 오버
  • 마우스 아웃
  • 쥐잎

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


이 예제는 매우 훌륭하지만, 상향 조정하려면 답변을 조금 더 구성해야합니다. 당신이 질문에 대답하려고 노력하고 있음을 기억하십시오. 당신이 링크 만 가지고 있다면 아마도 주석이 더 적절할 것입니다. 평판 때문에 아직 댓글을 달 수 없다면, 일부를 얻고 나중에 해보십시오.
scristalli

사실이 답변이 정말 마음에 듭니다. asker는 이미 mouseover와 mouseenter의 정의를 제공했습니다. 그들은 예를 요구했고,이 예는 여기의 다른 예보다 훨씬 잘 작동하는 방법을 보여줍니다.
patorjk 2019

gilly3의 답변에 결함이 있습니다 (내 의견 참조). 잘 구성되지는 않았지만이 답변은 더 나은 리소스를 가리 킵니다.
이스라엘

14

그러나 동일한 방식으로 작동하지만 마우스 포인터가 선택한 요소에 들어갈mouseenter 때만 이벤트가 트리거됩니다 . mouseover이벤트가 트리거됩니다 마우스 포인터뿐만 아니라 자식 요소를 입력하면 .


3

jquery 문서 페이지 하단의 예제 코드 및 데모를 참조하십시오.

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

... 마우스 오버는 포인터가 자식 요소로 움직일 때 발생하지만 마우스 입력기는 포인터가 바인딩 된 요소로 움직일 때만 발생합니다.


3

mouseenter의 이벤트 다릅니다 에서 마우스 오버 가 처리하는 방식의 이벤트 버블 링을 . mouseenter의 이벤트 만 트리거 때 핸들러를 마우스 요소 입력 이,에 바인딩 하지 후손 . 참조 : https://api.jquery.com/mouseenter/

하여 MouseLeave 이벤트 다릅니다 에서 마우스를 이동하면 그것을 처리하는 방법으로 이벤트 버블 링을 . 하여 MouseLeave 이벤트는 만 트리거 때 핸들러를 마우스 요소 잎 이,에 바인딩 하지 후손 . 참조 : https://api.jquery.com/mouseleave/


2

이 예제는 mousemove , mouseentermouseover 이벤트 의 차이점을 보여줍니다 .

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)에 들어갈 때 발생합니다.

난 그냥 갈래와 모든 JS 이동 - 어떻게 든 funcitons이 정의하는 말 jsfiddle 깨진 <script> jsfiddle.net/orc8empd
godblessstrawberry

0

오래된 질문이지만 여전히 통찰력이있는 최신 답변은 없습니다.

요즘 모든 브라우저는 mouseover/mouseout및을 지원 mouseenter/mouseleave합니다. 그럼에도 불구하고 jQuery는 핸들러를에 등록하지는 않지만 다음 코드가 표시하고 자체적으로 약간 다른 해석을 수행 mouseenter/mouseleave하므로 래퍼에 자동 mouseover/mouseout으로 배치합니다 mouseenter/mouseleave.

이벤트의 정확한 동작은 특히 "대리자 처리기"와 관련이 있습니다. 불행히도 jQuery는 델리게이트 핸들러가 무엇이고 이벤트에 대해 무엇을 받아야하는지에 대한 자체 해석이 다릅니다. 이 사실은 더 간단한 클릭 이벤트에 대한 또 다른 답변 에 표시됩니다 .

그렇다면 이벤트와 핸들러에 Javascript 단어를 사용하지만 문서와는 달리 jQuery에 대한 질문에 올바르게 대답하는 방법은 무엇입니까?

먼저 "실제"Javascript의 차이점 :

  • 양자 모두
    • 브라우저가 위치를 샘플링하는 것보다 빠르게 이동할 때 마우스가 외부 / 외부 요소에서 내부 / 가장 안쪽 요소로 "점프"할 수 있습니다.
    • 모두 enter/over상응하는 것을 얻습니다 leave/out(아마 늦거나 점프)
    • 이벤트는 포인터 아래 보이는 요소로 이동합니다 (보이지 않음 → 대상이 될 수 없음)
  • mouseenter/mouseleave
    • 등록 된 요소에 전달됨 (대상)
    • 요소 나 자손 (예 : 점프)이 들어 오거나 떠날 때마다
    • 개념적으로 하위 요소는 문제의 요소의 일부로 간주되기 때문에 거품이 발생하지 않습니다. 즉, 다른 이벤트가 발생할 수있는 자식이 없습니다 (부모가 "입력 / 왼쪽"의 의미로?).
    • 어린이들도 비슷한 처리기가 등록되어있을 수 있습니다.이 핸들러는 올바르게 입력 / 탈퇴하지만 부모의 입력 / 탈출주기와 관련이 없습니다.
  • mouseover/mouseout
    • 대상은 포인터 아래의 실제 요소입니다
      • 대상은 두 가지가 될 수 없습니다. 즉, 부모와 자식이 동시에되지 않습니다
    • 이벤트는 "중첩"할 수 없습니다
      • 아이가“과로 넘어지기”전에 부모는“나가야”합니다
    • target / relatedTarget이 이벤트가 발생한 위치를 나타내므로 버블 링 가능

일부 테스트 후 jQuery "선택기 등록과 함께 델리게이트 핸들러"를 사용하지 않는 한 에뮬레이션은 불필요하지만 합리적입니다. 얻을 수없는 mouseover/mouseout이벤트를 필터링합니다 mouseenter/mouseleave. 그러나 대상은 엉망입니다. 실제 mouseenter/mouseleave는 처리기 요소를 대상으로 제공하고 에뮬레이션은 해당 요소의 하위 항목, 즉 mouseover/mouseout운반 된 항목을 나타낼 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.