Chapter 07. 이벤트 다루기.


Lesson 02. 핵심 내용

핵심 01: 일반 이벤트 등록

핵심 02: 단축 이벤트 등록

핵심 03: 등록한 이벤트 제거

핵심 04: 이벤트 한 번만 실행

핵심 05: 기본 행동 취소

핵심 06: 버블링 멈추기

핵심 07: 버블링 활용 1: 하나의 이벤트 리스너로 여러 이벤트 처리하기

핵심 08: 버블링 활용 2: 라이브 이벤트

핵심 09: 이벤트 발생시키기

핵심 10: 사용자 정의 이벤트 만들기

핵심 11: mouseover vs mouseenter 차이점


핵심 01: 일반 이벤트 등록

사용법 : $대상.on("이벤트 이름", 이벤트리스너)


예제 01. 확인 버튼을 누르면 "안녕하세요" 메세지를 출력해 주세요.

1
2
3
4
5
6
7
8
9
$(document).ready(function()
{
// #btn에 클릭 이벤트 등록
    $("#btn").on("click",function()
    {
    // 안녕하세요. 메시지 출력
        alert("안녕하세요.")
    })
})
cs


* on() 메서드를 이용해 이벤트를 등록하는 방법은 가장 일반적인 방법입니다.





예제 02. 클릭한 메뉴 항목을 출력해 주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
$(document).ready(function()
{
    // 메뉴 아이템에 클릭 이벤트 등록
    $("ul.menu li").on("click", function() // 여러 개의 태그 노드에 이벤트를 등록하는 경우에도 on() 메서드를 사용하면 됩니다.
    {
    // 클릭한 메뉴 항목 출력
    // 이때 이벤트 리스너의 this는 이벤트를 발생한 자바스크립트 노드 객체를 가리키며 
    // jQuery 기능을 사용하기 위해 $() 함수를 이용해 자바스크립트 노드 객체를 jQuery 객체로 변경해 사용합니다
    
    alert($(this).html());
    })
});
 
cs

* 위의 구문은 다음과 같이 이벤트가 등록되는 것과 같습니다
위의 구문이 실행되는 경우 이벤트 리스너 하나가 등록되는 것이 아니라 각각의 <li> 태그 노드에 이벤트가 등록된다는 점입니다.
1
2
3
4
5
6
7
8
9
10
$(document).ready(function()
{
    $("ul.menu li").each(function(index)
    {
        $(this).on("click",function()
        {
        alert($(this).html());
        });
    });
});
cs


핵심 02: 단축 이벤트 등록

사용법 : $대상.단축이벤트(이벤트리스너)


예를 들어 click 이벤트를 등록하는 경우 단축 이벤트 메서드를 사용하면 

다음과 같이 click() 메서드를 이용해 간결하게 처리할 수 있습니다

- on() 메서드 사용

$대상.on("click",function(){})


- click() 메서드 사용

$대상.click(function(){})


예제 03. 확인 버튼을 누르면 "환영합니다". 메세지를 출력해 주세요

1
2
3
4
5
6
7
8
9
10
11
<script>
$(document).ready(function()
{
    // 버튼에 클릭 이벤트 등록
    $("#btn").click(function()
    {
    // 환영합니다. 메시지 출력
    alert("환영합니다.")
    })
})
</script>
cs



* 둘 중 여러분이 편한 방법을 사용하면 됩니다.


핵심 03: 등록한 이벤트 제거

사용법

$대상.off("click", 삭제하고 싶은 이벤트 리스너 명)

$대상.off("click")

$대상.off()


예제 04. 이벤트 제거 버튼(#btnOff)을 누르면 더 이상 이벤트 리스너가 동작하지 않도록 확인 버튼(#btn)에 등록한 이벤트를 제거해 주세요

1
2
3
4
<body>
    <button id="btn">확인</button>
    <button id="btnOff">이벤트제거</button>
</body>
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script>
$(document).ready(function()
{
    $("#btn").click(function()
    {
    alert("환영합니다.")
    })
 
    $("#btnOff").click(function()
    {
        $("#btn").off("click");
    })
})
</script>
cs


이벤트를 제거하는 경우는 총 세 가지가 있습니다

경우 1: 특정 이벤트에 대한 리스너를 제거하고 싶은 경우
$대상.off("click", 삭제하고 싶은 이벤트 리스너 명);

경우 2: 특정 이벤트에 걸려있는 모든 이벤트 리스너를 제거하고 싶은 경우 (이벤트 이름을 매개변수 값으로 off() 메서드를 호출하면 됩니다.)
$대상.off("click");

경우 3: 모든 이벤트 종류에 상관없이 모든 이벤트를 제거하고 싶은 경우 (또, 노드에 걸린 모든 이벤트를 제거하고 싶은 경우)
$대상.off();


핵심 04: 이벤트 한 번만 실행

사용법 : $대상.one(이벤트이름, 이벤트리스너)

이벤트를 오직 한 번만 실행하고 이후 실행되지 않게 이벤트를 제거하는 경우. one() 메서드를 사용

등록한 이벤트 리스너는 딱 한번 실행되고 자동으로 제거됩니다.


예제 05. 확인버튼(#btn)을 클릭하면 "환영합니다." 메세지를 출력해 주세요. 단, 이벤트 리스너는 오직 한번만 실행되게 만들어 주세요.

1
2
3
4
5
6
7
8
9
10
11
<script>
$(document).ready(function()
{
// #btn에 클릭 이벤트 등록
    $("#btn").one("click",function()
    {
    // 환영합니다. 메시지 출력
    alert("환영합니다.")
    })
})
</script>
cs


핵심 05: 기본 행동 취소

사용법 : event.preventDefault();


모든 이벤트가 기본 행동을 취소할 수 있는 것은 아닙니다. 

이벤트 발생 후 실행되는 기본 행동이 알려면 발생한 이벤트 객체의 cancleable 프로퍼티 값을 확인하면 됩니다.

이 값이 true인 경우 이벤트 실행 후 기본 행동이 실행된다는 의미입니다.

또한 이벤트 객체의 prepentDefault() 메서드를 이용해 기본행동이 실행되지 않게 할 수도 있습니다.


예제 06. <a> 태그 클릭 시 "환영합니다" 메세지를 출력해 주세요. 단 링크 이동은 되지 않게 만들어 주세요
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script>
$(document).ready(function()
{
// #test에 클릭 이벤트 등록
    $("#test").one("click",function(e)
    {
    // 환영합니다. 메시지 출력
    alert("환영합니다.");
    // 기본 행동 취소
    e.preventDefault(); // 이 부분을 주석 처리한 후 실행하면, 기본 행동인 링크이동이 실행됩니다
    // 정석적인 방법은 아니지만, preventDefault() 메서드 대신, "return false"를 이용하는 방법도 있습니다
    })
})
</script>
cs



이벤트 유형

DOM 인터페이스

취소 가능 여부

(Cancleable 프로퍼티 값)

기본 동작

abort

Event

아니오

없음

beforeinput

InputEvent

DOM 요소를 갱신

blur

FocusEvent

아니오

없음

click

MouseEvent

상황에 따라 달라짐:

연관된 활성화 동작이 있는 타깃의 경우 해당 활성화 동작을 실행;

포커스를 받을수 있는 타깃의 경우 해당 요소에 포커스를 부여

compositionstart

CompositionEvent

텍스트 구성 창을 표시

compositionupdate

CompositionEvent

아니오

없음

compositionend

CompositionEvent

아니오

없음

dblclick

MouseEvent

아니오

상황에 따라 달라짐:

연관된 활성화 동작이 있는 타깃의 경우 해당 활성화 동작을 실행;

포커스를 받을수 있는 타깃의 경우 해당 요소에 포커스를 부여;

선택된 타깃의 경우 해당 요소의 콘텐츠의 일부나 전체를 선택

error

Event

아니오

없음

focus

FocusEvent

아니오

없음

focusin

FocusEvent

아니오

없음

focusout

FocusEvent

아니오

없음

input

InputEvent

아니오

없음

keydown

KeyboardEvent

아니오

상황에 따라 달라짐:

beforinputinput 이벤트;

텍스트 구성 시스템을 실행;

blurfocus 이벤트;

keypress 이벤트;

활성화 동작;

기타 이벤트

keyup

KeyboardEvent

없음

load

Event

아니오

없음

mousedown

MouseEvent

상황에 따라 달라짐:

드래그/드롭 동작을 시작;

텍스트 선택을 시작;

스크롤/팬 동작을 시작(마우스 가운데 버튼이 지원될 경우 마우스 가운데 버튼을 통해)

mouseenter

MouseEvent

아니오

없음

mouseleave

MouseEvent

아니오

없음

mousemove

MouseEvent

없음

mouseout

MouseEvent

없음

mouseover

MouseEvent

없음

mouseup

MouseEvent

컨텍스트 메뉴 호출(마우스 오른쪽 버튼이 지원될 경우 마우스 오른쪽 버튼을 통해)

resize

Ulevent

아니오

없음

scroll

Ulevent

아니오

없음

select

Event

아니오

없음

unload

Event

아니오

없음

wheel

WheelEvent

문서를 스크롤(또는 줌)



핵심 06: 버블링 멈추기

사용법 : event.stopPropagation()
이벤트가 버블링이 발생하는지 알려면 발생한 이벤트 객체의 bubbles 프로퍼티 값을 확인하면 됩니다.
이 값이 true이면 이벤트 객체에서 제공하는 stopPropa-gation() 메서드를 이용해 버블링을 멈출 수 있습니다.

이벤트 유형

버블링 단계

(bubble 프로퍼티 값)

DOM 인터페이스

abort

아니오

Event

beforeinput

InputEvent

blur

아니오

FocusEvent

click

MouseEvent

compositionstart

CompositionEvent

compositionupdate

CompositionEvent

compositionend

CompositionEvent

dblclick

MouseEvent

error

아니오

Event

focus

아니오

FocusEvent

focusin

FocusEvent

focusout

FocusEvent

input

InputEvent

keydown

KeyboardEvent

keyup

KeyboardEvent

load

아니오

Event

mousedown

MouseEvent

mouseenter

아니오

MouseEvent

mouseleave

아니오

MouseEvent

mousemove

MouseEvent

mouseout

MouseEvent

mouseover

MouseEvent

mouseup

MouseEvent

resize

아니오

Ulevent

scroll

아니오/

Ulevent

select

Event

unload

아니오

Event

wheel

WheelEvent



예제 07. 풀이 전 코드에서 각각의 버튼을 누르면, 실행화면처럼 메세지가 출력될 수 있게 버블링 관련 기능을 이용해 코드를완성해 주세요.


실행화면

버블링처리 버튼(#btn1)을 누른 경우

02. 버블링 처림

01. #panel에 등록한 클릭이벤트


버블링중지 버튼(#btn2)을 누른 경우

03. 버블링 중지


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<script>
$(document).ready(function() 
{
// #panel에 클릭 이벤트 등록
    $("#panel").click(function(e) 
    {
  // 메시지 출력
  console.log("01. panel에 등록한 클릭 이벤트.")
  });
    // #btn1에 클릭 이벤트 등록
  $("#btn1").click(function(e)
  {
  // "02. 버블링 처리" 메시지 출력
  console.log("02. 버블링 처리");
  });
  // #btn2에 클릭 이벤트 등록
  $("#btn2").click(function(e)
    {
    // "03. 버블링 중지" 메시지 출력
    console.log("03. 버블링 중지");
    // 버블링 중지
    e.stopPropagation();
    })
})
</script>
cs



핵심 07: 버블링 활용 1: 하나의 이벤트 리스너로 여러 이벤트 처리하기

사용법 : $대상.on("이벤트명","선택자",이벤트 리스너)


예제 08. 먼저 다음에 등장하는 풀이전 코드는 '핵심 01: 일반 이벤트 등록, 예제 02'에서 다룬 예제로서 클릭한 메뉴 항목을 출력하는 예제이다.


풀이 01: on() 메서드를 이용하는 방법

1
2
3
4
5
6
7
8
9
10
11
<script>
$(document).ready(function() 
{
// 메뉴 항목에 클릭 이벤트 등록
    $("ul.menu li").on("click"function() 
    {
    // 클릭한 메뉴 아이템의 정보 출력
    alert($(this).html());
    })
});
</script>
cs

위의 코드에서 on() 메서드가 실행되면 다음과 같이 각 메뉴 항목마다 이벤트 리스너가 등록되는 문제점을 가지고 있습니다.

이번 예제는 이벤트 리스너 하나만을 등록해 기존 코드 실행과 동일하게 동작할 수 있게 코드를 변경하는 것입니다.

풀이 02: 자바스크립트 버블링을 이용하는 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<script>
$(document).ready(function()
{
// 메뉴에 클릭 이벤트 등록
    $("ul").on("click"function(e)
    { 
    console.log("테스트용 = "+e.target.tagName);
    // 실제 이벤트를 발생한 노드(target 속성)가 <li> 태그인 경우만 처리
    // 가장 쉽게 해결할 수 있는 방법은 버블링을 이용하는 것입니다.
    // 풀이처럼 <li>의 상위 태그인 <ul> 태그에 click 이벤트를 등록하면 '
    // <li> 태그 클릭 시 이벤트가 흘러(버블링) <ul> 태그에 등록된 이벤트 리스너가 실행됩니다.
 
        if(e.target.tagName=="LI")
        // 이때 리스너 내부에서 이벤트 객체의 target(이벤트를 발생시킨 노드 객체) 속성을 활용해 
        이벤트를 발생한 객체가 <li> 태그일 때만 메세지를 띄어줍니다.
        {
        // 클릭한 메뉴 아이템의 정보 출력
        alert($(e.target).html());
        }
               
    })
});
 
cs


1
2
3
4
5
6
7
8
<body>
    <ul class="menu">
        <li>menu1</li>
        <li>menu2</li>
        <li>menu3</li>
        <li>menu4</li>
    </ul>        
</body>
cs

위처럼 이벤트를 등록하는 경우
<ul>태그의 하위 노드인
<li>태그가 클릭되는 경우 버블링에 의해
<ul>태그에 등록한 이벤트 리스너가 실행됩니다.

풀이 03. jQuery 버블링 기능을 이용하는 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<script>  
$(document).ready(function()
{
    // jQuery 이벤트 메서드를 활용한 클릭 이벤트 처리
    $("ul").on("click""li"function(e)  
    // 기존 on() 메서드와 달리 두 번째 인자에 리스너 대신 이벤트 처리를 원하는 선택자를 넣어 주고, 
    이벤트 리스너는 세 번째 인자에 넣어주세요.
    {
    console.log("테스트용 = "+e.target.tagName);
    // 클릭한 메뉴 아이템의 정보 출력
    alert($(e.target).html());
    })
});
</script>
 
cs

jQuery는 좀더 쉽게 버블링을 활용해 이벤트를 처리할 수 있는 기능을 지원합니다.

핵심 08: 버블링 활용 2: 라이브 이벤트

예제 09. 다음 예제는 동적으로 메뉴 항목을 추가하고 메뉴 항목 클릭 시 클릭한 메뉴 항목을 알려주는 예제입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<script>
$(document).ready(function(){
    // 신규 메뉴 항목 추가
    var $menu = $("ul.menu");
    // 카운트 변수 추가
    var count=0;
 
    // #add 버튼에 클릭 이벤트 등록
    $("#add").click(function()
    {
    // 카운트 증가
    count++;
    // 신규 메뉴 항목 추가
    $menu.append("<li>new"+count+"</li>");
    })
    // 메뉴 항목에 클릭 이벤트 등록
    $("ul li").click(function()
    {
    // 클릭한 메뉴의 정보 출력
    alert($(this).html());
    })
});
</script>
cs


먼저 코드를 실행한 후 메뉴 항목을 클릭 - > 클릭한 메뉴 항목이 알림 창으로 출력된다

메뉴 추가 버튼을 클릭후, 추가된 메뉴 항목 클릭 -> 알림창 출력이 되지 않는다

-> 이벤트를 등록하는 시점에 신규 메뉴 항목은 존재하지 않아 이벤트가 등록되지 않기 때문이다.


방법 01. 메뉴 항목 추가와 동시에 이벤트 등록

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<script>
$(document).ready(function()
{
    // 신규 메뉴 항목 추가
    var $menu = $("ul.menu");
    // 카운트 변수 추가
    var count=0;
    // #add 버튼에 클릭 이벤트 등록
    $("#add").click(function()
    {
        // 카운트 증가
        count++;
        // 신규 메뉴 항목 생성
        var $newItem = $("<li>new"+count+"</li>");
        //이벤트 등록
        $newItem.on("click",function()
        {
        alert($(this).html())
        });
    // 메뉴 항목 추가
    $menu.append($newItem);
    })
            
    // 선택한 메뉴 항목 출력
    $("ul li").on("click",function()
    {
    alert($(this).html())
    })
});
</script>
 
cs


방법 02. 버블링을 이용하는 방법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<script>
$(document).ready(function()
{
    // 신규 메뉴 항목 추가
    var $menu = $("ul.menu");
    // 카운트 변수 추가
    var count=0;
    // #add 버튼에 클릭 이벤트 등록
    $("#add").click(function()
    {
        // 카운트 증가
        count++;
        // 신규 메뉴 항목 생성
        var $newItem = $("<li>new"+count+"</li>");
         // 메뉴 항목 추가
        $menu.append($newItem);
          })    
       // jQuery on() 메서드를 활용해 li에 click live 이벤트 등록    
    $("ul").on("click""li"function() // 기존 on() 메서드의 두 번째 인자 값에 메뉴 항목을 의미하는 "li"을 추가
    {
    // 클릭한 메뉴의 정보 출력
    alert($(this).html());
    })
});
</script>
cs

핵심 09: 이벤트 발생시키기

사용법 : $대상.trigger("이벤트이름")


예제 10. 다음 문서에서 버튼A를 누르면 버튼B를 눌린 것처럼 이벤트 리스너가 실행되게 만들어 주세요.


실제 마우스를 클릭하지 않았지만 클릭한 것처럼 특정 노드에서 수동으로 이벤트를 발생시켜야 하는 경우가 있습니다

jQuery 이벤트 메서드 중 trigger()을 이용하면 수동으로 이벤트를 발생시킬 수 있습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script>
$(document).ready(function()
{
    // #btnA에 클릭 이벤트 등록
    $("#btnA").on("click",function()
    {
        //이벤트 발생
        $("#btnB").trigger("click");
    })
 
    // #btnB에 클릭 이벤트 등록
    $("#btnB").on("click",function()
    {
    console.log("버튼B가 눌렸습니다.");
    })
})
</script>
cs

핵심 10: 사용자 정의 이벤트 만들기
어느 정도 수준에 이르게 되면 자신만의 라이브러리를 만들어 사용하게 됩니다.
이때, 라이브러리만의 고유 이벤트도 만들게 됩니다.

jQuery를 이용하면 다음과 같이 두 가지 방법을 활용해 사용자 정의 이벤트를 만들 수 있습니다.

사용법 : 
1
2
3
4
5
6
7
8
9
10
방법1
var event = jQuery.Event("이벤트이름");
[event.데이터1=값;
evnet.데이터2=값;
...]
$대상.trigger(event);
 
방법2
var event = jQuery.Event("이벤트이름");
$대상.trigger(event[데이터1=값, 데이터2=값, ...]);
cs

단계 01. 이벤트 객체 생성
단계 02. 이벤트 발생 시 리스너에 보낼 데이터 생성
단계 03. 이벤트 발생

예제 11. 다음 문서에는 추가 버튼을 누르면 신규 메뉴 항목을 추가하는 기능이 구현돼 있습니다.
이 문서에 사용자 정의 이벤트를 추가해 실행화면과 같이 실행될 수 있게 만들어 주세요


풀이 01. 방법 1을 활용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<script>
$(document).ready(function()
{
    // #output 찾기
    var $output = $("#output");
    // .menu 찾기
    var $menu = $("ul.menu");
    // 카운트 변수 추가
    var count=0;
 
    // #add 버튼에 클릭 이벤트 등록
    $("#add").click(function()
    {
        // 카운트 증가
        count++;
        // 신규 메뉴 항목 생성
        var $newItem = $("<li>new"+count+"</li>");
       
        // 메뉴 항목 추가
        $menu.append($newItem);
 
        // 여기에 풀이 입력
        // 1단계. 이벤트 객체 생성
        var event  = jQuery.Event("addItem");
        // 2단계. 이벤트 데이터 생성 (신규로 생성한 메뉴 아이템, 메뉴 아이템 이름, 현재 메뉴 개수를 이벤트에 담는다)
        event.item = $newItem;
        event.itemName = $newItem.text();
        event.itemLength = $menu.children().length;
        // 3단계. 이벤트 발생
        $menu.trigger(event);
    })
            
    // addItem 이벤트 리스너 등록
    $menu.on("addItem"function(e) // 2단계에서 이벤트에 담은 데이터는 이벤트의 매개변수인 e에 담겨 넘어온다
    { 
        $output.prepend("<p>추가 아이템 = "+e.itemName+", 아이템 개수 = "+e.itemLength+"</p>");         
    })
});
</script>
 
cs


풀이 02. 방법 2를 활용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<script>
$(document).ready(function()
{
    // #output 찾기
    var $output = $("#output");
    // .menu 찾기
    var $menu = $("ul.menu");
    // 카운트 변수 추가
    var count=0;
 
    // #add 버튼에 클릭 이벤트 등록
    $("#add").click(function()
    {
        // 카운트 증가
        count++;
        // 신규 메뉴 항목 생성
        var $newItem = $("<li>new"+count+"</li>");
 
        // 메뉴 항목 추가
        $menu.append($newItem);
 
        // 1단계. 이벤트 객체 생성
        var event  = jQuery.Event("addItem");
        // 2단계. 이벤트 데이터 생성
        // 방법2에서는 이벤트 리스너로 넘길 데이터를 이벤트 객체에 포장하는 게 아니라
        // trgger() 메서드의 매개변수 값으로 넘겨 호출한다는 점이 다릅니다. 보낼 데이터를 배열로 만듭니다.
        var data = [$newItem, $newItem.text(), $menu.children().length];
        // 3단계. 이벤트 발생
        $menu.trigger(event, data);
    })
         
        // addItem 이벤트 리스너 등록 trigger()에 담아 보낸 배열 데이터는 이벤트 리스너의 두 번째 매개변수부터 차례대로 담기게 됩니다.
        $menu.on("addItem"function(e, $item, itemName, itemLength)
        {
            $output.prepend("<p>추가 아이템 = "+itemName+", 아이템 개수 = "+itemLength+"</p>");
        })
});
</script>
 
cs


핵심 11: mouseover vs mouseenter 차이점

mouseover/mouseout

마우스 커서가 노드에 들어오거나 노드 밖으로 나가면 발생하는 이벤트입니다.

만약 내부에 자식 노드가 있는 경우 자식 노드에서는 이벤트가 발생하지 않습니다.

즉, 자식 노드는 독립적인 노드로 처리됩니다.


mouseenter/mouseleave 

마우스 커서가 노드에 들어오거나 노드 밖으로 나가면 발생하는 이벤트입니다.

만약 내부에 자식 노드가 있는 경우 자식 노드에서는 이벤트가 발생하지 않습니다.

즉, 자식 노드는 부모 노드의 일부분으로 처리됩니다.


예제 12. mouseover/mouseout 이벤트 동작 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<script>
var count=0;
var $info = null;
var $child = null;
$(document).ready(function()
{
    $info = $("#info");
    $child  = $("#child");
        
    $("#parent").mouseover(function(e)
    {
        count++;                
        $info.html($info.html()+"<br>"+count+", "+e.target.id+".over");
    });
        
        
    $("#parent").mouseout(function(e)
    {
        count++;
        $info.html($info.html()+"<br>"+count+", "+e.target.id+".out");
    });
});
</script>
 
</head>
 
<body>
    <div id="info">
        여기에 이벤트 정보가 출력될 거에요.
    </div>
    <div id="parent">
        parent
        <div id="child">
            child
        </div>
    </div>
</body>
 
</html>
cs



mouseover/mouseout 이벤트의 경우 parent 내부에 child가 포함 관계라 하더라도 독립적인 노드로 판단해 이벤트가 수없이 발생됩니다.

이 문제점을 해결하려면 mouseover/mouseout 이벤트 대신 mouseenter/mouseleave 이벤트를 사용해야 합니다.


예제 14. mouseenter/mouseleave 이벤트 동작 테스트

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<script>
var count=0;
var $info = null;
var $child = null;
$(document).ready(function()
{
    $info = $("#info");
    $child  = $("#child");
        
    $("#parent").mouseenter(function(e) // mouseover -> mouseenter
    {
        count++;                
        $info.html($info.html()+"<br>"+count+", "+e.target.id+".over");
    });
        
        
    $("#parent").mouseleave(function(e) // mouseout -> mouseleave
    {
        count++;
        $info.html($info.html()+"<br>"+count+", "+e.target.id+".out");
    });
});
</script>
 
</head>
 
<body>
    <div id="info">
        여기에 이벤트 정보가 출력될 거에요.
    </div>
    <div id="parent">
        parent
        <div id="child">
            child
        </div>
    </div>
</body>
 
</html>
cs








예제 13. mouseover/mouseout 이벤트 문제점 테스트

예제 15. mouseenter/mouseleave 이벤트를 활용한 애니메이션 처리

// 두 예제는 이해를 못해서 그냥 패스함



Posted by 너래쟁이
: