๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Frontend/JavaScript

[ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ] e.preventDefault()์™€ e.stopPropagation()์„ ์•Œ์•„๋ณด์ž.

by YWTechIT 2023. 3. 28.
728x90

๐Ÿ“ e.preventDefault()์™€ e.stopPropagation()์„ ์•Œ์•„๋ณด์ž.

e.preventDefault()์™€ e.stopPropagation()์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ผ๋Š” ๊ณตํ†ต์ ์ด ์žˆ์ง€๋งŒ, ์ฐจ์ด์ ๋„ ์žˆ๋‹ค.

 

e.preventDefault()๋Š” ์ด๋ฒคํŠธ์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฒคํŠธ ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœํ•˜๋Š” method์ด๋‹ค. DOM์š”์†Œ๋Š” ์ €๋งˆ๋‹ค ๊ธฐ๋ณธ ๋™์ž‘์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด anchor ํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•˜๋ฉด href์— ์ง€์ •๋œ ๋งํฌ๋กœ ์ด๋™ํ•˜๊ณ , <input type="checkbox" />๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ฒดํฌ๋ชจ์–‘์ด ์ƒ๊ธฐ๊ฑฐ๋‚˜ ์—†์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  form ํƒœ๊ทธ์—์„œ submit์„ ํ•˜๊ฒŒ๋˜๋ฉด refresh๊ฐ€ ์ผ์–ด๋‚œ๋‹ค. ์ด๋Ÿด ๋•Œ e.preventDefault()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ง€์ •๋œ ๋งํฌ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์ฒดํฌ๋ชจ์–‘์„ ์ƒ๊ธฐ๊ฑฐ๋‚˜ ์—†์• ๋Š” ๋™์ž‘ ๊ทธ๋ฆฌ๊ณ  refreshํ•˜๋Š” ๋™์ž‘์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ•ด๋‹น ํƒœ๊ทธ์˜ ๊ณ ์œ ํ•œ ์ด๋ฒคํŠธ ๋™์ž‘์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์•„๋ž˜ ์˜ˆ์ œ์—์„œ input์ฐฝ์„ ์ฑ„์šฐ๊ณ  submit์„ ๋ˆŒ๋Ÿฌ๋ณด์ž. e.preventDefault()๊ฐ€ ์žˆ์œผ๋ฉด ์ƒˆ๋กœ๊ณ ์นจ์ด ์•ˆ๋  ๊ฒƒ์ด๊ณ , e.preventDefault()๊ฐ€ ์—†์œผ๋ฉด ์ƒˆ๋กœ๊ณ ์นจ์ด ๋  ๊ฒƒ์ด๋‹ค.(๋งŒ์•ฝ, input์ฐฝ์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํฌ๋กฌ์ด ์•„๋‹Œ ํƒ€ ๋ธŒ๋ผ์šฐ์ €(Safari, Firefox, Edge...)๋กœ ์ ‘์†ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  codePen embed์— console ํƒญ์ด ๋ณด์ด์ง€ ์•Š์œผ๋ฉด ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•˜์ž.)

 

See the e.preventDefault by @YWTechIT on CodePen.

 

e.stopPropagation()๋Š” DOM tree๋ฅผ ํ†ตํ•ด ์ „ํŒŒ(๊ตฌ์ฒด์ ์œผ๋กœ ์บก์ณ๋ง/๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„)๋˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ค‘์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฒคํŠธ ๊ฐ์ฒด์—์„œ ํ˜ธ์ถœํ•˜๋Š” method์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ถ€๋ชจ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ์ž์‹ element์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด ๋ถ€๋ชจ element๋„ ์ž์‹ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š”๋ฐ, e.stopPropagation()๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ž์‹ ์—๊ฒŒ ๋ฐ”์ธ๋”ฉ๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋งŒ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๊ณ , ๋ถ€๋ชจ element์—๊ฒŒ ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ถ”๊ฐ€๋กœ ๋งํฌ๋‚˜ ๋ฒ„ํŠผํด๋ฆญ ์‹œ e.stopPropagation()๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ด๋ฒคํŠธ์˜ ๊ธฐ๋ณธ ๋™์ž‘์€ ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋•Œ๋Š” e.preventDefault()๋ฅผ ํ•จ๊ป˜ ์จ์ค˜์•ผํ•œ๋‹ค.

728x90

์•„๋ž˜ ์˜ˆ์ œ์—์„œ Click me!๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ์˜ console์ฐฝ๊ณผ e.stopPropagation()๋ฅผ ์ฃผ์„์ฒ˜๋ฆฌํ•˜๊ณ  Click me!๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ์˜ console์ฐฝ์„ ๋น„๊ตํ•ด ๋ณด์ž. (console์ฐฝ์ด ๋ณด์ด์ง€ ์•Š์œผ๋ฉด ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.)

 

See the e.stopPropagation by @YWTechIT on CodePen.

 

์—ฌ๋‹ด์œผ๋กœ e.stopImmediatePropagation()๋ฉ”์†Œ๋“œ๋Š” ๋™์ผํ•œ ์ด๋ฒคํŠธ ์œ ํ˜•์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋™์ผํ•œ element์— ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฒคํŠธ Propagation์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. React์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ธŒ๋ผ์šฐ์ €์˜ ๊ณ ์œ  ์ด๋ฒคํŠธ์ธ nativeEvent ์–ดํŠธ๋ฆฌ๋ทฐํŠธ์—์„œ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. (e.nativeEvent.stopImmediatePropagation())

 

Reference

  1. Event.preventDefault - MDN
  2. Event.stopPropagation - MDN
  3. Event.stopImmediatePropagation - MDN
  4. ํ•ฉ์„ฑ์ด๋ฒคํŠธ - React
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€