본문 바로가기

개인공부

이벤트 위임

반응형
<button class="menu-btn" data-value="1">
  <img class="icon" src="../images/1.png" alt="">
  <span class="btn-albel">어몽 1</span>
</button>
<button class="menu-btn" data-value="2">
  <img class="icon" src="../images/2.png" alt="">
  <span class="btn-albel">어몽 2</span>
</button>
<button class="menu-btn" data-value="3">
  <img class="icon" src="../images/3.png" alt="">
  <span class="btn-albel">어몽 3</span>
</button>

이벤트 위임이란 button을 누르면 동작해야 할 때 img , span을 누르게되면 동작이 되지않는 상황에서 부모 노드로 위임을 해서 문제를  해결 할 수 있다.

 

물론 CSS 속성에서 pointer-evnets : none; 을 사용해서 비슷한 효과를 낼 수 있지만. 만약 동적으로 활당받은 노드에 대해서는 css속성을 입히기는 쉽지가 않다.

 

따라서 현재노드가 menu-btn이 아닌경우 부모 노드의 포인터를 따라올라가는 방법으로 구현 할 수 있다.

 

<!DOCTYPE html>
<html lang="en">

<head>
    <style>
        /* .btn-label{
            pointer-events: none;
        }
        .icon{
            pointer-events: none;
        } */
    </style>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div class="menu">

    </div>
    <script>
        const menu = document.querySelector('.menu');
        function clickBtnHandler(e) {
            // console.log(e.target.getAttribute('data-value'));
            let elem = e.target;
            while (!elem.classList.contains('menu-btn')) {
                elem = elem.parentNode;
                if (elem.nodeName == 'BODY') {
                    elem = null;
                    return;
                }
            }
            console.log(elem.dataset.value);
        }
        menu.addEventListener('click', clickBtnHandler);
        window.addEventListener('click', () => {
            const htmlStr = `        <button class="menu-btn" data-value="1">
            <img class="icon" src="../images/1.png" alt="">
            <span class="btn-albel">어몽 1</span>
        </button>
        <button class="menu-btn" data-value="2">
            <img class="icon" src="../images/2.png" alt="">
            <span class="btn-albel">어몽 2</span>
        </button>
        <button class="menu-btn" data-value="3">
            <img class="icon" src="../images/3.png" alt="">
            <span class="btn-albel">어몽 3</span>
        </button>`;
            menu.innerHTML = htmlStr;
        });
    </script>
</body>

</html>
let elem = e.target;
while (!elem.classList.contains('menu-btn')) {
  elem = elem.parentNode;
  if (elem.nodeName == 'BODY') {
 	 elem = null;
  return;
}

위처럼 노드 하나식 접근하는 방법

반응형

'개인공부' 카테고리의 다른 글

CSS : Scroll 사용  (0) 2021.01.01
javascript 클릭리스너 활용  (0) 2021.01.01
CSS : 움직임, 클릭리스너 적용  (2) 2020.12.30
CSS : relative 와 absolute 정복  (0) 2020.12.28
의미론적 태그  (0) 2020.12.21