본문 바로가기
프로그래밍/jQuery

jQuery API 정복 - delegate(), 이벤트 바인딩하기

by zoo10 2011. 12. 8.

.delegate()

원문 링크 http://api.jquery.com/delegate/

.delegate( selector, eventType, handler )Returns : jQuery

개요 : 루트 요소의 특정 집합을 기반으로, 지금 또는 나중에, 선택과 일치하는 모든 요소에 대해 하나 이상의 이벤트 처리기를 묶어줍니다.

  • .delegate( selector, eventType, handler )
  • selector 이벤트를 발생할 요소를 걸러낼 선택자.
  • eventType 공백으로 구분된 하나 이상의 JavaScript 이벤트를 포함하는 문자열, "click", "keydown" 또는 사용자 정의 함수명.
  • handler 이벤트가 발생할 때 실행될 함수.
  • .delegate( selector, eventType, eventData, handler )
  • selector 이벤트를 발생할 요소를 걸러낼 선택자.
  • eventType 공백으로 구분된 하나 이상의 JavaScript 이벤트를 포함하는 문자열, "click", "keydown" 또는 사용자 정의 함수명.
  • eventData 이벤트 핸들러에 전달할 데이터 집합.
  • handler 이벤트가 발생할 때 실행될 함수.
  • .delegate( selector, events )
  • selector 이벤트를 발생할 요소를 걸러낼 선택자.
  • events 하나 이상의 이벤트와 이벤트에서 실행될 함수.

jQuery 1.7 에서, .delegate().on() 함수가 대체하게 되었습니다. 하지만, 이전 버전에서는 delegation이 이벤트를 사용하는 가장 유용한 방법이었습니다.. 더 많은 정보를 원하시면 .on() 함수를 참고하시기 바랍니다. 아래는 두 함수의 일반적인 사용법입니다.

$(elements).delegate(selector, events, data, handler);  // jQuery 1.4.3+
$(elements).on(events, selector, data, handler);        // jQuery 1.7+
 

.delegate() 코드를 더 살펴보면 :

$("table").delegate("td", "click", function() {
  $(this).toggleClass("chosen");
});

위 구문을 .on() 함수로 바꿔본다면 :

$("table").on("click", "td", function() {
  $(this).toggleClass("chosen");
});

delegate() 함수로 바인딩 된 이벤트를 제거하려면 .undelegate() 함수를 참고하세요.

예 제  
문단(p)를 클릭하면 문단을 하나 추가하기.

<!DOCTYPE html>
<html>
<head>
  <style>
  p { background:yellow; font-weight:bold; cursor:pointer; 
      padding:5px; }
  p.over { background: #ccc; }
  span { color:red; }
  </style>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
  <p>Click me!</p>

  <span></span>
<script>
    $("body").delegate("p", "click", function(){
      $(this).after("<p>Another paragraph!</p>");
    });
</script>

</body>
</html>

미리보기

delegate() 함수는 새로 추가된 p에도 자동적용되네요. 새로 만들어진 애들 클릭해도 또 추가되요. 왜 그럴까요. delegate('p'....)에서 p에 click 이벤트를 적용하니 그런것 같습니다.

 

예 제
p를 클릭하면 안에 있는 텍스트를 알림창으로 보여주기

$("body").delegate("p", "click", function(){
  alert( $(this).text() );
});

예 제
a 태그를 클릭하면 링크 이동을 취소시키기

$("body").delegate("a", "click", function() { return false; })

예 제
preventDefault 함수를 사용해서 기본 이벤트를 취소시키기

$("body").delegate("a", "click", function(event){
  event.preventDefault();
});

예 제  
사용자 정의 함수 바인딩하기

<!DOCTYPE html>
<html>
<head>
  <style>
  p { color:red; }
  span { color:blue; }
  </style>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
  <p>Has an attached custom event.</p>
  <button>Trigger custom event</button>
  <span style="display:none;"></span>
<script>

    $("body").delegate("p", "myCustomEvent", function(e, myName, myValue){
      $(this).text("Hi there!");
      $("span").stop().css("opacity", 1)
               .text("myName = " + myName)
               .fadeIn(30).fadeOut(1000);
    });
    $("button").click(function () {
      $("p").trigger("myCustomEvent");
    });

</script>

</body>
</html>

미리보기

위의 예제들하고는 좀 다르네요. 일단 p와 연결된 이벤트 함수가 myCustomEvent로 사용자 정의 함수죠. 버튼을 클릭하면 trigger(방아쇠를 당긴다는 의미입니다.)로 사용자정의함수를 실행시키고 있습니다. 'Hi, there!' 문자가 바뀌고 페이드 아웃 하는 기능을 수행하도록 되어 있습니다. $(this)는 p가 되겠죠. 이해되시죠??

 

바인딩을 하는 여러가지 방법이 있네요. 그 중 편한 방법을 사용하심 될것 같습니다. 최신인 1.7버젼에서 추가된 on(), off()를 써보시면 어떨까요.

그럼 즐프하세요.

※ 본 예제는 http://www.jquery.com 에 있는 내용임을 밝힙니다.