[JavaScript] Event

혜혜·2024λ…„ 11μ›” 18일
1

JavaScript

λͺ©λ‘ 보기
9/9
post-thumbnail

πŸ’‘ 핡심

πŸ“Œ κ°œλ…

ν”„λ‘œκ·Έλž˜λ° ν•˜κ³  μžˆλŠ” μ‹œμŠ€ν…œμ—μ„œ μΌμ–΄λ‚˜λŠ” 사건(action) λ˜λŠ” λ°œμƒ(occurrence)

  • 이것듀에 μ–΄λ–€ λ°©μ‹μœΌλ‘œ 응닡할 수 μžˆλ„λ‘ μ‹œμŠ€ν…œμ΄ λ§ν•΄μ£ΌλŠ” κ°œλ…
  • μ‹œμŠ€ν…œμ€ μ΄λ²€νŠΈκ°€ λ°œμƒλ  λ•Œ μ‹ ν˜Έλ₯Ό λ°œμƒμ‹œν‚΄ β†’ μ΄λ²€νŠΈκ°€ λ°œμƒλ˜μ—ˆμ„ λ•Œ μ•‘μ…˜μ΄ μžλ™μ μœΌλ‘œ μ·¨ν•΄μ§ˆ 수 μžˆλŠ” λ§€μ»€λ‹ˆμ¦˜ 제곡
  • 이벀트 μ’…λ₯˜λŠ” Event reference μ°Έκ³ 
  • 이벀트 ν•Έλ“€λŸ¬(event handler) : μ΄λ²€νŠΈκ°€ λ°œμƒλ˜λ©΄ μ‹€ν–‰λ˜λŠ” μ½”λ“œ λΈ”λŸ­
    ν•Έλ“€λŸ¬κ°€ μ΄λ²€νŠΈμ— μ‘λ‹΅ν•΄μ„œ μ‹€ν–‰λ˜κΈ° μœ„ν•΄ μ •μ˜λ˜μ—ˆμ„ λ•Œ, 이벀트 ν•Έλ“€λŸ¬λ₯Ό 등둝(register)ν–ˆλ‹€κ³  함

πŸ“Œ 이벀트λ₯Ό μ‚¬μš©ν•˜λŠ” 방법

1. 이벀트 ν•Έλ“€λŸ¬ ν”„λ‘œνΌν‹°

const btn = document.querySelector("button");

btn.onclick = function () {
  const rndCol =
    "rgb(" + random(255) + "," + random(255) + "," + random(255) + ")";
  document.body.style.backgroundColor = rndCol;
};

2. 인라인 이벀트 ν•Έλ“€λŸ¬ β†’ λ˜λ„λ‘ 쓰지 말자

<button onclick="bgChange()">Press me</button>
function bgChange() {
  const rndCol =
    "rgb(" + random(255) + "," + random(255) + "," + random(255) + ")";
  document.body.style.backgroundColor = rndCol;
}
  • 인라인으둜 이벀트 ν•Έλ“€λŸ¬ ν•¨μˆ˜λ₯Ό μ§€μ •ν•˜λŠ” 방식
  • ν•˜λ‚˜μ˜ νŒŒμΌμ΄λ”λΌλ„, 인라인 이벀트 ν•Έλ“€λŸ¬λŠ” 쒋지 μ•ŠμŒ
    μš”μ†Œκ°€ μ—¬λŸ¬ 개라면 μ–΄νŠΈλ¦¬λ·°νŠΈλ₯Ό 계속 더해야 ν•˜κ³ , μœ μ§€λ³΄μˆ˜μ— μ•ˆ 쒋을 수 있음
const buttons = document.querySelectorAll("button");

for (let i = 0; i < buttons.length; i++) {
  buttons[i].onclick = bgChange;
}

3. addEventListener() λ©”μ„œλ“œ μ‚¬μš©

const btn = document.querySelector("button");

function bgChange() {
  const rndCol =
    "rgb(" + random(255) + "," + random(255) + "," + random(255) + ")";
  document.body.style.backgroundColor = rndCol;
}

btn.addEventListener("click", bgChange);

πŸ“Œ addEventListener()와 이벀트 ν•Έλ“€λŸ¬ ν”„λ‘œνΌν‹°μ˜ 차이

  • addEventListener() : 이벀트 ν•Έλ“€λŸ¬κ°€ 계속 μΆ”κ°€λ˜λŠ” κ°œλ…
  • 이벀트 ν•Έλ“€λŸ¬ ν”„λ‘œνΌν‹° : 이벀트 ν•Έλ“€λŸ¬κ°€ κ°ˆμ•„ λΌμ›Œμ§€λŠ” κ°œλ…

πŸ“Œ 이벀트 객체

좔가적인 κΈ°λŠ₯κ³Ό 정보λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ 이벀트 ν•Έλ“€λŸ¬μ— μžλ™μœΌλ‘œ μ „λ‹¬λ˜λŠ” 객체

function bgChange(e) {
  const rndCol =
    "rgb(" + random(255) + "," + random(255) + "," + random(255) + ")";
  e.target.style.backgroundColor = rndCol;
  console.log(e);
}

btn.addEventListener("click", bgChange);
  • 이벀트 객체의 target ν”„λ‘œνΌν‹° : 항상 μ΄λ²€νŠΈκ°€ λ°œμƒλœ μš”μ†Œμ— λŒ€ν•œ μ°Έμ‘°

πŸ“Œ event targetκ³Ό currentTarget의 차이

  • currentTarget : 이벀트 ν•Έλ“€λŸ¬κ°€ λΆ€μ°©λœ μš”μ†Œ
  • target : μ‹€μ œ μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λŠ” μš”μ†Œ

πŸ“Œ κΈ°λ³Έ 행동 λ°©μ§€ν•˜κΈ°

<form>
  <div>
    <label for="fname">First name: </label>
    <input id="fname" type="text" />
  </div>
  <div>
    <label for="lname">Last name: </label>
    <input id="lname" type="text" />
  </div>
  <div>
    <input id="submit" type="submit" />
  </div>
</form>
<p></p>
  • ν…μŠ€νŠΈ ν•„λ“œκ°€ λΉ„μ—ˆλ‹€λ©΄ 양식 μ œμΆœμ„ λ©ˆμΆ”κΈ° μœ„ν•œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄ 보자
const form = document.querySelector("form");
const fname = document.getElementById("fname");
const lname = document.getElementById("lname");
const para = document.querySelector("p");

form.onsubmit = function (e) {
  if (fname.value === "" || lname.value === "") {
    e.preventDefault();
    para.textContent = "You need to fill in both names!";
  }
};
  • '제좜'μ΄λΌλŠ” μ›λž˜μ˜ μ•‘μ…˜μ„ μ—†μ• κ³  ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ›ν•˜λŠ” μ•‘μ…˜μ„ μˆ˜ν–‰

πŸ“Œ 이벀트 버블링과 캑처링

두 이벀트 ν•Έλ“€λŸ¬κ°€ ν•œ μš”μ†Œμ— μž‘λ™λ˜μ—ˆμ„ λ•Œ 무슨 일이 μΌμ–΄λ‚˜λŠ”μ§€λ₯Ό κΈ°μˆ ν•˜λŠ” λ§€μ»€λ‹ˆμ¦˜

버블링과 μΊ‘μ²˜λ§μ€ λ°˜λŒ€ κ°œλ…

1. 버블링

  • λΈŒλΌμš°μ €λŠ” μ„ νƒλœ μš”μ†Œκ°€ 버블링 단계에 λŒ€ν•΄ 그것에 λ“±λ‘λœ 이벀트 ν•Έλ“€λŸ¬λ₯Ό 가지고 μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ κ²€μ‚¬ν•˜κ³ , λ§Œμ•½ κ·Έλ ‡λ‹€λ©΄ μ‹€ν–‰
  • κ·Έλ¦¬κ³ μ„œ λ°”λ‘œ λ‹€μŒμ˜ 쑰상 μš”μ†Œλ‘œ μ΄λ™ν•˜κ³  같은 일을 ν•˜κ³ , κ·Έλ¦¬κ³ μ„œ κ·Έ λ‹€μŒ μš”μ†Œλ‘œ μ΄λ™ν•˜κ³ ... <html> μš”μ†Œμ— 닿을 λ•ŒκΉŒμ§€ 계속함

2. 캑처링

  • λΈŒλΌμš°μ €λŠ” μš”μ†Œμ˜ κ°€μž₯ λ°”κΉ₯μͺ½ 쑰상(<html>)이 캑처링 단계에 λŒ€ν•΄ 그것에 λ“±λ‘λœ 이벀트 ν•Έλ“€λŸ¬κ°€ μžˆλŠ”μ§€ ν™•μΈν•˜κΈ° μœ„ν•΄ κ²€μ‚¬ν•˜κ³ , λ§Œμ•½ κ·Έλ ‡λ‹€λ©΄ 싀행함
  • κ·Έλ¦¬κ³ μ„œ <html> 내뢀에 μžˆλŠ” λ‹€μŒ μš”μ†Œλ‘œ μ΄λ™ν•˜κ³  같은 일을 ν•˜κ³ , κ·Έλ¦¬κ³ μ„œ κ·Έ λ‹€μŒ μš”μ†Œλ‘œ μ΄λ™ν•˜κ³ ... μ‹€μ œλ‘œ μ„ νƒλœ μš”μ†Œμ— 닿을 λ•ŒκΉŒμ§€ 계속함

이벀트 버블링 및 μΊ‘μ²˜λ§μ„ μ°¨λ‹¨ν•˜λ €λ©΄ event.stopPropagation() μ‚¬μš©

πŸ“Œ 이벀트 μœ„μž„ (Event delegation)

λ§Œμ•½ λ‹€μˆ˜μ˜ μžμ‹ μš”μ†Œ 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν–ˆμ„ λ•Œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ°λ₯Ό μ›ν•œλ‹€λ©΄,
λͺ¨λ“  μžμ‹μ— κ°œλ³„μ μœΌλ‘œ 이벀트 λ¦¬μŠ€λ„ˆλ₯Ό μ„€μ •ν•΄μ•Όλ§Œ ν•˜λŠ” 것 λŒ€μ‹ μ—,
이벀트 λ¦¬μŠ€λ„ˆλ₯Ό κ·Έλ“€μ˜ λΆ€λͺ¨μ— μ„€μ •ν•˜κ³  κ·Έλ“€μ—κ²Œμ„œ μΌμ–΄λ‚œ μ΄λ²€νŠΈκ°€ λΆ€λͺ¨μ—κ²ŒκΉŒμ§€ 올라였게 ν•  수 μžˆλ‹€λŠ” 사싀에 의쑴

  • 버블링을 ν†΅ν•΄μ„œ μ΄λ²€νŠΈκ°€ λΆ€λͺ¨ μš”μ†Œμ—κΉŒμ§€ μ˜¬λΌμ˜€λŠ” κ±Έ μ΄μš©ν•˜λŠ” 방법
<ul id="parent-list">
	<li id="post-1">Item 1</li>
	<li id="post-2">Item 2</li>
	<li id="post-3">Item 3</li>
	<li id="post-4">Item 4</li>
	<li id="post-5">Item 5</li>
	<li id="post-6">Item 6</li>
</ul>
  • 이런 μš”μ†Œμ—μ„œ liλ₯Ό λˆŒλ €μ„ λ•Œ μ΄λ²€νŠΈκ°€ λ™μž‘ν•  수 있게 ν•˜κ³  μ‹Άλ‹€λ©΄?
    li νƒœκ·Έμ— 일일이 이벀트 ν•Έλ“€λŸ¬λ₯Ό μΆ”κ°€ν•˜λŠ” 건 쒋은 방법이 아닐 수 μžˆλ‹€!
// Get the element, add a click listener...
document.getElementById("parent-list").addEventListener("click", function(e) {
	// e.target is the clicked element!
	// If it was a list item
	if(e.target && e.target.nodeName == "LI") {
		// List item found!  Output the ID!
		console.log("List item ", e.target.id.replace("post-", ""), " was clicked!");
	}
});
  • 이런 μ‹μœΌλ‘œ λΆ€λͺ¨ μš”μ†Œμ—μ„œ 이벀트λ₯Ό 캐치

πŸ’‘ μ°Έκ³  자료

profile
μ‰½κ²Œλ§Œμ‚΄μ•„κ°€λ©΄μž¬λ―Έμ—†μ–΄λΉ™κ³ 

3개의 λŒ“κΈ€

comment-user-thumbnail
2024λ…„ 11μ›” 18일

νšŒμ‚¬ 퍼블리셔 λΆ„κ»˜μ„œ.. ν”„λ‘ νŠΈμ—”λ“œ 개발자의 정말 기본은...
html css + javascript 이게 νŠΌνŠΌν•΄μ•Ό μ–΄λ–€ μ»€μŠ€ν…€ν•œ 화면을 λ§Œλ“€λ”λΌλ„, 잘 ν•  수 μžˆλ‹€κ³  ν•˜λ“œλΌκ΅¬μš”
γ… γ… 

이런 κΈ°λ³ΈκΈ° λ‹€μ§€λŠ” 것 κ΅Ώμž…λ‹ˆλ‹€... γ… γ… 

1개의 λ‹΅κΈ€

κ΄€λ ¨ μ±„μš© 정보