본문 바로가기
Front/JavaScript & jQuery

[JavaScript & JQuery] 동적으로 생성된 요소에 이벤트 바인딩

by 은z 2023. 4. 26.

상황

프로젝트를 진행하다보면,  페이지가 그려지고 난 후에 ajax 등 비동기 방식을 이용하여

동적으로 요소들을 생성, 추가하는 경우가 있다. (innerHTML이나 jQuery의 append()와 같은 방법 등..)

이런 경우에는 이벤트 바인딩이 되지 않는다.

이미 페이지가 로드되면서 작성한 이벤트 코드가 바인딩 된 상태이기 때문이다.

동적으로 추가된 요소에 이벤트를 바인딩해야 한다면 어떻게 해야 작동할까?

이벤트에 걸린 동적요소를 못찾는다는 javascript 에러


적용

 

✔️1. 자바스크립트로 동적 요소 이벤트 바인딩

📌이벤트 버블링을 이용해서 미리 그려져있는 요소에 이벤트를 건다.

 

<html>
  <body>
    <div class="root">
         // 여기에 동적으로 appendChild
    </div>
    <button class="btn" name="btn">동적 추가</btton>
  </body>
</html>





<html>
  <body>
    <div class="root">
      <h2 class="parent">
        <button class="child">
          <span class="new">동적으로 생성!</span>
        </button>
      </h2>
    </div>
    <button class="btn" name="btn">동적 추가</btton>
  </body>
</html>

위 소스를 간단히 설명하면, [동적 추가] 버튼을 클릭 시 root태그 하위에 h2태그로 감싸진 html이 동적으로 생성된다.

이 경우에 class명이 new인 span태그에 클릭이벤트를 걸고 싶다면 어떻게 해야할까?

 

document.querySelector('.root').addEventListener('click', function(e) {
	console.log('성공!');
});

이렇게 이벤트를 걸어주면 span태그 클릭 시 잘 동작된다.

 

왜 root에 이벤트를 걸었는데도 new를 클릭시 동작되는 걸까?

바로 이벤트 버블링 때문이다.

span에서 click 이벤트를 잡지 못하고, button으로 이벤트가 버블링되고

button에서도 잡지 못해 h2로 이벤트가 버블링 되고...

 

이렇게 타고타고 버블링 되어서 root에서 이벤트를 잡아서 실행된다!

 

 

✔️2. 제이쿼리로 동적 요소 이벤트 바인딩

제이쿼리 이벤트 동적 바인딩은 좀 더 간단하다.

$(document).on('click', '.root .new', function(e) {
	// 실행 코드 작성
});

 $(document).on()문법을 사용하고 두번째 인자로 클릭한 요소를 넘겨주면 된다.

댓글