기본 사용법
on은 jQuery에서 가장 중요한 이벤트 API이다. on API를 통해서 jQuery에서 이벤트를 다루는 방법을 알아보자.
on의 기본적인 문법은 아래와 같다.
1 | .on( events [, selector ] [, data ], handler(eventObject) ) |
- event : 등록하고자 하는 이벤트 타입을 지정한다. (예: "click")
- selector : 이벤트가 설치된 엘리먼트의 하위 엘리먼트를 이벤트 대상으로 필터링함
- data : 이벤트가 실행될 때 핸들러로 전달될 데이터를 설정함
- handler : 이벤트 핸들러 함수
selector
selector 파라미터는 이벤트 대상을 필터링한다. 아래 예제를 보자.
1 2 3 4 5 6 7 8 9 10 11 | < ul > < li >< a href = "#" >HTML</ a ></ li > < li >< a href = "#" >CSS</ a ></ li > < li >< a href = "#" >JavaScript</ a ></ li > </ ul > < script src = "//code.jquery.com/jquery-1.11.0.min.js" ></ script > < script > $('ul').on('click','a, li', function(event){ console.log(this.tagName); }) </ script > |
실행결과
1 2 | A LI |
위의 예제는 ul 엘리먼트의 하위 엘리먼트 중에 a, li 엘리먼트들에 대해서만 이벤트가 발생한다. 주의 할 것은 ul 엘리먼트는 이벤트가 발생하지 않는다는 점이다. 이것은 jQuery에서 이벤트 버블링을 구현하는 방법이기도 하다.
late binding
jQuery는 존재하지 않는 엘리먼트에도 이벤트를 등록할 수 있는 놀라운 기능을 제공한다. 아래 코드를 보자.
1 2 3 4 5 6 7 8 9 10 11 | < script src = "//code.jquery.com/jquery-1.11.0.min.js" ></ script > < script > $('ul').on('click','a, li', function(event){ console.log(this.tagName); }) </ script > < ul > < li >< a href = "#" >HTML</ a ></ li > < li >< a href = "#" >CSS</ a ></ li > < li >< a href = "#" >JavaScript</ a ></ li > </ ul > |
위의 코드는 실행되지 않는다. ul 엘리먼트가 존재하지 않을 때 이벤트 설치를 시도하고 있기 때문이다. 존재하지 않는 엘리먼트에 이벤트를 달 수 없다는 것은 이미 배운 바가 있다. 그런데 jQuery는 존재하지 않는 엘리먼트에게도 이벤트를 설치할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 | < script src = "//code.jquery.com/jquery-1.11.0.min.js" ></ script > < script > $('body').on('click','a, li', function(event){ console.log(this.tagName); }) </ script > < ul > < li >< a href = "#" >HTML</ a ></ li > < li >< a href = "#" >CSS</ a ></ li > < li >< a href = "#" >JavaScript</ a ></ li > </ ul > |
다중 바인딩
하나의 엘리먼트에 여러개의 이벤트 타입을 동시에 등록하는 방법을 알아보자. (실행)
1 2 3 4 5 6 7 8 | < input type = "text" id = "target" /> < p id = "status" ></ p > < script src = "//code.jquery.com/jquery-1.11.0.min.js" ></ script > < script > $('#target').on('focus blur', function(e){ $('#status').html(e.type); }) </ script > |
한번에 여러개의 이벤트 타입을 선택했다. 만약 이벤트에 따라서 다른 핸들러를 실행하고 싶다면 아래와 같이 코드를 변경한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <input type = "text" id = "target" /> <p id = "status" >< /p > <script src= "//code.jquery.com/jquery-1.11.0.min.js" >< /script > <script> $( '#target' ).on({ 'focus' : function (e){ }, 'blur' : function (e){ } }) < /script > |
이벤트 제거
이벤트를 제거할 때는 off를 사용한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | < input type = "text" id = "target" ></ textarea > < input id = "remove" type = "button" value = "remove" /> < p id = "status" ></ p > < script src = "//code.jquery.com/jquery-1.11.0.min.js" ></ script > < script > var handler = function(e){ $('#status').text(e.type+Math.random()); }; $('#target').on('focus blur', handler) $('#remove').on('click' , function(e){ $('#target').off('focus blur', handler); console.log(32); }) </ script > |