๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Basics/Develop

js ๋ถ€๋ชจ ์—˜๋ฆฌ๋จผํŠธ ์ด๋ฒคํŠธ ์ œ๊ฑฐ, ์ด๋ฒคํŠธ ์ƒ์† ์ œ๊ฑฐ - ์ž์‹ ์š”์†Œ ์ด๋ฒคํŠธ ํ•˜๋‚˜๋งŒ ์‹คํ–‰ํ•˜๊ธฐ <์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง>

by IworldT 2023. 4. 17.
๋ฐ˜์‘ํ˜•

html๊ณผ js๋กœ ์ฝ”๋”ฉ์„ ํ•˜๋‹ค๋ณด๋ฉด ์š”์†Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ผ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ค๋ณด๋ฉด ๊ตฌ์กฐ๊ฐ€ ํ˜•์ œsibling๊ฐ€ ์•„๋‹Œ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„์˜ ์š”์†Œ๊ฐ€ ๋  ์ˆ˜๋ฐ–์— ์—†๋Š”๋ฐ, ์ด๋•Œ  ์ž์‹ ์š”์†Œ๋ฅผ ๋งŒ๋“ค๋ฉด ๋ถ€๋ชจ์˜ ์ด๋ฒคํŠธ๋„ ํ•จ๊ป˜ ์ ์šฉ๋˜๊ณค ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹์˜ ์ด๋ฒคํŠธ๋ฅผ ํ•˜๋‚˜๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€๋ฐ, ๋ถ€๋ชจ์˜ ์ด๋ฒคํŠธ๊นŒ์ง€ ๊ฐ™์ด ํ•œ ๋ฒˆ์— ์‹คํ–‰๋˜์–ด ๋ฒ„๋ฆฌ๋‹ˆ ๊ณจ์น˜๊ฐ€ ์•„ํ”ˆ๋ฐ์š”.

ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๋‹ค๊ณ  ์ž์‹ ์š”์†Œ์—์„œ ๋ถ€๋ชจ์˜ ์ด๋ฒคํŠธ๋ฅผ removeEventListener ํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๋ฏผํ•˜์‹ค ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ ์ž์‹ ์š”์†Œ์—์„œ ๋ณธ์ธ์˜ ์ด๋ฒคํŠธ๋งŒ ํ˜ธ์ถœํ•˜๊ณ  ๋ถ€๋ชจ ์ด๋ฒคํŠธ ํ˜ธ์ถœ์€ ์ œ๊ฑฐ, ๋ง‰๋Š” ๋ฐฉ๋ฒ•์„ ๊ณต์œ ํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

JS onclick ์ด๋ฒคํŠธ ํ•˜๋‚˜๋งŒ, ๋ถ€๋ชจ ์ด๋ฒคํŠธ ์ œ๊ฑฐ

์ด๋ฒˆ ์˜ˆ์‹œ๋Š” onclick ์ด๋ฒคํŠธ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ ์š”์†Œ ์•ˆ์— ์ž์‹ ์š”์†Œ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋˜๊ณ , html ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๊ฒ ์Šต๋‹ˆ๋‹ค.

<div id="parent" onclick="parentEvent(e)">
	<div id="child" onclick="childEvent(e)"></div>
</div>

์—ฌ๊ธฐ์„œ div๊ฐ€ span์ด๋“ , p์ด๋“ , button์ด๋“  ์ƒ๊ด€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋ฅผ ๋ณธ์ธ ์ด๋ฒคํŠธ๋งŒ ์ ์šฉํ•ด๋ณด๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ์„ ์ดํ•ดํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

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

์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ์—์„œ child ์š”์†Œ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ์ด ๋‘๊ฐ€์ง€ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ childEvent()ํ•จ์ˆ˜์™€ parentEvent()ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ํ˜„์ƒ์ž…๋‹ˆ๋‹ค. ์ž์‹ ์š”์†Œ๋ฅผ ํด๋ฆญํ•˜๋ฉด, ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ถ€๋ชจ ์š”์†Œ๋„ ํด๋ฆญํ•  ์ˆ˜๋ฐ–์— ์—†๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‹คํ–‰์ˆœ์„œ๋Š” ์ž์‹->๋ถ€๋ชจ ์ฐจ๋ก€๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ž์‹์—์„œ ๋ถ€๋ชจ๋กœ ๊ฐ€๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ง‰์•„์ค€๋‹ค๋ฉด? ๋ณธ์ธ์˜ ํ•จ์ˆ˜ ํ•˜๋‚˜๋งŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ฒ ์ฃ .

์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋˜๋Š”์ง€ ๋ฐ”๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•

 

e.stopPropagation()์˜ ํ™œ์šฉ ์˜ˆ์‹œ

๊ทธ๋ž˜์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋กœ stopPropagation()์ž…๋‹ˆ๋‹ค.

propagation์ด๋ผ๋Š” ๋‹จ์–ด์˜ ๋œป ์ž์ฒด๊ฐ€ "๋ฒˆ์‹"์ธ๋ฐ, ์ด๋ฅผ ๋ง‰๊ฒ ๋‹ค๋Š” ๊ฒƒ์œผ๋กœ ์ด๋ฒคํŠธ์˜ ์ „ํŒŒ, ์ฆ‰ ๋‹ค์Œ ์ด๋ฒคํŠธ๋กœ์˜ ์‹คํ–‰์„ ๋ง‰๋Š”๋‹ค๋Š” ๋œป์œผ๋กœ ์ดํ•ดํ•˜์‹œ๋ฉด ์‰ฝ์Šต๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ ์•ˆ์— ๋‚ด์žฅ๋˜์–ด์žˆ์–ด ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. html์—์„œ onclick์„ ์ž‘์„ฑํ•  ๋•Œ ๊ผญ e(์ด๋ฆ„์€ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค, event๋กœ ์ž‘์„ฑํ•˜์…”๋„ ๋ฌด๊ด€)๋ฅผ ๋„ฃ์–ด์ฃผ์„ธ์š”.

ํ™œ์šฉ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

 

function childEvent(e){
	e.stopPropagation();
    cosole.log("์ด๋ถ€๋ถ„์— ์ž์‹ ์š”์†Œ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ํ•˜๊ณ  ์‹ถ์€ ํ•จ์ˆ˜ ์ž‘์„ฑ");
}

๋ถ€๋ชจ๋กœ์˜ ์ด๋ฒคํŠธ ์ „ํŒŒ๋ฅผ ๋ง‰๊ณ  ์‹ถ์€ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด 1->2->3 ์ด ์„ธ ๋‹จ๊ณ„์˜ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , 2๋ฒˆ์งธ ์š”์†Œ์˜ ์ด๋ฒคํŠธ ํ•จ์ˆ˜์—์„œ ํ™œ์šฉํ•˜๋ฉด 3์ด๋ฒคํŠธ->2์ด๋ฒคํŠธ๊นŒ์ง€๋งŒ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์ด์ƒ ์ด๋ฒคํŠธ ์ƒ์† ์ œ๊ฑฐ, ์ž์‹ ์ด๋ฒคํŠธ๋งŒ ์‹คํ–‰ํ•˜๊ธฐ, ๋ถ€๋ชจ์˜ ์ด๋ฒคํŠธ ์‹คํ–‰ ๋ง‰๊ธฐ, ๋ถ€๋ชจ element removeEventListner ํ•˜๋Š” ๋ฐฉ๋ฒ•, ์ฆ‰ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ํ˜„์ƒ ์ œ๊ฑฐ ๋ฐฉ๋ฒ•์ธ stopPropagation()์— ๋Œ€ํ•ด ์„ค๋ช…๋“œ๋ ธ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜ํ•ด์•ผํ• ์ ์€, ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๊นŒ์ง€๋„ ๋ง‰์•„๋ฒ„๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฒคํŠธ ํ˜ธ์ถœ ๊ตฌ์กฐ๋ฅผ ์ž˜ ์ƒ๊ฐํ•˜์—ฌ ์ž‘์„ฑํ•˜์‹œ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€