thumbnail
DOM์—์„œ์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
Front-End
2023.07.14.

DOM ์—์„œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

  • DOM level 0 Event Model

    • ์ธ๋ผ์ธ ์ด๋ฒคํŠธ ๋ชจ๋ธ : ํƒœ๊ทธ ๋ ˆ๋ฒจ์˜ ์ด๋ฒคํŠธ ์†์„ฑ์„ ์ด์šฉํ•œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ (์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๊ฒƒ์„ ์ถ”์ฒœ)
    • ๋””ํดํŠธ ์ด๋ฒคํŠธ ๋ชจ๋ธ : ์ด๋ฒคํŠธ ์†์„ฑ์„ ์ด์šฉํ•œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
  • DOM level 2 Event Model

    • ํ‘œ์ค€ ์ด๋ฒคํŠธ ๋ชจ๋ธ : ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

    โ‡’ addEventListener(eventName, handler, isCapture) โ‡’ removeEventListener(eventName, handler)

DOM์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” DOM level 0, DOM level 2 ๋‘ ๊ฐ€์ง€ ๋ชจ๋ธ์ด ์žˆ๋‹ค. DOM level 0 ๋ชจ๋ธ์€ ์ธ๋ผ์ธ ์ด๋ฒคํŠธ ๋ชจ๋ธ๊ณผ ๋””ํดํŠธ ์ด๋ฒคํŠธ ๋ชจ๋ธ์ด ์žˆ๋‹ค. ์ธ๋ผ์ธ ์ด๋ฒคํŠธ ๋ชจ๋ธ์€ ํƒœ๊ทธ ๋ ˆ๋ฒจ์˜ ์ด๋ฒคํŠธ ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์˜ ์–ด๋ ค์›€ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋””ํดํŠธ ์ด๋ฒคํŠธ ๋ชจ๋ธ์€ ์ด๋ฒคํŠธ ์†์„ฑ์„ ์ด์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ์ธ๋ผ์ธ ์ด๋ฒคํŠธ ๋ชจ๋ธ๋ณด๋‹ค๋Š” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

DOM level 2 ๋ชจ๋ธ์€ ํ‘œ์ค€ ์ด๋ฒคํŠธ ๋ชจ๋ธ๋กœ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„ ์ถ”์ฒœ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

์˜ˆ์‹œ :

document.getElementById("myButton").addEventListener("click", function(){
  alert("Button clicked");
});

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ์บก์ณ๋ง

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ์บก์ณ๋ง์€ DOM์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ์ด๋ฒคํŠธ๊ฐ€ ์ „ํŒŒ๋˜๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

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

<div id="outer">
  <div id="inner">
    <button id="btn">Click me</button>
  </div>
</div>

์ด ๊ฒฝ์šฐ, btn ์š”์†Œ์—์„œ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ด๋ฒคํŠธ๋Š” btn ์š”์†Œ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์ƒ์œ„ ์š”์†Œ์ธ inner ์š”์†Œ, ๊ทธ๋ฆฌ๊ณ  outer ์š”์†Œ๋กœ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›๋˜๋ฉฐ, ์ด๋ฒคํŠธ ์ „ํŒŒ ์ˆœ์„œ๊ฐ€ ์ž์‹ ์š”์†Œ์—์„œ ๋ถ€๋ชจ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„ ์š”์†Œ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ์บก์ณ๋ง์€ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง๊ณผ ๋ฐ˜๋Œ€๋กœ ์ƒ์œ„ ์š”์†Œ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์—˜๋ฆฌ๋จผํŠธ๋กœ ์ „ํŒŒ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์บก์ณ๋ง์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ง€์›๋˜์ง€๋งŒ, IE8 ์ดํ•˜ ๋ฒ„์ „์—์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ HTML ์ฝ”๋“œ์—์„œ btn ์š”์†Œ์—์„œ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ด๋ฒคํŠธ๋Š” outer ์š”์†Œ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ inner ์š”์†Œ, ๊ทธ๋ฆฌ๊ณ  btn ์š”์†Œ๋กœ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ์บก์ณ๋ง์€ ์ด๋ฒคํŠธ ์ „ํŒŒ ์ˆœ์„œ๊ฐ€ ๋ถ€๋ชจ ์š”์†Œ์—์„œ ์ž์‹ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์š”์†Œ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์บ์น˜ํ•˜๊ฑฐ๋‚˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

<div id="outer">
  <div id="inner">
    <button id="btn">Click me</button>
  </div>
</div>

<script>
  const outer = document.getElementById("outer");
  const inner = document.getElementById("inner");
  const btn = document.getElementById("btn");

  outer.addEventListener("click", function() {
    console.log("outer clicked");
  }, true);

  inner.addEventListener("click", function() {
    console.log("inner clicked");
  }, true);

  btn.addEventListener("click", function() {
    console.log("button clicked");
  }, true);
</script>

์œ„ ์ฝ”๋“œ์—์„œ true ๊ฐ’์€ ์ด๋ฒคํŠธ ์บก์ณ๋ง์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. btn ์š”์†Œ์—์„œ ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ด๋ฒคํŠธ๋Š” outer ์š”์†Œ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ inner ์š”์†Œ, ๊ทธ๋ฆฌ๊ณ  btn ์š”์†Œ๋กœ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ˜์†”์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

outer clicked
inner clicked
button clicked
<body>
	<h1>hello, world</h1>
	<h4>๋‹ค์ค‘ ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ</h4>

	<button id="btn">๋ฒ„ํŠผ</button>
</body>

<script>
	var btn;

	function clickHandler1() {
		alert('clickHandler1');
	}

	function clickHandler2() {
		alert('clickHandler2');
	
		btn.removeEventListener('click', clickHandler2);
	// ์ฒซ ํด๋ฆญ์‹œ์—๋งŒ handler2๊ฐ€ ๋™์ž‘ํ•˜๊ณ , ์ดํ›„๋ถ€ํ„ฐ๋Š” handler2๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ
	}

	function init() {
		btn = document.querySelector('#btn');
		btn.addEventListener('click', clickHandler1);
		btn.addEventListener('click', clickHandler2); 
	}
	window.onload = init;

 </script>
<body>
	<h1>hello, world</h1>
	<h4>์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง</h4>
	
	<div id="parent">
   <div id="child"></div>
	</div>
</body>

<script>
	function childHandler(event) {
		alert('child');

		event.stopPropagation();
		// ๋ถ€๋ชจ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์†๋ฐ›์ง€ ์•Š๊ฒŒ ํ•ด์คŒ / ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง X
	}

	function parentHandler() {
		alert('parent');
	}

	function init() {
		document.querySelector('#child').onclick = childHandler;
		document.querySelector('#parent').onclick = parentHandler;
	}

	window.onload = init;

	</script>
<body>
	<h1>hello, world</h1>
	<h4>์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง</h4>

	<div id="parent">
	    <div id="child"></div>
	</div>
</body>

<script>
	function childHandler() {
		alert('child');
	}

	function parentHandler() {
		alert('parent');
	}
	
	function init() {
		document.querySelector('#child').onclick = childHandler;
		document.querySelector('#parent').onclick = parentHandler;
	}

	window.onload = init;
</script>
Thank You for Visiting My Blog, Have a Good Day ๐Ÿ˜†
ยฉ 2023 Developer JaeHyeon, Powered By Gatsby.