본문 바로가기

Frontend/jQuery

JS jQuery (part. 27) - 이벤트 연결 범위 한정

이벤트를 연결할 때 on( ) 메서드를 사용한다

on( ) 메서드에 넣을 수 있는 매개변수가 엄청 다양하다

selector 매개변수로 이벤트 범위를 한정할 수 있다

이렇게 범위를 한정하는 이벤트 연결 방식을 delegate 방식이라고 한다

 

<body>
    <div id="wrap">
        <h1>Header</h1>
    </div>
</body>

 

$(function () {
  $('h1').on('click', function () {
    var length = $('h1').length;
    var targetHTML = $(this).html();

    $('#wrap').append('<h1>' + length + " - " + targetHTML + "</h1>");
  })
})

 

이렇게 코드를 실행하면 h1 태그가 추가되지만 on( ) 메서드는 현재 존재하는 태그에만 이벤트를 연결하기 때문에 새로 생긴 h1 태그를 클릭하면 이벤트가 발생하지 않는다

 

이러한 경우에는 상위 태그에 이벤트를 연결하고 "h1 태그를 클릭했을 때"를 검출해야 한다

 

$(function () {
  $('#wrap').on('click', 'h1', function () {
    var length = $('h1').length;
    var targetHTML = $(this).html();

    $('#wrap').append('<h1>' + length + " - " + targetHTML + "</h1>");
  })
})

이렇게 코드를 실행하면 새로 생긴 h1태그도 이벤트가 적용된다

이벤트 리스너에서 this 키워드가 #wrap 태그가 아니라 h1 태그라는 것을 주의하자

 

$(function () {
  $('#wrap').on('click', 'h1', function () {
    var length = $('h1').length;
    var targetHTML = $(this).html();

    $('#wrap').append('<h1>' + length + " - " + targetHTML + "</h1>");

    $('#wrap').off('click', 'h1');
  })
})

 

on( ) 메서드의 이벤트 리스너 삭제 off( ) 메서드

 

과거의 이벤트 연결 방식 (jQuery 3.xx 버전부터 모두 제거됨)

  • bind( ) : 현재 존재하는 문서 객체에만 이벤트를 연결한다
  • delegate( ) : 현재 또는 미래에 존재하는 문서 객체에 이벤트를 연결한다
  • live( ) : 현재 또는 미래에 존재하는 문서 객체에 이벤트를 연결한다