이번엔 이벤트 버블링을 배워볼껀데
우선 js012.html 파일을 만들고 js010.html의 일부만 가져옵니다.
(캐러셀 return 스크롤이벤트 부분 제외)
Copy <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous">
<link rel="stylesheet" href="main.css">
<script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
</head>
<body>
<div class="black-bg1">
<div class="white-bg">
<h4>로그인하세요</h4>
<form >
<div class="mb-3">
<input type="text" class="form-control" id="email">
<!--<input type="email" class="form-control" id="email1">-->
</div>
<div class="mb-3">
<input type="password" class="form-control" id="password">
</div>
<button type="submit" id="submit" class="btn btn-primary">Submit</button>
<button type="button" class="btn btn-danger" id="close">닫기</button>
</form>
</div>
</div>
<nav class="navbar navbar-light bg-light">
<div class="container-fluid">
<a class="navbar-brand" href="#">Offcanvas navbar</a>
<span class="badge bg-dark ms-auto mx-3">Dark 🌛</span>
<button class="navbar-toggler" type="button">
<span class="navbar-toggler-icon "></span>
</button>
</div>
</nav>
<ul class="list-group" id="list1">
<li class="list-group-item">An item</li>
<li class="list-group-item">A second item</li>
<li class="list-group-item">A third item</li>
<li class="list-group-item">A fourth item</li>
<li class="list-group-item">And a fifth one</li>
</ul>
<button id="loginBtn" type="button" class="btn btn-primary">
버튼
</button>
<script>
$('#loginBtn').on('click', function(){
$('.black-bg1').addClass('show-modal1');
});
$('#close').on('click', function() {
$('.black-bg1').removeClass('show-modal1');
})
$('.navbar-toggler').on('click', function() {
$('.list-group').toggleClass('lg-open');
});
$('form').on('submit', function (e){
console.log(document.getElementById('email').value);
if($('#email').val() === ''){
alert('아이디를 입력하세요');
e.preventDefault(); // 폼 전송 막는 코드
}
var regExp = /^([\w\.\_\-])*[a-zA-Z0-9]+([\w\.\_\-])*([a-zA-Z0-9])+([\w\.\_\-])+@([a-zA-Z0-9]+\.)+[a-zA-Z0-9]{2,8}$/i;
if(!regExp.test($('#email').val())){
alert("이메일 형식을 확인하세요");
e.preventDefault();
}
if($('#password').val() == ''){
alert('패스워드를 입력하세요');
}else if($('#password').val().length <4){
alert('패스워드는 4자 이상이어야 합니다.');
}
});
</script>
</body>
</html>
회색 부분을 클릭 했을 때 모달이 닫히는 걸 만들어보자.
Copy $('.black-bg1').on('click' , function (){
$('.black-bg1').removeClass('show-modal1');
});
이렇게 하면 배경 클릭 시 잘 닫힌다.
🔥 이렇게 하면 버그가 있다. input box나 흰배경을 클릭 해도 닫힌다.
💎이벤트 관련 함수
Copy e.target(); //유저가 실제로 누른거
e.currentTarget(); //이벤트 리스너 달린 곳 $('.black-bg1') 나올듯
console.log(this);
e.preventDefault(); //이벤트 기본동작 막아줌 10번파일에서 잠깐 보고 넘어감
e.stopPropagation(); //내 상위요소로 이벤트 버블링 막아줌
Copy $('.black-bg1').on('click' , function (e){
//1. jQuery
if($(e.target).is($('.black-bg1'))){
$('.black-bg1').removeClass('show-modal1');
}
//2. querySelect
if($(e.target) == document.querySelector('.black-bg1')){
$('.black-bg1').removeClass('show-modal1');
}
});
지난번에 만들었던 탭기능 js011.html 로 돌아와서
Copy for (let i = 0; i< tabBtn.length; i++){
tabBtn.eq(i).on('click', function (){
tabBtn.removeClass('orange');
tabContent.removeClass('show');
tabBtn.eq(i).addClass('orange');
tabContent.eq(i).addClass('show');
})
}
위의 코드는 이벤트 리스너를 3번 반복해서 생성한다.
이걸 다시 줄여보자.
Copy for (let i = 0; i< tabBtn.length; i++){
tabBtn.eq(i).on('click', function (){
tabOpen(i);
})
}
function tabOpen(num){
tabBtn.removeClass('orange');
tabContent.removeClass('show');
tabBtn.eq(num).addClass('orange');
tabContent.eq(num).addClass('show');
}
이렇게 변경 할 수 있다.
이처럼 코드 결과의 변경 없이 구조를 바꾸는 걸 리팩토링이라고 한다.
이렇게 하는 이유는
가독성이 좋다 = 다른사람이 코드를 봐도 이해, 수정이 편하다.
이벤트 버블링에 대해서 알면 이벤트 리스너도 줄일 수 있다.
탭을 만들면서 이벤트 리스너를 3개를 만들었는데
이벤트 버블링을 배우고 나니 하나로도 가능할 것 같다.
버튼의 부모인 ul 에 하나의 이벤트 리스너만 있어도 탭기능을 완성할 수 있다.
이렇게 하는 이유는
버튼이 3개에서 더 늘어난다면 추가도 쉽고 코드도 덜 복잡하다.
이벤트리스너는 램을 차지한다 즉 이벤트리스너를 줄이면 성능도 개선된다.
✨ 과제. 방금 작성한 tapOpen 함수를 사용해서 ul $('list') 에 이벤트 리스너를 만들어보자.
기존의 이벤트 리스너는 주석처리!
밑에 코드 그대로 복붙하거나 따라치면 코드몽키!
직접 고민하고 코드짜서 사람이 되보자.
Copy $('.list').click(function(e){
if (e.target == document.querySelectorAll('.tab-button')[0] ){
tabOpen(0)
}
if (e.target == document.querySelectorAll('.tab-button')[1] ){
tabOpen(1)
}
if (e.target == document.querySelectorAll('.tab-button')[2] ){
tabOpen(2)
}
})