๐ŸŸจ JavaScript/๊ฐœ๋…

[์ฝ”๋”ฉ์• ํ”Œ,mdn ๋“ฑ] ์ด๋ฒคํŠธ๋ฒ„๋ธ”๋ง๊ณผ ์ด๋ฒคํŠธ์บก์ณ๋ง ๋ฐ ๊ด€๋ จ ์œ ์šฉํ•œ ํ•จ์ˆ˜๋“ค

Zoeeey 2023. 1. 16. 21:51

์ด๋ฒคํŠธ๊ฐ€ DOMํŠธ๋ฆฌ๋ฅผ ํƒ€๊ณ  ๋ฐœ์ƒํ•˜๋Š” ํ๋ฆ„

  1. ์ด๋ฒคํŠธ๋Š” document์—์„œ ์‹œ์ž‘ํ•ด DOM ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ event.target๊นŒ์ง€ ๋‚ด๋ ค๊ฐ„๋‹ค. ์ด๋ฒคํŠธ๋Š” ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ ๋‚ด๋ ค๊ฐ€๋ฉด์„œ addEventListener(..., true)๋กœ ํ• ๋‹นํ•œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋™์ž‘์‹œํ‚ต๋‹ˆ๋‹ค. addEventListener(..., true)์˜ true๋Š” {capture: true}์˜ ์ถ•์•ฝํ˜•์ด๋‹ค.
  2. ์ดํ›„ ํƒ€๊นƒ ์š”์†Œ์— ์„ค์ •๋œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
  3. ์ดํ›„์—” ์ด๋ฒคํŠธ๊ฐ€ event.target๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋‹ค์‹œ ์ตœ์ƒ์œ„ ๋…ธ๋“œ๊นŒ์ง€ ์ „๋‹ฌ๋˜๋ฉด์„œ ๊ฐ ์š”์†Œ์— on<event>๋กœ ํ• ๋‹นํ•œ ํ•ธ๋“ค๋Ÿฌ์™€ addEventListener๋กœ ํ• ๋‹นํ•œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋™์ž‘์‹œํ‚จ๋‹ค. addEventListener๋กœ ํ• ๋‹นํ•œ ํ•ธ๋“ค๋Ÿฌ ์ค‘, ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ ์—†๊ฑฐ๋‚˜ false, {capture: false}์ธ ํ•ธ๋“ค๋Ÿฌ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.

์ด๋ฒคํŠธ๋ฒ„๋ธ”๋ง

<div> <!-- ์—ฌ๊ธฐ๋„ ๋ฐœ์ƒ-->
  <div> <!-- ์—ฌ๊ธฐ๋„ ๋ฐœ์ƒ-->
    <p>์•ˆ๋…•</p> <!-- ์—ฌ๊ธฐ์— ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ๋ฉด -->
  </div>
</div>

html ํ•˜์œ„ ์š”์†Œ(ํƒœ๊ทธ)์— ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๊ทธ ์š”์†Œ์˜ ์ƒ์œ„ ์š”์†Œ๊นŒ์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

(๋ชจ๋“  ์ด๋ฒคํŠธ๊ฐ€ ๋ฒ„๋ธ”๋ง๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. ex. focus, blur, mouseenter, mouseleave)
-> ์œ„ ์ด๋ฒคํŠธ๋ฅผ ๋ฒ„๋ธ”๋งํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด focusin, focosout, mouseover, mouseout์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.


.stopPropagation()

button.addEventListener('click', (e) => {
  e.stopPropagation();
  console.log("button was clicked");
})

์ด ํ•จ์ˆ˜๋ฅผ ์ด๋ฒคํŠธ์— ๋ถ™์ด๋ฉด ์ƒ์œ„ ์š”์†Œ๋กœ์˜ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ๋ง‰๋Š”๋‹ค.

** stopPropagation์„ ๋„ˆ๋ฌด ๋‚จ๋ฐœํ•˜๋ฉด ํ•ด๋‹น ์ด๋ฒคํŠธ ์˜์—ญ์ด ์ฃฝ์€ ์˜์—ญ(Dead Zone)์ธ์ง€ ๋ชจ๋ฅด๊ณ  ์ด๋ฒคํŠธ๊ฐ€ ์™œ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ˜๋“œ์‹œ ์ด์œ ๋ฅผ ๊ฐ€์ง€๊ณ  ์จ์•ผ ํ•œ๋‹ค. (์ฐธ๊ณ  : https://ko.javascript.info/bubbling-and-capturing)

.stopImmediatePropagation()

function myFunction(event) {
  alert ("Hello World!");
  event.stopImmediatePropagation(); // ์—ฌ๊ธฐ
  alert ("I will not get to say Hello World"); //์ด๊ฒƒ๊นŒ์ง€๋งŒ ์‹คํ–‰๋œ๋‹ค.
}

function someOtherFunction() {
  alert ("I will not get to say Hello World"); // ๋ฌด์‹œ
}

var x = document.getElementById("myBtn");
x.addEventListener("click", myFunction);
x.addEventListener("click", someOtherFunction);

stopPropagation()์€ ํ•ด๋‹น ์ด๋ฒคํŠธํ•ธ๋“ค๋Ÿฌ์˜ ์œ„์ชฝ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ๋ฒ„๋ธ”๋ง์€ ๋ง‰์•„์ฃผ์ง€๋งŒ, ์š”์†Œ์˜ ๋‹ค๋ฅธ ์ด๋ฒคํŠธํ•ธ๋“ค๋Ÿฌ์˜ ์ž‘๋™๊นŒ์ง€ ๋ง‰์ง€๋Š” ๋ชปํ•œ๋‹ค.๊ทธ๋Ÿฌ๋‚˜ stopImmediatePropagation()์€ ๊ทธ ํ›„ ์ด๋ฒคํŠธํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ „๋ถ€ ๋ฌด์‹œํ•œ๋‹ค.

.preventDefault()

์š”์†Œ์˜ ๊ณ ์œ  ๋™์ž‘์„ ์ค‘๋‹จ์‹œํ‚จ๋‹ค.


์ด๋ฒคํŠธ์บก์ฒ˜๋ง

//์•„๋ž˜ ๋‘˜ ๋‹ค ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.
target.addEventListener("click", function(){}, true);
target.addEventListener(..., {capture: true});

์ด๋ฒคํŠธ์บก์ฒ˜๋ง์€ ๋ฒ„๋ธ”๋ง๊ณผ ๋ฐ˜๋Œ€๋กœ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.
์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•  ๋•Œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‘๊ฐœ๋งŒ ์“ฐ๋ฉด ์บก์ฒ˜๋ง์€ ๋˜์ง€ ์•Š๋Š”๋‹ค. ์„ธ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ true ํ˜น์€ capture: true๋ฅผ ๋„ฃ์œผ๋ฉด ์บก์ฒ˜๋ง์ด ์ž‘๋™ํ•œ๋‹ค. (false๊ฐ€ default๊ฐ’์ด๋‹ค.)


์ด๋ฒคํŠธ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋“ค

  • event.target – ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฐ€์žฅ ์•ˆ์ชฝ์˜ ์š”์†Œ (์œ ์ €๊ฐ€ ์‹ค์ œ๋กœ ๋ˆ„๋ฅธ ๊ณณ์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค)
  • event.currentTarget (=this) – ์ด๋ฒคํŠธ๋ฅผ ํ•ธ๋“ค๋ง ํ•˜๋Š” ํ˜„์žฌ ์š”์†Œ (ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹ค์ œ ํ• ๋‹น๋œ ์š”์†Œ)
  • event.eventPhase – ํ˜„์žฌ ์ด๋ฒคํŠธ ํ๋ฆ„ ๋‹จ๊ณ„(์บก์ฒ˜๋ง=1, ํƒ€๊นƒ=2, ๋ฒ„๋ธ”๋ง=3)

์™„๋ฒฝํ•˜๊ฒŒ ์ •๋ฆฌ๋˜์–ด์žˆ๋˜ ์ฐธ๊ณ  ์‚ฌ์ดํŠธ : https://medium.com/%EC%98%A4%EB%8A%98%EC%9D%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/stoppropagation-vs-stopimmediatepropagation-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-75edaaed7841

 

stopPropagation vs stopImmediatePropagation ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ

์ด๋ฒคํŠธ ์ „ํŒŒ๋ฅผ ์ค‘๋‹จ์‹œํ‚ค๋Š” ๋‘ ๋ฉ”์†Œ๋“œ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜๋Š” ๊ธ€

medium.com

์™„๋ฒฝํ•˜๊ฒŒ ์ •๋ฆฌ๋˜์–ด์žˆ๋˜ ์ฐธ๊ณ  ์‚ฌ์ดํŠธ 2 : https://ko.javascript.info/bubbling-and-capturing

 

๋ฒ„๋ธ”๋ง๊ณผ ์บก์ฒ˜๋ง

 

ko.javascript.info


์ถœ์ฒ˜ : ์ฝ”๋”ฉ์• ํ”Œ https://codingapple.com/ / MDN https://developer.mozilla.org/ko/