[DAY - 35] 버블링 / 캡쳐링, preventDefault, node, 요소, 요소 생성 / 이동

2023. 4. 20. 21:49·🔥 부트캠프-웹 개발 🔥/JavaScript
  • 버블링 / 캡쳐링
  • preventDefault
  • node
  • 요소
  • 요소 생성 / 이동

 
 

1) 버블링 / 캡쳐링

 
이벤트 캡처링 : 상위에서 하위로 이벤트 전파
이벤트 버블링 : 하위에서 상위로 이벤트 전파
 

    <script>
        'use strict';
        let box = document.querySelectorAll('.box');
        let output = document.querySelector('.output');
        let txt = '';

        const make=(e)=>{
            txt += `<p>${e.currentTarget.dataset.name}</p>`;
            output.innerHTML=txt;
        }

        box.forEach(item=>{
            item.addEventListener('click', make);
        })        
    </script>

버블링

 
하위에서 상위로 이벤트가 전파되므로 셋 box를 클릭하면 셋-둘-하나가 출력이 된다.
 

    <script>
        'use strict';
        let box = document.querySelectorAll('.box');
        let output = document.querySelector('.output');
        let txt = '';

        const make=(e)=>{
            txt += `<p>${e.currentTarget.dataset.name}</p>`;
            output.innerHTML=txt;
        }

        box.forEach(item=>{
            item.addEventListener('click', make, true);
        })        
    </script>

캡처링

 
반대로 상위에서 하위로 이벤트가 전파되어 하나-둘-셋이 출력되었다.
 
 
 

2) preventDefault

 
링크가 걸린 이벤트를 취소할 때 사용한다.
 

<body>
    <p><a href="http://www.google.com">구글</a></p>
    <p><a href="http://www.naver.com">네이버</a></p>
    <p><a href="http://www.nate.com">네이트</a></p>
    <script>
        'use strict';
        let link = document.querySelectorAll('a');
        link.forEach(item =>{
            item.addEventListener('click',e=>{
                e.preventDefault();
            })
        })
    </script>
</body>

 
이렇게 맨 위에 preventDefault를 넣으면 a 링크를 눌러도 이벤트가 생성되지 않는다.
여러 링크를 막아야 할 땐 두 가지 방법을 사용한다.
 

        <a href="javascript:void(0)"></a>
        let link = document.querySelectorAll('a[href="#"]');
        link.forEach(item => {
            item.addEventListener('click', e=>{
                e.preventDefault();
            })
        });

 
 

3) node

 
과거에 썼던 방법이며, 요즘은 쓰지 않는다. 

childNodes : 자식 노드들(유사배열)
firstChild : 기준 노드의 첫 번째 자식
lastChild : 기준 노드의 마지막 자식
nextSibling : 다음 형제 노드
previousSibling : 이전 형제 노드
parentNode : 부모 노드
nodeType : 노드 유형(요소 : 1, 텍스트 : 3, document : 9)
nodeValue : 값
 

    <script>
        'use strict';
        let list = document.querySelector('.list');
        let li = document.querySelectorAll('.list li');
        let p = document.querySelector('p');

        // console.log(list.childNodes)

        let a1 = list.firstChild;
        let a2 = list.lastChild;
        let a3 = list.parentNode;
        let a4 = li[0].nextSibling.nextSibling;
        a4.style.backgroundColor = 'tan'
        let a5 = li[2].nextSibling.nextSibling.nextSibling.nextSibling;
        // li-enter-li-enter-li
        a5.style.backgroundColor = 'pink'
        let a6 = li[6].previousSibling.previousSibling;
        a6.style.backgroundColor = 'orange'
        console.log(a4);

        li[0].innerHTML = `0/ ${a1}`;
        // li로 인식을 안하고 enter로 인식
        li[1].innerHTML = `1/ ${a2}`;
        // lastChild는 마지막 enter
        li[2].innerHTML = `2/ ${a3}`;
        // parentNode는 list의 부모인 div.box
        li[3].innerHTML = `3/ ${a4}`;
        li[4].innerHTML = `4/ `;
        li[5].innerHTML = `5/ `;
        li[6].innerHTML = `6/ `;
        li[7].innerHTML = `7/ `;
        li[8].innerHTML = `8/ `;
        li[9].innerHTML = `9/ `;
    </script>

 

노드

 
노드는 enter도 인식을 한다. 따라서 li[0]은 첫 번째 li가 아니라 enter가 되는 것이다.
 
 

4) 요소

 
childern : 자식 요소
firstElementChild : 첫 번째 요소
lastElementChild : 마지막 요소
nextElementSibling : 다음 형제 요소
previousElementSibling : 이전 형제 요소
parentElement : 부모 요소
 

    <script>
        'use strict';
        let list = document.querySelector('.list');
        let li = document.querySelectorAll('.list li');
        let p = document.querySelector('p');

        let a1 = list.firstElementChild;

        a1.style.backgroundColor = 'tan';

        let a2 = list.lastElementChild;
        a2.style.backgroundColor = 'pink';

        let a3 = list.parentElement;

        let a4 = list.children;
        let a5 = list.children[2];
        a5.style.backgroundColor = 'orange'

        let a6 = li[2].nextElementSibling;
        a6.style.backgroundColor = 'skyblue';
        a6.nextElementSibling
        .nextElementSibling
        .nextElementSibling.style.backgroundColor = 'gold';
    </script>

요소

 
Element는 요소만 취급하기 때문에 li[n]처럼 쓸 수 있다.
 
 

5) 요소 생성 / 이동

 
노드(과거 사용했던 방식)
appendChild() : 부모 요소의 맨 뒤에 추가(생성) / 이동
부모.appendChild(자식) : 요소가 존재하면 이동
부모.appendChild(자식) : 요소 생성 후 부모 맨 뒤에 추가
removeChild() : 삭제(메모리에 존재, 완벽한 삭제 아님)
replaceChild(변경 후, 변경 전) : 변경
insertBefore() : 맨 앞으로 이동
 
append() : 부모 요소 맨 뒤에 추가(생성) / 이동
부모.append(자식) : 요소가 존재하면 이동
부모.append(자식) : 요소 생성 후 부모 맨 뒤에 추가
append(요소)
append('텍스트')
append(요소, 요소, '텍스트')
prepend() : 부모 요소 맨 앞에 추가(생성) / 이동
부모.prepend(자식)
remove() : 삭제(메모리에서도 삭제)

'🔥 부트캠프-웹 개발 🔥/JavaScript' 카테고리의 다른 글
  • [DAY - 38] select, multiple, checkbox, radio, append, point-events
  • [DAY - 36] cloneNode, querySelector, 이벤트 연결 / 해제, form input txt value / checkbox / select
  • [DAY - 34] export / import, 예제
  • [DAY - 32] mouse 이벤트, 상태변수, getComputedStyle, key 이벤트, 게임
Yeonhub
Yeonhub
✨ https://github.com/yeonhub 📧 lsy3237@gmail.com
  • Yeonhub
    비 전공자의 Be developer
    Yeonhub
  • 전체
    오늘
    어제
    • 전체보기 (169)
      • 🔍 Tech 🔍 (19)
        • Front-End (11)
        • Back-End (4)
        • AI (1)
        • Server (1)
        • Etc (2)
      • 💡 원티드 프리온보딩 챌린지 💡 (14)
        • PRE-ONBOARDING_AI (11월) (1)
        • PRE-ONBOARDING_FE (2월) (2)
        • PRE-ONBOARDING_FE (1월) (2)
        • PRE-ONBOARDING_FE (12월) (9)
      • 🔥 부트캠프-웹 개발 🔥 (118)
        • HTML5 (7)
        • CSS3 (21)
        • JavaScript (27)
        • JavaScript_advanced (9)
        • React (24)
        • Next (1)
        • MYSql (5)
        • Node (5)
        • 오늘하날(개인프로젝트) (12)
        • 이젠제주투어(팀프로젝트) (7)
      • 💻 CS 💻 (1)
        • 알고리즘 (1)
      • ⚡ 코딩테스트 ⚡ (11)
        • JavaScript (11)
      • 📚 Books 📚 (6)
        • 클린 아키텍처 (2)
        • 인사이드 자바스크립트 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    react native expo fcm
    expo 길찾기
    node crontab
    expo map
    rn admob
    expo 지도
    react native bottom sheet
    expo deep linking
    node fcm
    node.js fcm
    node cron
    rn bottom sheet
    expo fcm push
    expo fcm
    라스콘4
    expo admob
    react vite
    expo node fcm
    react native admob
    javascript fcm
    python node
    프론트엔드 테스트코드
    bottom sheet
    react native analytics
    Node
    react native firebase analytics
    컴파운드 컴포넌트 패턴
    라스콘
    expo google map
    php node
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Yeonhub
[DAY - 35] 버블링 / 캡쳐링, preventDefault, node, 요소, 요소 생성 / 이동
상단으로

티스토리툴바