๐ ์ด๋ฒคํธ(event)๋ ๋ฌด์์ธ๊ฐ์?
์ด๋ฒคํธ๋ ํ๋ก๊ทธ๋๋ฐํ๊ณ ์๋ ์์คํ
์์ ์ผ์ด๋๋ ์ฌ๊ฑด ํน์ ๋ฐ์์
๋๋ค. ์ด๊ฒ์ ๋ฌด์ธ๊ฐ ์ผ์ด๋ฌ๋ค๋ ์ ํธ์
๋๋ค. ์ฐธ๊ณ ๋ก, ์ด๋ฒคํธ๋ DOM์๋ง ํ์ ๋์ง ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ํด๋ฆญ, ํค๋ณด๋ ์
๋ ฅ, ๋ง์ฐ์ค ์ด๋ ๋ฑ์ด ์ผ์ด๋ฌ์ ๋ ์ด๋ฅผ ๊ฐ์งํ์ฌ ํน์ ํ ํ์
์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์
๋๋ค.
์น ์ด๋ฒคํธ๋ ์ฝ์ด JavaScript ์ธ์ด์ ์ผ๋ถ๊ฐ ์๋๋๋ค. ์ด๊ฒ๋ค์ ๋ธ๋ผ์ฐ์ ์ ๋ด์ฅ๋ API์ ์ผ๋ถ๋ก์ ์ ์๋ฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์
์ด ํน์ ์ด๋ฒคํธ์ ๋ํด ๋ฐ์ํ์ฌ ์ด๋ค ์ผ์ ํ๊ณ ์ถ๋ค๋ฉด ํด๋นํ๋ ํ์
์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ํธ์ถ๋ ํจ์๋ฅผ ๋ธ๋ผ์ฐ์ ์๊ฒ ์๋ ค ํธ์ถ์ ์์ํฉ๋๋ค.
์ด๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ํธ์ถ๋ ํจ์๋ฅผ ์ด๋ฒคํธ ํธ๋ค๋ฌ(event handler) ๋ผ ํ๊ณ (์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ๋๋๋ก ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.), ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๋ธ๋ผ์ฐ์ ์๊ฒ ์ด๋ฒคํธํธ๋ค๋ฌ์ ํธ์ถ์ ์์ํ๋ ๊ฒ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฑ๋ก(register) ์ด๋ผ๊ณ ํฉ๋๋ค.
๐ ์ด๋ฒคํธ ์ ํ
DOM ํธ๋ฆฌ ์์ ์กด์ฌํ๋ DOM ์์ ๋
ธ๋์์ ๋ฐ์ํ ์ด๋ฒคํธ๋ DOM ํธ๋ฆฌ๋ฅผ ํตํด ์ ํ๋ฉ๋๋ค. ์ด๋ฅผ ์ด๋ฒคํธ ์ ํ(event propagation)๋ผ๊ณ ํฉ๋๋ค.
์ ํ๋๋ ๋ฐฉํฅ์ ๋ฐ๋ผ์ ๋ฒ๋ธ๋ง๊ณผ ์บก์ฒ๋ง์ผ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
์ด๋ฒคํธ ๋ฒ๋ธ๋ง๊ณผ ์บก์ฒ๋ง์ ์ด๋ฒคํธ ์์์ ํ ๋๊ฐ ๋๋ฏ๋ก ์ ์ ์์๋ณด๊ณ ๊ฐ๊ฒ ์ต๋๋ค.
<html>
<body>
<ul id="fruits">
<li id="apple">Apple</li>
<li id="banana">Banana</li>
<li id="orange">Orange</li>
</ul>
</body>
</html>
ul ์์์ ๋ ๋ฒ์งธ ์์ ์์์ธ li ์์๋ฅผ ํด๋ฆญํ๋ฉด ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์์ฑ๋ ์ด๋ฒคํธ ๊ฐ์ฒด๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ DOM ์์์ธ ์ด๋ฒคํธ ํ๊น์ ์ค์ฌ์ผ๋ก DOM ํธ๋ฆฌ๋ฅผ ํตํด ์ ํ๋ฉ๋๋ค.
์ด๋ฒคํธ ์ ํ๋ ์ด๋ฒคํธ ๊ฐ์ฒด๊ฐ ์ ํ๋๋ ๋ฐฉํฅ์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ด 3๋จ๊ณ๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
- ์บก์ฒ๋ง ๋จ๊ณ(capturing phase) : ์ด๋ฒคํธ๊ฐ ์์ ์์์์ ํ์ ์์ ๋ฐฉํฅ์ผ๋ก ์ ํ
: ์์ ์์์์ ๋ฐ์ํ ์ด๋ฒคํธ๊ฐ ๋ถ๋ชจ ์์๋ถํฐ ์์ํ์ฌ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ์์ ์์๊น์ง ๋๋ฌํ๋ ๊ฒ - ํ๊น ๋จ๊ณ(target phase) : ์ด๋ฒคํธ๊ฐ ์ด๋ฒคํธ ํ๊น์ ๋๋ฌ
- ๋ฒ๋ธ๋ง ๋จ๊ณ(bubbling phase) : ์ด๋ฒคํธ๊ฐ ํ์ ์์์์ ์์ ์์ ๋ฐฉํฅ์ผ๋ก ์ ํ
: ์์ ์์์์ ๋ฐ์ํ ์ด๋ฒคํธ๊ฐ ๋ถ๋ชจ ์์๋ก ์ ํ๋๋ ๊ฒ
์ฃผ์ํ ๊ฒ์ ๋ฒ๋ธ๋ง๊ณผ ์บก์ฒ๋ง์ ๋ ์ค์ ํ๋๋ง ๋ฐ์ํ๋ ๊ฒ์ด ์๋๋ผ ์บก์ฒ๋ง๋ถํฐ ์์ํ์ฌ ๋ฒ๋ธ๋ง์ผ๋ก ์ข ๋ฃํฉ๋๋ค. ์ฆ, ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์บก์ฒ๋ง๊ณผ ๋ฒ๋ธ๋ง์ ์์ฐจ์ ์ผ๋ก ๋ฐ์ํฉ๋๋ค.
๐ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง
<style>
body * {
margin: 10px;
border: 1px solid blue;
}
</style>
<form onclick="alert('form')">FORM
<div onclick="alert('div')">DIV
<p onclick="alert('p')">P</p>
</div>
</form>
๊ฐ์ฅ ์์ชฝ์ <p>
๋ฅผ ํด๋ฆญํ๋ฉด ์์๋๋ก ๋ค์๊ณผ ๊ฐ์ ์ผ์ด ๋ฒ์ด์ง๋๋ค.
<p>
์ ํ ๋น๋ onclick ํธ๋ค๋ฌ๊ฐ ๋์ํฉ๋๋ค.- ๋ฐ๊นฅ์
<div>
์ ํ ๋น๋ ํธ๋ค๋ฌ๊ฐ ๋์ํฉ๋๋ค. - ๊ทธ ๋ฐ๊นฅ์
<form>
์ ํ ๋น๋ ํธ๋ค๋ฌ๊ฐ ๋์ํฉ๋๋ค. - document ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋๊น์ง, ๊ฐ ์์์ ํ ๋น๋ onclick ํธ๋ค๋ฌ๊ฐ ๋์ํฉ๋๋ค.
์ด๋ฐ ํ๋ฆ์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด๋ผ๊ณ ํฉ๋๋ค.์ด๋ฒคํธ๊ฐ ์ ์ผ ๊น์ ๊ณณ์ ์๋ ์์์์ ์์ํด ๋ถ๋ชจ ์์๋ฅผ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ ๋ชจ์ต์ด ๋ง์น ๋ฌผ์ ๊ฑฐํ์ ๋ฎ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ช๋ช ์ด๋ฒคํธ๋ฅผ ์ ์ธํ๊ณค ๋๋ถ๋ถ์ ์ด๋ฒคํธ๋ ๋ฒ๋ธ๋ง ๋ฉ๋๋ค.
- ํฌ์ปค์ค ์ด๋ฒคํธ : focus/blur
- ๋ฆฌ์์ค ์ด๋ฒคํธ : load/unload/abort/error
- ๋ง์ฐ์ค ์ด๋ฒคํธ : mouseenter/mouseleave
์ ์ด๋ฒคํธ๋ ๋ฒ๋ธ๋ง์ ํตํด ์ ํ๋์ง ์์ต๋๋ค. ์ด ์ด๋ฒคํธ๋ค์ ๋ฒ๋ธ๋ง์ ํตํด ์ด๋ฒคํธ๋ฅผ ์ ํํ๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ์ด๋ฒคํธ ๊ฐ์ฒด์ ๊ณตํต ํ๋กํผํฐ์ธevent.bubbles
์ ๊ฐ์ด ๋ชจ๋ false์ ๋๋ค.
๐ ์ด๋ฒคํธ ์์
์บก์ฒ๋ง๊ณผ ๋ฒ๋ธ๋ง์ ํ์ฉํ๋ฉด ๊ฐ๋ ฅํ ์ด๋ฒคํธ ํธ๋ค๋ง ํจํด์ธ ์ด๋ฒคํธ ์์(event delegation) ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด๋ฒคํธ ์์์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์ฌ๋ฌ ์์๋ฅผ ๋ค๋ค์ผ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฒคํธ ์์์ ์ฌ์ฉํ๋ฉด ์์๋ง๋ค ํธ๋ค๋ฌ๋ฅผ ํ ๋นํ์ง ์๊ณ , ์์์ ๊ณตํต ์กฐ์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋จ ํ๋ ๋ง ํ ๋นํด๋ ์ฌ๋ฌ ์์๋ฅผ ํ๊บผ๋ฒ์ ๋ค๋ฃฐ ์ ์์ต๋๋ค.
<ul id="post-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์์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํ๊ฒ ๋๋ฉด ์ด 6๊ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉํด์ผ ํฉ๋๋ค. ๋ง์ผ li์์๊ฐ 100๊ฐ๋ผ๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ 100๊ฐ๋ ๋ง๋ค์ด์ผ ํ ๊น์? ๋ง์ฝ์ ๋์ ์ผ๋ก li์์๊ฐ ์ถ๊ฐ๋๊ฒ ๋๋ค๋ฉด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉ ํ ์ ์์๊น์?
์ด๋ฌํ ๊ฒฝ์ฐ์ ์ด๋ฒคํธ ์์์ ์ฌ์ฉํฉ๋๋ค.
6๊ฐ์ li ์์์ ๋ชจ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉ ํ๋ ๋์ ์ ๋ถ๋ชจ ์์์ธ <ul>
์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๋ฐ์ธ๋ฉ ํด์ฃผ๋ฉด ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด ๋์ ์ผ๋ก ์์ดํ
์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์๋ ์ด๋ฒคํธ๋ฅผ ๋ค์ ๋ฐ์ธ๋ฉํ ํ์๊ฐ ์์ด์ง๋๋ค.
์ด๋ ์ด๋ฒคํธ๊ฐ ์ด๋ฒคํธ ํ๋ฆ์ ์ํด ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ ์์์ ๋ถ๋ชจ ์์์๋ ์ํฅ(๋ฒ๋ธ๋ง)์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๊ฒ์
๋๋ค.
์กฐ์์ ํ ๋นํ ์ด๋ฒคํธ ํธ๋ค๋ฌ์์ event.target
์ ์ด์ฉํ๋ฉด ์ค์ ๋ก ์ด๋์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋์ง ์ ์ ์์ต๋๋ค.
๐ ์ด๋ฒคํธ ์์์ ์ฅ์
- ๋ง์ ํธ๋ค๋ฌ๋ฅผ ํ ๋นํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ฝ๋ฉ๋๋ค.
- ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ๋ ํด๋น ์์์ ํ ๋น๋ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ์งง์์ง๋๋ค.
- innerHTML์ด๋ ์ ์ฌํ ๊ธฐ๋ฅ์ ํ๋ ์คํฌ๋ฆฝํธ๋ก ์์ ๋ฉ์ด๋ฆฌ๋ฅผ ๋ํ๊ฑฐ๋ ๋บ ์ ์๊ธฐ ๋๋ฌธ์ DOM ์์ ์ด ์ฌ์์ง๋๋ค.
๐ ์ด๋ฒคํธ ์์์ ๋จ์
- ์ด๋ฒคํธ ์์์ ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฐ๋์ ๋ฒ๋ธ๋ง ๋์ด์ผ ํฉ๋๋ค. ํ์ง๋ง ๋ช๋ช ์ด๋ฒคํธ๋ ๋ฒ๋ธ๋ง ๋์ง ์๋ค๋ ๊ฑธ ๊ณ ๋ คํด์ผํฉ๋๋ค.
- ์ปจํ ์ด๋ ์์ค์ ํ ๋น๋ ํธ๋ค๋ฌ๊ฐ ์๋ตํ ํ์๊ฐ ์๋ ์ด๋ฒคํธ์ด๋ ์๋๋ ์๊ด์์ด ๋ชจ๋ ํ์ ์ปจํ ์ด๋์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ์ ์๋ตํด์ผ ํ๋ฏ๋ก CPU ์์ ๋ถํ๊ฐ ๋์ด๋ ์ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฐ ๋ถํ๋ ๋ฌด์ํ ๋งํ ์์ค์ด๋ฏ๋ก ์ค์ ๋ก๋ ์ ๊ณ ๋ คํ์ง ์์ต๋๋ค.
์ถ์ฒ ๋ฐ ์ฐธ๊ณ
- poiemaweb
- javascript.info
- ์ฑ ๋ชจ๋์๋ฐ์คํฌ๋ฆฝํธ Deep Dive
'Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] promise, async, await ์ฐ์ง ์๊ณ parallel, waterfall ๊ตฌํํ๊ธฐ (0) | 2022.06.03 |
---|---|
[JS] Promise, Await ๋น๋๊ธฐ์ ๋ํด ์์๋ณด๊ธฐ (0) | 2022.06.01 |
[JS] JavaScript์ ํ์ ๊ฒ์ฌ (0) | 2022.05.29 |
[JS] ์์๋ณ์๋ฅผ ์ค์ฌ์ผ ํ๋ ์ด์ (ํด๋ฆฐ ์ฝ๋) (0) | 2022.05.27 |
[JS] JavaScript์์ 0.1 + 0.2๋ 0.3์ผ๊น? (JS๊ฐ ์ซ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์) (0) | 2022.05.17 |