자바스크립트 (JavaScript) 기초
이벤트버블링(Event Bubbling) 응용 및 Dataset 속성 이용
- 이벤트버블링이란
- 한 요소에 이벤트가 발생하면 이 요소에 할당된 핸들러가 동작하고, 이어서 부모 요소의 핸들러가 동작하고 최상단의 부모 요소를 만날 때까지 반복되면서 핸들러가 동작하는 현상을 말합니다.
- Dataset이란
사용자가 해당 요소에 커스텀 속성을 추가한 객체를 의미합니다.
- 탭 버튼을 이용하여 두 가지의 예를 보여드리겠습니다.
<-- -------------------html 코드-------------------- -->
<!document html>
<html lang="en">
<head>
<!--Required meta tags-->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--Bootstrap CSS-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link href="main.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<title>deepeventlistener</title>
</head>
<body>
<div class="container mt-5">
<ul class="list">
<-- li태그에 data를 입력하여 js에서 사용할 수 있게 했습니다. -->
<-- dataset 준비 -->
<li class="tab-button" data-id="0">Products</li>
<li class="tab-button orange" data-id="1">Information</li>
<li class="tab-button" data-id="2">Shipping</li>
<li class="tab-button" data-id="3">Shopping</li>
</ul>
<div class="tab-content">
<p>상품설명입니다. Product</p>
</div>
<div class="tab-content show">
<p>스펙설명입니다. Information</p>
</div>
<div class="tab-content">
<p>배송정보입니다. Shipping</p>
</div>
<div class="tab-content">
<p>상품목록입니다. Shopping</p>
</div>
</div>
<script src="deepeventlistenerjs.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
</body>
</html>
// ----------------------js 코드-------------------------
var tab = $('.tab-button');
var content = $('.tab-content');
// 클래스명에 dataset 이용하기
// 내가 지정한 dataset의 아이디가 클릭되면
// 그 값을 내가만든 함수에 입력될 수 있게 코드 작성
$('.list').click(function(e) {
tabChange(e.target.dataset.id);
});
// for문을 사용하지 않고 버블링 응용하는 방법
// 내가 tab-button을 클릭하면 이벤트 버블링에 의해 list도 클릭한 것이 되기 때문에
// list클래스를 가져와 click 이벤트를 사용하여 for문을 사용하지 않고
// 탭버튼을 구현해 봤습니다.
// $('.list').click(function(e) {
// if (e.target == document.querySelectorAll('.tab-button')[0]) {
// tabChange(0);
// }
// if (e.target == document.querySelectorAll('.tab-button')[1]) {
// tabChange(1);
// }
// if (e.target == document.querySelectorAll('.tab-button')[2]) {
// tabChange(2);
// }
// if (e.target == document.querySelectorAll('.tab-button')[3]) {
// tabChange(3);
// }
// });
function tabChange(i) {
tab.removeClass('orange');
tab.eq(i).addClass('orange');
content.removeClass('show');
content.eq(i).addClass('show');
}
Array & Object & Data Binding
- 배열 (array)이란
- 자바스크립트에서 배열은 이름과 인덱스로 참조되는 정렬된 값의 집합으로 정의됩니다.
배열을 구성하는 각각의 값을 배열 요소(element)라고 하며, 배열에서의 위치를 가리키는 숫자를 인덱스(index)라고 합니다.
- 배열의 특징으로
- 배열 요소의 타입이 고정되어 있지 않으므로, 같은 배열에 있는 배열 요소끼리의 타입이 서로 다를 수도 있습니다.
- 배열 요소의 인덱스가 연속적이지 않아도 되며, 따라서 특정 배열 요소가 비어 있을 수도 있습니다.
- 자바스크립트에서 배열은 Array 객체로 다뤄집니다.
- 배열 선언 방법
var arr = [배열요소1, 배열요소2,...]; // 배열 리터럴을 이용하는 방법
var arr = Array(배열요소1, 배열요소2,...); // Array 객체의 생성자를 이용하는 방법
var arr = new Array(배열요소1, 배열요소2,...); // new 연산자를 이용한 Array 객체 생성 방법
- 객체(Object)란
- 객체란 여러 속성을 하나의 변수에 저장할 수 있도록 해주는 데이터 타입으로 이름(key, name)과 값(value)으로 구성된 프로퍼티의 집합입니다.
- 자바스크립트에서는 원시타입(Primitive Type)을 제외한 모든 것이 객체(Object)로 정의됩니다.
// 객체명을 정하고 중괄호 안에 key : value 형태로 작성합니다.
// 여러가지 데이터를 넣을 때에는 ,로 구분하면 됩니다.
const obj = {
key : value,
key : value
}
// new 키워드를 사용하여 Object 생성자 함수를 호출하고
// 객체명 = new Object(); 이렇게 작성하고
// 객체명.key = value; 이렇게 대입하면 됩니다.
let obj = new Object();
obj.key = value;
- Data Binding이란
- HTML에 데이터를 보내는 것을 데이터 바인딩이라고 합니다.
- array, object와 Data Binding을 사용한 예시를 간단한 코드로 보여드리겠습니다.
<!document html>
<html lang="en">
<head>
<!--Required meta tags-->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--Bootstrap CSS-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link href="main.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<title>Array_Object</title>
</head>
<body>
<div class="container mt-3">
<div class="card p-3">
<span class="car-title">상품명</span>
<span class="car-price">가격</span>
</div>
</div>
<script>
var car = {name : '프라이드', price : 7000000};
document.querySelector('.car-title').innerHTML = car['name'];
document.querySelector('.car-price').innerHTML = car['price'];
// 위 코드 변수 삽입 가능
// document.querySelector('.car-title').innerHTML = car.name;
// document.querySelector('.car-price').innerHTML = car.price;
// 위 코드 변수 삽입 불가
// var car2 = {name : '소나타', price : 50000};
// console.log(car2['name']);
// car2.price = 60000;
// console.log(car2['price']);
// var car = {key:value, key:value 등등}
// object 자료형 key : value 형태의 자료형
// var car = [
// '소나타',
// 50000,
// 'white'
// ];
// car[3] = '아반떼'; car 배열에 추가됨
// console.log(car);
// var car = [자료1, 자료2, 자료3 등등]; Array 자료형
// var car = '소나타 50000 white';
// var car = '소나타';
// var carPrice = 50000;
// var carColor = 'white';
</script>
</body>
</html>
- 위 코드는 Array와 Object 사용 밑 코드는 Data Binding 예시입니다.
<div class="container mt-3">
<div class="card p-3">
<span class="car-title">상품명</span>
<span class="car-price">가격</span>
</div>
</div>
<script>
var car = {name : '프라이드', price : [50000, 300000, 7000000]};
document.querySelector('.car-title').innerHTML = car['name'];
document.querySelector('.car-price').innerHTML = car.price[1];
console.log(car['name']);
console.log(car['price']);
console.log(car.price[2]);
</script>
select 태그
- select태그란
- 옵션 메뉴를 제공하는 드롭다운 리스트를 정의할 때 사용합니다.
- <select>요소 내부의 <option> 요소는 드롭다운 리스트에서 사용되는 각각의 옵션을 정의합니다.
이러한 <select> 요소는 사용자로부터 입력을 받기 위한 폼(form)에 사용될 수 있습니다.
- select 태그를 이용한 상품 주문할 때 볼 수 있는 간단한 드롭다운 리스트를 만들어 보겠습니다.
<!document html>
<html lang="en">
<head>
<!--Required meta tags-->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--Bootstrap CSS-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link href="main.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<title>Array_Object</title>
</head>
<body>
<form class="container my-5 form-group">
<p>상품선택</p>
<select class="form-select mt-2">
<option class="cap">모자</option>
<option class="shirt">셔츠</option>
</select>
<select class="form-select mt-2 form-hide" >
<option>100</option>
<option>95</option>
<option>90</option>
</select>
</form>
<script>
$('.form-select').eq(0).on('input', function(e) {
var value = e.currentTarget.value;
if (value == '셔츠') {
$('.form-select').eq(1).removeClass('form-hide');
} else {
$('.form-select').eq(1).addClass('form-hide');
}
});
// $('.form-select').eq(0).on('input', function() {
// var value = $('.form-select').eq(0).val();
// if (value == '셔츠') {
// $('.form-select').eq(1).removeClass('form-hide');
// } else {
// $('.form-select').eq(1).addClass('form-hide');
// }
// });
// $('.form-select').eq(0).on('click', function() {
// $('.form-hide').removeClass('.form-hide');
// });
</script>
</body>
</html>
JS에서 HTML 문법 사용
- 자바스크립트를 이용하여 HTML 문법을 사용할 수 있습니다.
- 변수명을 정하고 그 변수에 HTML 태그를 사용하면 됩니다.
- 밑에는 예시 코드입니다.
<!doctype html>
<html lang="ko">
<head>
<meta charset = utf-8">
<title>jsInnerHTML</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link href="main.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
</head>
<body>
<div id="test">
</div>
<script>
var template = '<p>Hello</p>';
$('#test').append(template);
// var template = '<p>Hello</p>';
// document.querySelector('#test').insertAdjacentHTML('beforeend', template);
// var inHTML = document.createElement('p');
// inHTML.innerHTML = 'Hello';
// document.querySelector('#test').appendChild(inHTML);
</script>
</body>
</html>
forEach & forIn
- forEach()란
- forEach() 함수는 배열을 순회하여 처리하는데 사용되는 메소드로, 배열의 각 요소에 대해 주어집 함수를 순서대로 한 번씩 실행합니다.
- forEach() 함수를 사용하면 반복문을 통해 배열의 요소에 접근하지 않고도, 간편하게 배열 요소들을 처리할 수 있습니다. 각 요소의 값뿐만 아니라 인덱스와 배열 자체도 콜백 함수에서 사용할 수 있습니다.
- 작성방법
const arr = ['a', 'b', 'c'];
// function 사용
arr.forEach(function(element) {
console.log(element);
});
// arrow function
arr.forEach((element) => {
console.log(element)
});
- for...In이란
- 객체(Object)의 모든 열거할 수 있는 프로퍼티를 순회 할 수 있도록 도와줍니다.
- for..in 반복문은 모든 객체에서 사용이 가능합니다.
- 또한 객체의 key 값에 접근이 가능하고, value 값에는 직접 접근이 불가능합니다.
- 작성방법
// for (const 반복변수 in 배열 or 객체) {
// 실행문
// }
let 변수 = {
key1 : value1,
key2 : "value2",
key3 : value3,
};
// 배열 요소 하나하나 꺼내서 특정 문장을 실행할 때
const 변수 = ["1", "2", "3"];
for (const i in 변수) {
console.log(`${i}번째 : ${변수[i]}`);
}
- forEach와 for ... in 반복문 예시
<!document html>
<html lang="en">
<head>
<!--Required meta tags-->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--Bootstrap CSS-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<link href="main.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script>
<title>jsInnerHTML</title>
</head>
<body>
<form class="container my-5 form-group">
<p>상품선택</p>
<select class="form-select mt-2">
<option class="cap">모자</option>
<option class="shirt">셔츠</option>
<option class="shirt">바지</option>
</select>
<select class="form-select mt-2 form-hide" >
<option>100</option>
<option>95</option>
<option>90</option>
</select>
</form>
<script>
var pants = [28,30,32,34];
var shuirt = [90, 95];
$('.form-select').eq(0).on('input', function(e) {
var value = e.currentTarget.value;
if (value == '셔츠') {
$('.form-select').eq(1).removeClass('form-hide');
} else if (value == '바지') {
$('.form-select').eq(1).removeClass('form-hide');
$('.form-select').eq(1).html('');
pants.forEach(function(e) {
$('.form-select').eq(1).append(`<option>${e}</option>`);
});
// arrow function
// pants.forEach((e) => {
// $('.form-select').eq(1).append(`<option>${e}</option>`);
// });
} else {
$('.form-select').eq(1).addClass('form-hide');
}
});
var obj = {name : 'nam', age : 20}
for (var key in obj) {
console.log(1);
console.log(key);
console.log(obj[key]);
}
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
</body>
</html>
공통 css
- 위에 있는 실습 코드에서 공통으로 사용하는 css 입니다.
:root {
scroll-behavior: auto;
}
/* root는 bootstrap을 사용할 시
css를 원상복구하여
내가원하는 css를 사용할 수 있게 할 때 사용 */
.alert-box {
background-color: skyblue;
padding: 20px;
color: white;
border-radius: 5px;
display: none;
}
.list-group {
display: none;
}
.black-bg {
width : 100%;
height : 100%;
position : fixed;
background : rgba(0,0,0,0.5);
z-index : 6;
padding: 30px;
visibility: hidden;
opacity: 0;
transition: all 1s;
}
.show {
display: block;
}
.white-bg {
background: white;
border-radius: 5px;
padding: 30px;
}
.show-modal {
visibility: visible;
opacity: 1;
}
.close-modal {
visibility: visible;
opacity: 0;
}
.main-bg {
padding: 50px 20px;
background: lightgrey;
}
.dark {
background-color: black;
color: white;
}
.slide-container {
width: 300vw;
transition: all 1s;
}
.slide-box {
width: 100vw;
float: left;
}
.slide-box img {
width: 100%;
}
.navbar {
/* position: fixed; */
width: 100%;
z-index: 5;
transition: all 0.5s;
}
.navbar-brand {
font-size: 25px;
/* transition: all 0.5s; */
}
.lorem {
width: 200px;
height: 100px;
overflow-y: scroll;
}
ul.list {
list-style-type: none;
margin: 0;
padding: 0;
border-bottom: 1px solid #ccc;
}
ul.list::after {
content: '';
display: block;
clear: both;
}
.tab-button {
display: block;
padding: 10px 20px 10px 20px;
float: left;
margin-right: -1px;
margin-bottom: -1px;
color: grey;
text-decoration: none;
cursor: pointer;
}
.orange {
border-top: 2px solid orange;
border-right: 1px solid #ccc;
border-bottom: 1px solid white;
border-left: 1px solid #ccc;
color: black;
margin-top: -2px;
}
.tab-content {
display: none;
padding: 10px;
}
.show {
display: block;
}
.form-hide {
display: none;
}
.grey {
background: lightgrey;
height: 2000px;
margin-top: 300px;
}
.text {
float: left;
width : 400px;
}
.image {
float: right;
width : 400px;
position: sticky;
top: 100px;
}
.card-background {
height: 3000px;
margin-top: 800px;
margin-bottom: 1600px;
}
.card-box img {
display: block;
margin: auto;
max-width: 80%;
}
.card-box {
position: sticky;
top: 300px;
margin-top: 200px;
}