06-1. ์ด๋ฒคํธ ์์๋ณด๊ธฐ
์ด๋ฒคํธ๋
- ์ด๋ฒคํธ: ์น ๋ธ๋ผ์ฐ์ ๋ ์ฌ์ฉ์๊ฐ ์คํํ๋ ์ด๋ค ๋์
- ex) ์น ๋ฌธ์์์ ํค๋ณด๋์ ํค๋ฅผ ๋๋ฅด๋ ๊ฒ, ์น ๋ธ๋ผ์ฐ์ ์ฐฝ์ ์น ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๋ ๊ฒ
- ์ด๋ฒคํธ๋ ์น ๋ฌธ์ ์์ญ์์ ์ด๋ฃจ์ด์ง๋ ๋์๋ง ๋งํจ(ex. ์น ํ์ด์ง ์ฝ์ด ์ค๊ธฐ, ๋งํฌ ํด๋ฆญํ๊ธฐ)
(์น ๋ธ๋ผ์ฐ์ ์ฐฝ ๋งจ ์ ์ ๋ชฉ ํ์์ค์ ํด๋ฆญํ๋ ๊ฒ์ ์ด๋ฒคํธ๊ฐ ์๋(์์ญ ๋ฒ์ด๋ฌ์ผ๋ฏ๋ก))
๋ฌธ์ ๋ก๋ฉ ์ด๋ฒคํธ
- ์๋ฒ์์ ์น ๋ฌธ์๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์์๋๋ก ์คํฌ๋กคํ๋ ๋ฑ ์น ๋ฌธ์๋ฅผ ์น ๋ธ๋ผ์ฐ์ ์ฐฝ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ์ด๋ฒคํธ
์ด๋ฒคํธ | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ์๊ฐ |
abort | ์น ๋ฌธ์๊ฐ ์์ ํ ๋ก๋ฉ๋๊ธฐ ์ ์ ๋ถ๋ฌ์ค๊ธฐ๋ฅผ ๋ฉ์ถ์์ ๋ |
error | ๋ฌธ์๊ฐ ์ ํํ ๋ก๋ฉ๋์ง ์์์ ๋ |
load | ๋ฌธ์๊ฐ ๋ก๋ฉ์ด ๋๋ฌ์ ๋ |
resize | ๋ฌธ์ ํ๋ฉด์ ํฌ๊ธฐ๊ฐ ๋ฐ๋์์ ๋ |
scroll | ๋ฌธ์ ํ๋ฉด์ด ์คํฌ๋กค๋์์ ๋ |
unload | ๋ฌธ์๋ฅผ ๋ฒ์ด๋ ๋ |
// ex) ๋ฌธ์๋ฅผ ๋ถ๋ฌ์ค์๋ง์ ์๋ฆผ์ฐฝ ํ์
window.onload = alert("์๋
ํ์ธ์?");
๋ง์ฐ์ค ์ด๋ฒคํธ
- ๋ง์ฐ์ค์์ ๋ฒํผ์ด๋ ํ ๋ฒํผ์ ์กฐ์ํ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ
์ด๋ฒคํธ | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ์๊ฐ |
click | ์ฌ์ฉ์๊ฐ HTML ์์๋ฅผ ํด๋ฆญํ์ ๋ |
dbclick | ์ฌ์ฉ์๊ฐ HTML ์์๋ฅผ ๋๋ธํด๋ฆญํ์ ๋ |
mousedown | ์ฌ์ฉ์๊ฐ ์์์์ ๋ง์ฐ์ค ๋ฒํผ์ ๋๋ ์ ๋ |
mousemove | ์ฌ์ฉ์๊ฐ ์์์์ ๋ง์ฐ์ค ํฌ์ธํฐ๋ฅผ ์์ง์ผ ๋ |
mouseover | ๋ง์ฐ์ค ํฌ์ธํฐ๋ฅผ ์์ ์๋ก ์ฎ๊ธธ ๋ |
mouseout | ๋ง์ฐ์ค ํฌ์ธํฐ๊ฐ ์์๋ฅผ ๋ฒ์ด๋ ๋ |
mouseup | ์์ ์์ ์ฌ๋ ค๋์ ๋ง์ฐ์ค ๋ฒํผ์์ ์์ ๋ ๋ |
// ex) ๋ฒํผ์ ํด๋ฆญํ์ ๋ ๋ฌธ์์ ๋ฐฐ๊ฒฝ์ ๋ฐ๊พธ๊ธฐ
count bttn = document.querySelector("button");
button.onclick = function(){
document.body.style.backgroundColor = "green";
}
ํค๋ณด๋ ์ด๋ฒคํธ
- ํค๋ณด๋์์ ํน์ ํค๋ฅผ ์กฐ์ํ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ
์ด๋ฒคํธ | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ์๊ฐ |
keydown | ํค๋ฅผ ๋๋ฅด๋ ๋์ |
keypress | ํค๋ฅผ ๋๋ ์ ๋ |
keyup | ํค์์ ์์ ๋ ๋ |
// ex) ํค๋ณด๋์์ ํค๋ฅผ ๋๋ ์ ๋ ์ด๋ค ํค์ธ์ง ์์๋ด๊ธฐ
const body = document.body;
const result = document.querySelector("#result");
body.addEventListener("keydown", (e) => {
result.innerText = `
code: ${e.code},
key: ${e.key}
`;
}};
ํผ ์ด๋ฒคํธ
- ํผ ์์์ ๋ด์ฉ์ ์ ๋ ฅํ๋ฉด์ ๋ฐ์ํ ์ ์๋ ๋ค์ํ ์ด๋ฒคํธ
- ํผ: ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ(์ ๋ณด)๋ฅผ ์ ๋ ฅํ๋ ๋ชจ๋ ์์ (ex. ๋ก๊ทธ์ธ, ๊ฒ์, ๊ฒ์ํ, ์ค๋ฌธ ์กฐ์ฌ)
์ด๋ฒคํธ | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ์๊ฐ |
blur | ํผ ์์๊ฐ ํฌ์ปค์ค๋ฅผ ์์์ ๋ |
change | ๋ชฉ๋ก์ด๋ ์ฒดํฌ ์ํ ๋ฑ์ด ๋ณ๊ฒฝ๋์์ ๋ (<input>, <select>, <textarea> ํ๊ทธ์์ ์ฌ์ฉ) |
focus | ํผ ์์์ ํฌ์ปค์ค๋ฅผ ๋์์ ๋ (<label>, <select>, <textarea>, <button> ํ๊ทธ์์ ์ฌ์ฉ) |
reset | ํผ์ด ๋ฆฌ์ ๋์์ ๋ |
submit | [submit] ๋ฒํผ์ ํด๋ฆญํ์ ๋ |
// ex) ์ ํ ๋ชฉ๋ก์์ ์ต์
์ ์ ํํ๋ฉด change ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ change ์ด๋ฒคํธ์ displaySelecter() ํจ์ ์ฐ๊ฒฐ
const SelectMenu = document.querySelector("#major);
function displaySelect(){
let selectedText = selectMenu.options[selectMenu.selectedIndex].innerText;
alert(`[${selectedText}]๋ฅผ ์ ํํ์ต๋๋ค.`);
}
selectMenu.onchange = displaySelect;
06-2. ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐ
์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ(๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ): ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ (์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๊ทธ์ ๋ฐ๋ฅธ ์ฐ๊ฒฐ ๋์์ด ์์ด์ผ ํจ)
MTHL ํ๊ทธ์ ํจ์ ์ฐ๊ฒฐํ๊ธฐ
- ์ด๋ฒคํธ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ → ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ HTML ํ๊ทธ์ ์ง์ ํจ์๋ฅผ ์ฐ๊ฒฐํ๋ ๊ฒ
- HTML ํ๊ทธ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํ ์์ฑ ์ถ๊ฐ (์์ฑ ์ด๋ฆ: 'on์ด๋ฒคํธ๋ช '), ๊ทธ ๋ค์ ํจ์ ์ฐ๊ฒฐ
<ํ๊ทธ on์ด๋ฒคํธ๋ช
= "ํจ์๋ช
">
// .html
// ex) ๋ฒํผ์ ํด๋ฆญํ์ ๋ ์๋ฆผ ์ฐฝ์ ํ์
<button onclick = "alert('ํด๋ฆญ!')">Click</button>
- ์ ๋ฐฉ๋ฒ์ HTML ํ๊ทธ์ ์คํฌ๋ฆฝํธ๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฏ๋ก ์คํฌ๋ฆฝํธ ์์ค์์ ํจ์ ์ด๋ฆ์ด ๋ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ ๋ด์ฉ์ด ์์ ๊ฒฝ์ฐ HTML ์์ค๋ ํจ๊ป ์์ ํด์ผ ํจ
- ์ฆ, HTML ์์ค์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ค๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฏ๋ก ์คํฌ๋ฆฝํธ ๋ถ๋ถ์ ์์ ํ๋ ค๋ฉด HTML ์์ค๋ฅผ ๋ค ๋ค์ ธ์ผ ํจ
์น ์์์ ํจ์ ์ฐ๊ฒฐํ๊ธฐ
- ์คํฌ๋ฆฌํธ ์์ค๋ฅผ ๋ณ๊ฒฝํด๋ HTML ๋งํฌ์ ์๋ ์ํฅ์ ์ฃผ์ง ์๊ฒ ํ๋ ค๋ฉด ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๋ ์คํฌ๋ฆฝํธ ์์ค์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข์ → DOM์ ์ฌ์ฉํด ์น ์์๋ฅผ ๊ฐ์ ธ์จ ํ ํ๋กํผํฐ๋ก ํจ์ ์ฐ๊ฒฐํ๊ธฐ
์์.on์ด๋ฒคํธ๋ช
= ํจ์
// ex) ๋ฒํผ ์์๋ฅผ ๊ฐ์ ธ์จ ํ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ๋ฌธ์์ ๋ฐฐ๊ฒฝ์ ๋ฐ๊พธ๊ธฐ
const button = document.querySelector("button");
button.onclick = function(){
document.body.style.background = "green";
}
// ex) ํจ์๋ฅผ ๋ฏธ๋ฆฌ ๋ง๋ค๊ธฐ
function changeBackground(){
document.body.style.backgroundColor = "green";
}
const button = document.querySelector("button");
button.onclick = chageBackground; // ์คํํ ํจ์ ์ด๋ฆ ๋ค์ ์๊ดํธ๋ฅผ ์ฌ์ฉํ์ง ์์
๋ฒํผ์ ํด๋ฆญํ์ ๋ ๋ฐฐ๊ฒฝ์๊ณผ ๊ธ์์ ๋ฐ๊พธ๊ธฐ
// .html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๋ฒํผ ํด๋ฆญ</title>
<link rel="stylesheet" href="css/main.css">
</head>
<body>
<p>๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ฐฐ๊ฒฝ์๊ณผ ๊ธ์์์ด ๋ฐ๋๋๋ค.</p>
<button>Click</button>
<script src="js/ex-1.js"></script>
</body>
</html>
function changeBgText(){
document.body.style.backgroundColor = "#222";
document.body.style.color = "#fff";
}
const button = document.querySelector("button");
button.onclick = changeBgText;

- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๋ ๊ฐ์ง ์ด์์ ํจ์๊ฐ ์คํํ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฐ์
→ 'on์ด๋ฒคํธ๋ช ' ํ๋กํผํฐ๋ฅผ ํ๋๋ง ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ(๊ฐ์ฅ ๋ง์ง๋ง์ ์ฌ์ฉํ onclick ํ๋กํผํฐ๋ง ์ ์ฉ) - ์ฌ๋ฌ ํจ์๋ฅผ ์ฐ๊ฒฐํ๋ ค๋ฉด addEventListener()๋ฅผ ์ฌ์ฉํด์ผ ํจ
์ด๋ฒคํธ ๋ฆฌ์ค๋๋ก ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐ
- ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ๋ชจ๋ DOM์์์์๋ ์ฌ์ฉํ ์ ์๊ณ , ๋ชจ๋ ํจ์์์๋ ์คํํ ์ ์์
- ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํด ์ด๋ฒคํธ ์ฒ๋ฆฌํ ๋ → addEventListener() ๋ฉ์๋(ํจ์)๋ฅผ ์ฌ์ฉํด์ผ ํจ
์์.addEventListener(์ด๋ฒคํธ, ํจ์, ์บก์ฒ ์ฌ๋ถ);
- ์์: ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์
- ์ด๋ฒคํธ: ์ด๋ฒคํธ ์ ํ. ๋จ, ์ฌ๊ธฐ์์๋ ์ด๋ฒคํธ ์ด๋ฆ ์์ on์ ๋ถ์ด์ง ์๊ณ click์ด๋ keypress์ฒ๋ผ ์ด๋ฒคํธ ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉํจ
- ํจ์: ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์คํํ ํจ์๋ฅผ ์ง์ . ๊ธฐ์กด์ ์๋ ํจ์๋ฅผ ์ฌ์ฉํด๋ ๋๊ณ ์ง์ ์ต๋ช ํจ์๋ฅผ ์์ฑํด๋ ๋จ. ์ต๋ช ํจ์๋ก ์คํํ ๋๋ event ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๋ค์ํ ๊ฒ๋ค์ ์ฒ๋ฆฌํ ์ ์์
- ์บก์ฒ ์ฌ๋ถ: ์ด๋ฒคํธ๋ฅผ ์บก์ฒ๋งํ๋์ง์ ์ฌ๋ถ๋ฅผ ์ง์ (์ฆ, true๋ฉด ์บก์ฒ๋ง, false๋ฉด ๋ฒ๋ธ๋ง ํ๋ค๋ ์๋ฏธ. ์ ํ ์ฌํญ์ด๋ฉฐ ๊ธฐ๋ณธ๊ฐ์ false)
์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ฌ์ฉํด ๋ฌธ์ ๋ฐฐ๊ฒฝ์ ๋ฐ๊พธ๊ธฐ
// ์ด๋ฏธ ๋ง๋ ํจ์๋ฅผ ์ฐ๊ฒฐ
function changeBackground(){
document.body.style.backgroundColor = "green";
}
button.addEventListener("clcik", changeBackground);
// ์ต๋ช
ํจ์ ์ฌ์ฉ
button.addEventListener("click", function(){
document.body.style.backgroundColor = "green";
});
// ํ์ดํ ํจ์ ์ฌ์ฉ
button.addEventListener("click", () => {
document.body.style.backgroundColor = "green";
});
addEventListener() ํจ์๋ฅผ ์ฌ์ฉํด ๋ฒํผ์ ํด๋ฆญํ์ ๋ ๋ฌธ์์ ๋ฐฐ๊ฒฝ์๊ณผ ๊ธ์์์ ํ ๊ธํ๋ ์์ค ์์ฑ
// .html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๋ฒํผ ํด๋ฆญ</title>
<link rel="stylesheet" href="css/main.css">
<style>
.convert {
background-color:#222;
color:#fff;
}
</style>
</head>
<body>
<p>๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ฐฐ๊ฒฝ์๊ณผ ๊ธ์์์ด ๋ฐ๋๋๋ค.</p>
<button>Click</button>
<script src="js/ex-2.js"></script>
</body>
</html>
/*const button = document.querySelector("button");
// ๋ฏธ๋ฆฌ .convert ์คํ์ผ ๋ง๋ค์ด ๋๊ณ ํ ๊ธํ๊ธฐ
button.addEventListener("click", function() {
document.body.classList.toggle("convert");
});*/
const button = document.querySelector("button");
button.addEventListener("click", () =>{
document.body.classList.toggle("convert");
});

ํ ์คํธ ํ๋์ ์ ๋ ฅํ ๊ธ์ ์ ์์๋ด๊ธฐ
// ex) ํ
์คํธ ํ๋์ ๋จ์ด๋ฅผ ์
๋ ฅํ์ ๋ ๋จ์ด์ ๊ธธ์ด์ธ ๊ธ์ ์๋ฅผ ํ๋ฉด์ ํ์ํ๋ ํ๋ก๊ทธ๋จ
const button = document.querySelector("#bttn");
button.addEventListener("click", () => {
const word = document.querySelector("#word").value; // ํ
์คํธ ํ๋์ ๋ด์ฉ
const result = document.querySelector("#rsult"); // ๊ฒฐ๊ด๊ฐ์ ํ์ํ ์์ญ
let const = word.length; // ๋ฌธ์์ด์ ๊ธธ์ด
result.innerText = `${count}`; // ๊ฒฐ๊ด๊ฐ ํ์
});
- ๋ฌธ์์ด์ ๊ธธ์ด๋ length ํ๋กํผํฐ์ ๋ค์ด์์
06-3. event ๊ฐ์ฒด
- DOM์๋ ์น ๋ฌธ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ event ๊ฐ์ฒด๊ฐ ์์
- event ๊ฐ์ฒด์๋ ์ ๋ณด(์ด๋ค ์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋์ง, ์ด๋ค ์ข ๋ฅ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋์ง ๋ฑ)๊ฐ ํฌํจ๋จ
event ๊ฐ์ฒด์ ํ๋กํผํฐ์ ๋ฉ์๋
- ์น ๋ฌธ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๋์ผ๋ก ์ด๋ฒคํธ์ ๊ด๋ จ๋ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง
- event ๊ฐ์ฒด์๋ ์ด๋ฒคํธ ๊ด๋ จ ๋ค์ํ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์(์ด๋ฒคํธ ์ด๋ฆ, ๋ฐ์ ์์น, ๋ฐ์ ์๊ฐ ๋ฑ)
- event ๊ฐ์ฒด์์ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๋ preventDefault() ๋ฟ
ํ๋กํผํฐ | ๊ธฐ๋ฅ |
altKey | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ [Alt]๋ฅผ ๋๋ฅด๊ณ ์์๋์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ๋ถ๋ฆฌ์ธ๊ฐ์ ๋ฐํ |
button | ๋ง์ฐ์ค ํค๊ฐ์ ๋ฐํ |
charCode | keypress ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ค ํค๊ฐ ๋๋ ธ๋์ง ์ ๋์ฝ๋๊ฐ์ผ๋ก ๋ฐํ |
clietX | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฐ๋ก ์์น๋ฅผ ๋ฐํ |
clientY | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ธ๋ก ์์น๋ฅผ ๋ฐํ |
ctrlKey | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ [Ctrl]์ ๋๋ฅด๊ณ ์์๋์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ๋ถ๋ฆฌ์ธ๊ฐ์ ๋ฐํ |
pageX | ํ์ฌ ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฐ๋ก ์์น๋ฅผ ๋ฐํ |
pageY | ํ์ฌ ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ธ๋ก ์์น๋ฅผ ๋ฐํ |
screenX | ํ์ฌ ํ๋ฉด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๊ฐ๋ก ์์น๋ฅผ ๋ฐํ |
screenY | ํ์ฌ ํ๋ฉด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์ธ๋ก ์์น๋ฅผ ๋ฐํ |
shiftKey | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ [Shift]์ ๋๋ฅด๊ณ ์์๋์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ๋ถ๋ฆฌ์ธ๊ฐ์ ๋ฐํ |
target | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋์์ ๋ฐํ |
timeStamp | ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๋ฐํ |
type | ๋ฐ์ํ ์ด๋ฒคํธ ์ด๋ฆ์ ๋ฐํ |
which | ํค๋ณด๋์ ๊ด๋ จ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ํค์ ์ ๋์ฝ๋๊ฐ์ ๋ฐํ |
๋ฉ์๋ | ๊ธฐ๋ฅ |
preventDefault | (์ทจ์ํ ์ ์์ ๊ฒฝ์ฐ) ๊ธฐ๋ณธ ๋์์ ์ทจ์ |
โป event ๊ฐ์ฒด์์ ์ฌ์ฉํ๋ ํ๋กํผํฐ์ ๋ฉ์๋ ์ ์ฒด ๋ชฉ๋ก ํ์ธ
→ 'developer.mozilla.org/ko/docs/Web/API/Event' ์ฐธ๊ณ
๋ง์ฐ์ค ์ด๋ฒคํธ์์ ํด๋ฆญ ์์น ์์๋ด๊ธฐ
- ๋ง์ฐ์ค์์ click ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ event ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฆญ ์์น๋ฅผ ์ ์ ์์
const box = document.querySelector("#box");
box.addEventListener("click", (e) => {
alert(`์ด๋ฒคํธ ๋ฐ์ ์์น: ${e.pageX}, ${e.pageY}`);
});
ํค๋ณด๋ ์ด๋ฒคํธ์์ ํค๊ฐ ์์๋ด๊ธฐ
- ํค๋ณด๋์ ๊ด๋ จ๋ ํค๊ฐ์ ๋ค์ํ ํํ๋ก ์ ๊ณต๋์ง๋ง, event.code์ event.key๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํจ
(์ด์ ์๋ event.keyCode๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ด ํ๋กํผํฐ๋ ์ด์ ํ๊ธฐ๋์ด event.code๋ก ๋ฐ๋)
// ex) ํค๋ณด๋์์ ํค๋ฅผ ๋๋ฅผ ๋๋ง๋ค ์ด๋ค ํค๋ฅผ ๋๋ ๋์ง ์์๋ด๋ ์์
const body = document.body;
const result = document.querySelector("result");
body.addEventListener("keydown", (e) => {
result.innerText = `
code: ${e.code},
key: ${e.key}
`;
});
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์บ๋ฌ์ ๋ง๋ค๊ธฐ
์บ๋ฌ์ : ์ด๋ฏธ์ง๋ ์ฝํ ์ธ ๋ฅผ ์ฌ๋ผ์ด๋ ์ผ์ฒ๋ผ ๋ณด์ฌ ์ฃผ๋ ์์
// .html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>์บ๋ฌ์
๋ง๋ค๊ธฐ</title>
<link rel="stylesheet" href="css/carousel.css">
</head>
<body>
<p>์ข์ฐ ํ์ดํ๋ฅผ ๋๋ฌ ๋ณด์ธ์</p>
<div id="container">
<div class="arrow" id="left">⟨</div>
<div class="arrow" id="right">⟩</div>
</div>
<script src="js/carousel.js"></script>
</body>
</html>
// .css
* {
margin:0;
padding:0;
box-sizing: border-box;
}
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
min-height: 100vh;
}
p {
margin:20px;
font-size:2em;
}
#container{
position:relative;
width:600px;
height:300px;
border:2px solid #ccc;
display: flex;
justify-content: space-between;
align-items: center;
}
.arrow {
z-index:100;
font-size:2em;
padding:10px;
background:#ddd;
color:#222;
opacity:0.2;
}
.arrow:hover {
opacity:1;
}
const container = document.querySelector("#container"); // ์บ๋ฌ์
์์ญ
// ์ด๋ฏธ์ง ๋ฐฐ์ด
const pics = ["pic-1.jpg", "pic-2.jpg", "pic-3.jpg", "pic-4.jpg", "pic-5.jpg"];
// ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ์
container.style.backgroundImage = `url(images/${pics[0]})`;
const arrows = document.querySelectorAll(".arrow"); // ํ์ดํ
let i = 0; // ๋ฐฐ์ด ์ธ๋ฑ์ค
arrows.forEach( arrow => {
arrow.addEventListener("click", (e) => {
if(e.target.id == "left"){ // ์ผ์ชฝ ํ์ดํ๋ฅผ ํด๋ฆญํ ๊ฒฝ์ฐ
i--; // ์ด์ ์ด๋ฏธ์ง๋ก ์ด๋
if(i < 0){ // ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง์ธ ๊ฒฝ์ฐ
i = pics.length - 1; // ๋ง์ง๋ง ์ด๋ฏธ์ง๋ก ์ด๋
}
}
else if(e.target.id == "right"){ // ์ค๋ฅธ์ชฝ ํ์ดํ๋ฅผ ํด๋ฆญํ ๊ฒฝ์ฐ
i++; // ๋ค์ ์ด๋ฏธ์ง๋ก ์ด๋
if(i >= pics.length){ // ๋ง์ง๋ง ์ด๋ฏธ์ง์ธ ๊ฒฝ์ฐ
i = 0; // ์ฒซ ๋ฒ์งธ ์ด๋ฏธ์ง๋ก ์ด๋
}
}
container.style.backgroundImage = `url(images/${pics[i]})`; // ํ์ฌ ์ด๋ฏธ์ง๋ฅผ ํ์
});
});
// ์น ๋ฌธ์์์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ ๋ฒํผ ๋นํ์ฑํ์ํค๊ธฐ
window.addEventListener("contextmenu", e => {
e.preventDefault();
alert("์ค๋ฅธ์ชฝ ๋ฒํผ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.")
});

06-4. ์ด๋ฒคํธ ์ ํ
- ์ด๋ฒคํธ ์ ํ: ์น ์์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ํด๋น ์์์๋ง ์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋๋ ๊ฒ์ด ์๋๋ผ ํด๋น ์์๋ฅผ ๊ฐ์ธ๊ณ ์๋ ๋ถ๋ชจ ์์, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์์์ ๋ถ๋ชจ ์์์์๋ ๋๊ฐ์ด ์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋จ
- ์ด๋ฒคํธ ์ ํ๋ '๋ฒ๋ธ๋ง'๊ณผ '์บก์ฒ๋ง' ํํ๋ก ๋๋จ
์ด๋ฒคํธ ๋ฒ๋ธ๋ง
- ์ด๋ฒคํธ ๋ฒ๋ธ๋ง: ํน์ ์์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๊ทธ ์ด๋ฒคํธ๊ฐ ํด๋น ์์๋ฟ๋ง ์๋ใ ใน ๊ทธ ์์์ ๋ถ๋ชจ ์์, ๋ถ๋ชจ ์์์ ๋ถ๋ชจ ์์์๋ ๋๊ฐ์ด ๋ฐ์ํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ ๊ฒ
// .html
// ์๋ต
<body>
BODY
<div onclick = "console.log('div')">
DIV
<section onclick = "console.log('section')">
SECTION
<p onclick = "console.log('p')">P</p>
</section>
</div>
</body>
// ์๋ต
- ๊ฐ์ฅ ์์ชฝ์ 'P'๋ฅผ ํด๋ฆญํ๋ฉด 'SECTION'๊ณผ 'DIV'๋ฅผ ํด๋ฆญํ๋ฉด ๋ํ๋๋ ๋ด์ฉ๋ ํจ๊ป ํ์๋จ
- → P ์์์์ ๋ฐ์ํ click ์ด๋ฒคํธ๊ฐ section ์์๋ฅผ ๊ฑฐ์ฒ div ์์๋ก ์ ๋ฌ๋๋ฉฐ ํด๋น ์์๋ค์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํจ๊ป ์คํ๋์๊ธฐ ๋๋ฌธ
event.target๊ณผ event.currentTarget
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์ด๋ฒคํธ์ ๊ด๋ จ๋ ์ ๋ณด๋ event ๊ฐ์ฒด์ ๋ด๊ฒจ์ง
- event ๊ฐ์ฒด์ ํ๋กํผํฐ ์ค์์ ์ด๋ฒคํธ ์ ํ์ ๊ด๋ จ์ด ์๋ ํ๋กํผํฐ๋ target ํ๋กํผํฐ์ currentTarget ํ๋กํผํฐ์
// .html
// ์๋ต
<body>
BODY
<div>
DIV
<section>
SECTION
<p>P</p>
</section>
</div>
<script src="js/propagation.js"></script>
</body>
// ์๋ต
// .js
const elements = document.querySelectorAll('*'); // ๋ชจ๋ ์์๋ฅผ ๊ฐ์ ธ์ elements์ ์ ์ฅ
// ๋ชจ๋ ์์ ์ํํ๋ฉด์ click ์ด๋ฒคํธ ๋ฐ์ํ์ ๋
// event.target๊ณผ event.currentTarget์ ํ๊ทธ๋ช
ํ์
for (let element of elements) {
element.addEventListener("click", e =>
console.log(`event.target : ${e.target.tagName}, event.currentTarget : ${e.currentTarget.tagName}`)
);
}
// ์๋์ ๊ฐ์ด for๋ฌธ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
// for (let i = 0 ; i < elements.length ; i++) {
// elements[i].addEventListener("click", function(e) {
// console.log(e.target.tagName);
// });
// }
- P ์์ญ์ ํด๋ฆญํ๋ฉด P ์์ญ๋ถํฐ ์ต์์ ์์๊น์ง ์ด๋ฒคํธ๊ฐ ์ ํ๋จ
- event.target : ์ฒ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋์
- event.currentTarget : ์ด๋ฒคํธ๊ฐ ์ ํ๋๋ฉด์ ํ์ฌ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์คํ๋๋ ๋์
์ด๋ฒคํธ ์บก์ณ๋ง
- (์น ๋ธ๋ผ์ฐ์ ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก '์ด๋ฒคํธ ๋ฒ๋ธ๋ง' ์ ํ ๋ฐฉ์์ ์ฌ์ฉ..)
- ์ด๋ฒคํธ ์บก์ณ๋ง: ์น ์์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ผ๋จ ์ต์์ ์์์์ ์์ํด์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์๊น์ง ์ฐจ๋ก๋๋ก ์ด๋ฒคํธ๊ฐ ์ ํ๋๋ ๋ฐฉ์
- ๋ฒ๋ธ๋ง → ์๋์ ์(์์ ์์์์ ๋ถ๋ชจ ์์) ์ ํ
์บก์ณ๋ง → ์์์ ์๋(๋ถ๋ชจ ์์์์ ์์ ์์) ์ ํ
// .html
// ์๋ต
<body>
BODY
<div>
DIV
<section>
SECTION
<p>P</p>
</section>
</div>
<script src="js/capturing.js"></script>
</body>
// ์๋ต
const elements = document.querySelectorAll('*'); // ๋ชจ๋ ์์๋ฅผ ๊ฐ์ ธ์ elements์ ์ ์ฅ
// ๋ชจ๋ ์์ ์ํํ๋ฉด์ click ์ด๋ฒคํธ ๋ฐ์ํ์ ๋
// event.target๊ณผ event.currentTarget์ ํ๊ทธ๋ช
ํ์
for (let element of elements) {
element.addEventListener("click", e =>
console.log(`event.target : ${e.target.tagName}, event.currentTarget : ${e.currentTarget.tagName}`),
true);
}
// ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์๋ ์์ง๋ง for ... of ๋ฌธ ์ฌ์ฉ์ ์ถ์ฒ
// for (let i = 0 ; i < elements.length ; i++) {
// elements[i].addEventListener("click", function(e) {
// console.log(e.target.tagName);
// }, true);
// }
// .js
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์ญ์ P ์์ญ์ด์ง๋ง, currentTarget์ด ์ต์์ ์์์ธ HTML ๋ถํฐ ์์ํจ
๊ต์ฌ: Do it! ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋๋ฐ์ ์ ์