고슴맨쉬
망치와 공(空)
고슴맨쉬
  • 분류 전체보기 (155)
    • 💡 UXUI (4)
      • UXUI (2)
      • UI (2)
      • UX (0)
    • 🟨 JavaScript (66)
      • 개념 (42)
      • 정리 (2)
      • 문제풀기 (프로그래머스, 코딩애플) (15)
      • 응용하여 자동화or문제해결하기 (2)
      • 기타 (5)
    • ⚛️ React (49)
      • 개념 (27)
      • 개념(Redux) (3)
      • 정리 (4)
      • 문제풀기 (코딩애플: React) (15)
    • 📘 TypeScript (10)
      • 개념 (8)
      • 문제풀기 (코딩애플) (2)
    • 🌐 HTML,CSS (18)
      • 실무에서 자주 발생한 오류들 (10)
      • 뒤늦게 알아서 뼈아픈 유용한 CSS (6)
      • 기타 자주 쓰는 CSS (2)
    • 💻 CS (8)
      • CS (5)
      • 정규표현식 (2)
      • Git,Github (1)

태그

  • useEffect
  • 오류
  • array
  • react
  • redux
  • 코딩애플
  • Ajax
  • axios
  • CSS
  • Props
  • TypeScript
  • CS
  • UXUI
  • json
  • state
  • 삼항연산자
  • JavaScript
  • class
  • object
  • 프로그래머스
전체 방문자
오늘
어제
hELLO · Designed By 정상우.
고슴맨쉬

망치와 공(空)

🟨 JavaScript/문제풀기 (프로그래머스, 코딩애플)

[중요] Level 2 : 14,15(숙제 및 깨달은 점)_for, 버블링활용축약버전

2023. 1. 13. 00:32

14. 탭 만들기

let kcnt = 0;
for (let i = 0; i < $('.tab-button').length; i++) {
    alert(kcnt++);
    $('.tab-button').eq(i).on('click', function () {
        $('.tab-button').removeClass('orange');
        $('.tab-button').eq(i).addClass('orange');
        $('.tab-content').removeClass('show');
        $('.tab-content').eq(i).addClass('show');
    })
}

깨달은 점

for문의 작동 원리에 대해서 이해가 잘 가지 않았다.

i가 0이고, 3까지 i++로 돌아가는 거면 i에는 순서대로 0,1,2 배정되는 것 아닌가?
왜 클릭한 탭의 인덱스를 찾아서 그 인덱스에 함수가 실행되는거지?

처음에는 eq가 메소드라서 내가 누른 탭의 인덱스를 찾아주나 했다.

그런데 전역변수 kcnt 를 설정해 alert를 뿌리고 나니, kcnt alert가 브라우저를 새로고침한 순간에 0,1,2까지 돌고 그 후엔 탭을 클릭해도 alert가 뜨지 않는 것이었다!

답은 js가 정적 언어이기 때문이었다.

내가 클릭을 했을 때 -> for문이 만들어져 도는 게 아니라, 브라우저가 로딩된 시점에서 -> 이미 i가 length까지 돌아서 -> for문 안의 이벤트리스너 함수 안의 i에 값이 0~2까지 뿌려져있고, 그게 클릭한 시점에 콜백함수로 불러와져 실행되는 것이었다.

for문의 작동원리에 대해 확실하게 짚고 넘어간 보람찬 순간이었다.


함수축약버전

for (let i = 0; i < $('.tab-button').length; i++) {
    $('.tab-button').eq(i).on('click', function () {
        openTab(i);
    })
    // $('.tab-button').eq(i).on('click', openTab(i)) //이렇게 해도 됨.
}

function openTab(i){
    $('.tab-button').removeClass('orange');
    $('.tab-button').eq(i).addClass('orange');
    $('.tab-content').removeClass('show');
    $('.tab-content').eq(i).addClass('show');
}

이벤트버블링활용버전

function openTab(i){
    $('.tab-button').removeClass('orange');
    $('.tab-button').eq(i).addClass('orange');
    $('.tab-content').removeClass('show');
    $('.tab-content').eq(i).addClass('show');
}

//버블링이 일어나는 for문버전 1
$('.list').click(function(e){
    for (let i = 0; i < $('.tab-button').length; i++) {
        if(e.target == document.querySelectorAll('.tab-button')[i]){
            openTab(i);
        } else {e.preventDefault;}
    }
})
//위와 똑같이 동작하는 버블링이 일어나는 for문버전 2
for (let i = 0; i < $('.tab-button').length; i++) {
    $('.list').click(function(e){
        if(e.target == document.querySelectorAll('.tab-button')[i]){
            openTab(i);
        } else {e.preventDefault;}
    })
}
//*****dataset 활용 버전 (<---너무편하고)******
$('.list').click(function(e){
    openTab(e.target.dataset.id);
})

마지막 dataset 활용 버전이 참으로 짧고 편한 게 맘에 든다.
+ 포문버전이 이벤트안에 포문을넣든 포문안에 이벤트를 넣든 동일하게 동작했다..


15. 모달창 검은배경 누르면 꺼지기

조건

흰색 모달창부분은 눌러도 꺼지지 않게 한다

let btn = document.querySelector('.btn-primary');
let modal = document.querySelector('.black-bg');
let clickEvent = function(e){
    if (e.target == this){ //this는 e.currentTarget으로도 쓸 수 있다.
        modal.classList.toggle('show');
    } else {e.preventDefault();}
}
btn.addEventListener('click', clickEvent)
modal.addEventListener('click', clickEvent)

깨달은 점

이벤트 버블링은 요소에 이벤트가 실행되었을 때 그 요소의 상위요소까지 이벤트가 실행되는 것이다. 이벤트 버블링은 항상 일어나고, 다양한 관련 함수를 사용하면 좋다.

이에 관해 정리한 글 : https://sunshineyellow.tistory.com/92

 

[코딩애플,mdn 등] 이벤트버블링과 이벤트캡쳐링 및 관련 유용한 함수들

이벤트가 DOM트리를 타고 발생하는 흐름 이벤트는 document에서 시작해 DOM 트리를 따라 event.target까지 내려간다. 이벤트는 트리를 따라 내려가면서 addEventListener(..., true)로 할당한 핸들러를 동작시

sunshineyellow.tistory.com


출처 : 코딩애플 https://codingapple.com/

저작자표시 비영리 동일조건 (새창열림)

'🟨 JavaScript > 문제풀기 (프로그래머스, 코딩애플)' 카테고리의 다른 글

Level 3 : 4 (array, object, forEach)  (0) 2023.01.31
Level 3 : 1~3 (array, object)  (0) 2023.01.31
Level 2 : 6~13(숙제 및 깨달은 점)_scroll  (0) 2023.01.12
Level 2 : 1~5 (숙제 및 깨달은 점)_if문  (0) 2023.01.09
Level 1 : 6~12 (숙제 및 깨달은 점)  (0) 2023.01.08
    '🟨 JavaScript/문제풀기 (프로그래머스, 코딩애플)' 카테고리의 다른 글
    • Level 3 : 4 (array, object, forEach)
    • Level 3 : 1~3 (array, object)
    • Level 2 : 6~13(숙제 및 깨달은 점)_scroll
    • Level 2 : 1~5 (숙제 및 깨달은 점)_if문
    고슴맨쉬
    고슴맨쉬
    부수되 집착하지 않고, 이해하되 머무르지 않기

    티스토리툴바