JavaScript - DOM

๋ฐ•์ข…ํ˜ธยท2024๋…„ 2์›” 2์ผ
0

FrontEnd

๋ชฉ๋ก ๋ณด๊ธฐ
17/17
post-thumbnail

DOM (Document Object Model)

๐Ÿ”ด DOM API ์ด๋ž€?

DOM ์€ HTML ๋ฌธ์„œ์˜ ๋‚ด์šฉ์„ ํŠธ๋ฆฌํ˜•ํƒœ๋กœ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ์›นํŽ˜์ด์ง€์™€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๊ฐ๊ฐ์˜ ์š”์†Œ์™€ ์†์„ฑ, ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋‹จ์œ„๋ฅผ '๋…ธ๋“œ(node)'๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ๋ฅผ ํƒํ—˜ํ•ด ๋ด…์‹œ๋‹ค.

document.head
document.body
document.body.childNodes
document.body.childNodes[1]
document.body.childNodes[1].tagName
document.body.childNodes[1].innerText
document.body.childNodes[1]. //์ ๋งŒ ์ฐ์–ด์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์• ํŠธ๋ฆฌ๋ทฐํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์„ธ์š”.
document.body.childNodes[2]
document.body.childNodes[2].data
๐Ÿง API๋Š”ย **Application Programming Interface** ์ž…๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ โ€˜์„ค๋ช…์„œโ€™๋ผ๊ณ  ๊ธฐ์–ตํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๐ŸŸ  DOM ํŠธ๋ฆฌ์— ์ ‘๊ทผํ•˜๊ธฐ

document ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด HTML ๋ฌธ์„œ์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. document๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ถˆ๋Ÿฌ์˜จ ์›นํŽ˜์ด์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, DOM ํŠธ๋ฆฌ์˜ ์ง„์ž…์  ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

// ํ•ด๋‹นํ•˜๋Š” Id๋ฅผ ๊ฐ€์ง„ ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ
document.getElementById();

// ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ
document.getElementsByTagName();

// ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ
document.getElementsByClassName();

// โญcss ์„ ํƒ์ž๋กœ ๋‹จ์ผ ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ, ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” ์š”์†Œ 1๊ฐœ
document.querySelector("selector");

// โญcss ์„ ํƒ์ž๋กœ ์—ฌ๋Ÿฌ ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ
document.querySelectorAll("selector");
๐Ÿค” **HTMLCollection๊ณผ NodeList**

getElementsByโ€ฆ ๋ฉ”์†Œ๋“œ์™€ querySelectorAll ๋ฉ”์†Œ๋“œ๋Š” ๋ชจ๋‘ ์กฐ๊ฑด์— ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ฐพ๋Š”๋‹ค๋Š” ๊ณตํ†ต์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์„ ์ฝ˜์†”์ฐฝ์—์„œ ํ™•์ธํ•˜๋ฉด ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค๋Š”๊ฒƒ์„ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

<article id="container">
    <ul>
        <li>ํƒ•์ˆ˜์œก</li>
        <li class="item-second">์œ ์‚ฐ์Šฌ</li>
        <li>์งœ์žฅ๋ฉด</li>
    </ul>
</article>

<script>
	const cont = document.getElementById('container');
	const item1 = cont.getElementsByTagName('li');
	const item3 = cont.querySelectorAll('li');
</script>

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€์„ ๋•Œ item1๊ณผ item3์„ ์ฝ˜์†”์— ์ฐ์–ด๋ณด๋ฉด ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

HTMLCollection๊ณผ NodeList ๋Š” ๋ชจ๋‘ ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•œ ๊ฐ์ฒด(array-like object) ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ์•ˆ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์›์†Œ์˜ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ์ง€๋งŒ,

๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ํ•ด๋‹น ๊ฐ์ฒด์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” DOM ์š”์†Œ์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. HTMLCollection์€ HTML๋งŒ ํฌํ•จํ•˜์ง€๋งŒ, NodeList๋Š” ๋ชจ๋“  ์œ ํ˜•์˜ DOM ์š”์†Œ ์ฆ‰, text, ์ฃผ์„ ๋“ฑ์„ ๋ชจ๋‘ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ฐจ์ด์ ์€ ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. HTMLCollection์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋ฉฐ, ํ•ด๋‹น ๊ฐ์ฒด์˜ ๊ฐ ์†์„ฑ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ฆ‰์‹œ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์—, NodeList๋Š” ์ •์ ์ด๋ฏ€๋กœ ํ•ด๋‹น ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. NodeList๋Š” forEach ๊ฐ™์€ ๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ HTMLCollection์€ ๋˜ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŸก DOM ์ œ์–ด ๋ช…๋ น์–ด

  1. ์ด๋ฒคํŠธ ์‚ฝ์ž…

target.addEventListener( type, listener )์˜ ๋ฌธ๋ฒ• ํ˜•ํƒœ๋ฅผ ์ง€๋‹™๋‹ˆ๋‹ค.

<button>HELLO!</button>
// ์ด๋ฒคํŠธ์˜ ํƒ€์ž…์—๋Š” click, mouseover, mouseout, wheel ๋“ฑ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
// listener ํ•จ์ˆ˜์˜ ์ธ์ˆ˜์—๋Š” ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.

const myBtn = document.querySelector("button");

myBtn.addEventListener('click', function(){
	console.log("hello world");
})
  1. ํด๋ž˜์Šค ์ œ์–ด

classList ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์š”์†Œ์˜ class ์†์„ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<button>Make me BLUE!</button>
const myBtn = document.querySelector("button");

myBtn.addEventListener('click', function(){

// blue ๋ผ๋Š” ํด๋ž˜์Šค์˜ ์†์„ฑ ๊ฐ’์„ ์ง€์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
	myBtn.classList.add("blue");

	// myBtn.classList.remove("blue");     ํด๋ž˜์Šค๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
	// myBtn.classList.toggle("blue");     ํด๋ž˜์Šค๋ฅผ ํ† ๊ธ€ํ•ฉ๋‹ˆ๋‹ค. ์—†์œผ๋ฉด ๋„ฃ์–ด์ฃผ๊ณ , ์žˆ์œผ๋ฉด ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
	// myBtn.classList.contains("blue");   ํ•ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
})
  1. ์š”์†Œ ์ œ์–ด

DOM api๋ฅผ ์ด์šฉํ•˜๋ฉด ์š”์†Œ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•˜๊ณ , ์œ„์น˜ํ•˜๊ณ , ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. document.createElement(target) : target ์š”์†Œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. document.createTextNode(target) : target ํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. element.appendChild(target) : target ์š”์†Œ๋ฅผ element์˜ ์ž์‹์œผ๋กœ ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
  4. element.removeChild(target) : element์˜ target ์ž์‹ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
<ul></ul>
<button>Make me MORE!</button>
const myBtn = document.querySelector("button");
const myUl = document.querySelector("ul");

myBtn.addEventListener('click', function(){
	for(let i=0; i < 5; i++){
		const myLi = document.createElement('li');
		myUl.appendChild(myLi);
	}
})
  1. element.append(target) : target ์š”์†Œ๋ฅผ element์˜ ์ž์‹์œผ๋กœ ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. appendChild ์™€ ๋‹ค๋ฅธ์ ์€ ๋…ธ๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ํ•œ๋ฒˆ์—, ๊ทธ๋ฆฌ๊ณ  ํ…์ŠคํŠธ๋„ ์ž์‹ ๋…ธ๋“œ๋กœ ํฌํ•จ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š”๊ฒƒ ์ž…๋‹ˆ๋‹ค.
  2. target.remove() : target ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
const myBtn = document.querySelector("button");
const myUl = document.querySelector("ul");

myBtn.addEventListener('click', function(){
	for(let i=0; i < 5; i++){
		const myLi = document.createElement('li');
		const btnDel = document.createElement('button');
    const btnTxt = document.createTextNode('๋ฒ„ํŠผ');

    btnDel.append(btnTxt);
		btnDel.addEventListener('click', ()=>{
			myLi.remove();
		});
		myLi.append('์‚ญ์ œํ•˜๊ธฐ: ', btnDel);
		myUl.appendChild(myLi);
    }
});
<div id="parentElement">
    <span id="childElement">hello guys~</span>
</div>
// parentElement.insertBefore(target, location); target์š”์†Œ๋ฅผ parentElement์˜ ์ž์‹์ธ location ์œ„์น˜ ์•ž์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

var span = document.createElement("span");
var sibling = document.getElementById("childElement");
var parentDiv = document.getElementById("parentElement");
parentDiv.insertBefore(span, sibling);
  1. JavaScript ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•ด element, text ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

DOM api๋ฅผ ์ด์šฉํ•˜๋ฉด ์š”์†Œ ์•ˆ์˜ ๊ฐ’์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<p></p>
<input type="text">
<button>Write Something!</button>
const myBtn = document.querySelector("button");
const myP = document.querySelector("p");
const myInput = document.querySelector("input");

myBtn.addEventListener('click', function(){
	myP.textContent = myInput.value;
});

// input ์š”์†Œ์— 'input' ์ด๋ฒคํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฐ’์ด ๋ฐ˜์˜๋˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
myInput.addEventListener('input', ()=>{
  myP.textContent = myInput.value;
});

โญ์ค‘์š”โญ myP.innerHTML = "<strong>I'm Strong!!</strong>";

// innerHTML ์€ ์š”์†Œ(element) ๋‚ด์— ํฌํ•จ๋œ HTML ๋งˆํฌ์—…์„ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์€ innerHTML๋กœ ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ, ๋งˆํฌ์—…์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด์ด ์žˆ๋‹ค๋ฉด ๋งˆํฌ์—…์œผ๋กœ ๋งŒ๋“ค์–ด ๋ณด์—ฌ์ค€๋‹ค๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋Ÿฐ ๋ฌธ์ž์—ด์ด ์—†๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋ฌธ์ž์—ด๋งŒ ์ปจํ…์ธ ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

// innerText ์†์„ฑ์€ ์š”์†Œ์˜ **๋ Œ๋”๋ง๋œ** ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (**๋ Œ๋”๋ง๋œ**์— ์ฃผ๋ชฉํ•˜์„ธ์š”. ****innerText๋Š” ํ…์ŠคํŠธ ๋‚ด์— ๋ฌธ๋ฒ•์ ์œผ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ…์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚œ ๊ฒฐ๊ณผ๋ฌผ์„ ํ…์ŠคํŠธ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.)

// textContent ์†์„ฑ์€ ๋…ธ๋“œ์˜ ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…์ธ ๋ฅผ ๋‹จ์ˆœํžˆ ํ…์ŠคํŠธ๋กœ๋งŒ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

โญ์ค‘์š”โญ innerHTML ์‚ฌ์šฉ์‹œ ์ฃผ์˜ ์‚ฌํ•ญhttps://developer.mozilla.org/ko/docs/Web/API/Element/innerHTML#security_considerations

โญ์ค‘์š”โญ ๐Ÿค” innerHTML ๋” ์ƒ๊ฐํ•ด๋ณด๊ธฐ ์œ„์˜ ๋‚ด์šฉ์„ ํ†ตํ•ด innerHTML์ด ์˜๋„์น˜ ์•Š๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ innerHTML์€ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋˜๋Š” ์†์„ฑ์ผ๊นŒ์š”? ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. innerHTML์€ ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด๊ณผ ์กฐํ•ฉํ•ด ๋ณต์žกํ•œ HTML ๊ตฌ์กฐ๋„ ๋™์ ์œผ๋กœ ์†์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋‹ˆ ๋‚˜์œ ์˜๋„๋ฅผ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅ ํ•  ์ˆ˜ ์—†๋„๋ก ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ ๊ฐ’์„ innerHTML์„ ํ†ตํ•ด ํ• ๋‹น ๋ฐ›๋Š” ์ผ๋งŒ ์—†๋„๋ก ํ•˜๋ฉด ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  innerText ํ˜น์€ textContent ์†์„ฑ์„ ์ด์šฉํ•ฉ์‹œ๋‹ค.

** innerText ์™€ textContent์˜ ์ฐจ์ด : https://developer.mozilla.org/ko/docs/Web/API/HTMLElement/innerText#์˜ˆ์ œ

๐Ÿค” innerText ๋” ์ƒ๊ฐํ•ด๋ณด๊ธฐ innerText ์†์„ฑ์€ ์š”์†Œ์˜ **๋ Œ๋”๋ง๋œ** ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ‘œํ˜„์ด ์• ๋งคํ•œ๋ฐ์š”, mdn ์— ๋”ฐ๋ฅด๋ฉด innerText๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ปค์„œ๋ฅผ ์ด์šฉํ•ด ์š”์†Œ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์„ ํƒํ•˜๊ณ  ํด๋ฆฝ๋ณด๋“œ์— ๋ณต์‚ฌํ–ˆ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ์˜ ๊ทผ์‚ฟ๊ฐ’์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ง์€ ์ฆ‰, ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋„ค์ด๋ฒ„ ๋ฉ”์ธํŽ˜์ด์ง€์˜ ํŠน์ • ํ…์ŠคํŠธ๋ฅผ ๋ณต์‚ฌ์—์„œ ๋ฉ”๋ชจ์žฅ์— ๋ถ™์—ฌ๋„ฃ๊ธฐํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„๋•Œ, ํ…์ŠคํŠธ์˜ ์ค„ ๋ฐ”๊ฟˆ๊ฐ™์€ ๊ฒƒ์€ ๊ฐ€์ ธ์˜ค์ง€๋งŒ ํฐํŠธ์˜ ๊ตถ๊ธฐ๋‚˜ ์ƒ‰์ƒ๊นŒ์ง€ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ innerText๋Š” display:none์œผ๋กœ ์ธํ•ด ์ œ๊ฑฐ๋˜๋Š” ํ…์ŠคํŠธ, br ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ์ค„ ๋ฐ”๊ฟˆ๋˜๋Š” ํ…์ŠคํŠธ์˜ 'ํ˜•ํƒœ' ๋Š” ์ธ์‹ํ•˜์ง€๋งŒ color ๋‚˜ ๊ตต๊ธฐ, ์‚ฌ์ด์ฆˆ ๋“ฑ ๊ณผ ๊ฐ™์€ ์ •๋ณด๋Š” ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์†์„ฑ ์ œ์–ดํ•˜๊ธฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์†Œ์˜ ์†์„ฑ์„ ์ œ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ์ œ์–ดํ•˜๋Š” style ๊ฐ์ฒด

์š”์†Œ๋Š” ๊ทธ ์•ˆ์— CSSStyleDeclaration ๊ฐ์ฒด๋ผ ๋ถˆ๋ฆฌ๋Š” style ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋Š” ์š”์†Œ์˜ ์Šคํƒ€์ผ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์Šคํƒ€์ผ๊ณผ ๊ด€๋ จํ•œ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

const target = document.querySelector("p");
const txtColor = target.style.color; // ํ˜„์žฌ ์Šคํƒ€์ผ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
target.style.color = "red"; // ํ˜„์žฌ ์Šคํƒ€์ผ ์ •๋ณด๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
target.style.fontWeight = "bold"; // ํ˜„์žฌ ์Šคํƒ€์ผ ์ •๋ณด์— font-weight ์†์„ฑ์ด ์—†๋‹ค๋ฉด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
target.style.color = null; // ํ˜„์žฌ ์Šคํƒ€์ผ ์ •๋ณด๋ฅผ ์ œ๊ฑฐ(์ดˆ๊ธฐํ™”)ํ•ฉ๋‹ˆ๋‹ค.
๐Ÿค” **style ๊ฐ์ฒด์˜ ์†์„ฑ ์‹๋ณ„์ž ๊ทœ์น™**
  • ์†์„ฑ ์ด๋ฆ„์ด ํ•œ ๊ธ€์ž๋ผ๋ฉด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (height, color โ€ฆ)
  • ์†์„ฑ ์ด๋ฆ„์ด ๋Œ€์‰ฌ(-) ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๋‹จ์–ด๋กœ ๋‚˜๋ˆ ์ ธ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์นด๋ฉœ์ผ€์ด์Šค๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (background-imageย โ‡’ ย backgroundImage)
  • float ์†์„ฑ์˜ ๊ฒฝ์šฐ ์ด๋ฏธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์˜ˆ์•ฝ์–ด๋กœ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—ย cssFloat์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

style ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์„ค์ •๋œ ์Šคํƒ€์ผ์€ CSS inline ์Šคํƒ€์ผ๊ณผ ๋™์ผํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— CSS๋ฅผ ํ†ตํ•ด ์ˆ˜์ •์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ์Šคํƒ€์ผ์—๋Š” ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํŽธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿด๊ฒฝ์šฐ classList๋ฅผ ์ด์šฉํ•œ ํด๋ž˜์Šค ์ œ์–ด๊ฐ€ ๋” ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

  1. ์†์„ฑ์— ์ ‘๊ทผํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” Attribute ๋ฉ”์†Œ๋“œ

    1. getAttribute ๋ฉ”์†Œ๋“œ๋Š” ์š”์†Œ์˜ ํŠน์ • ์†์„ฑ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
    2. setAttribute ๋ฉ”์†Œ๋“œ๋Š” ์š”์†Œ์˜ ํŠน์ • ์†์„ฑ ๊ฐ’์— ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
    
    <p id='myTxt'>hello lions</p>
    <img src='https://static.ebs.co.kr/images/public/lectures/2014/06/19/10/bhpImg/44deb98d-1c50-4073-9bd7-2c2c28d65f9e.jpg'>
    <script>
    	const target = document.querySelector('p');
    	const myimg = document.querySelector('img');
    	const idAttr = target.getAttribute('id');
    	console.log(idAttr);
    	myimg.setAttribute("src", "https://img.wendybook.com/image_detail/img159/159599_01.jpg");
    </script>
  1. ์š”์†Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” data ์†์„ฑ

    data-* ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด HTML ์š”์†Œ์— ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์—ฌ ๋งˆ์น˜ ํ”„๋กœ๊ทธ๋žจ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, data ์†์„ฑ์˜ ์ด๋ฆ„์—๋Š” ์ฝœ๋ก (:) ์ด๋‚˜ ์˜๋ฌธ ๋Œ€๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

    <img
        class="terran battle-cruiser"
        src="battle-cruiser.png"
        data-ship-id="324"
        data-weapons="laser"
        data-health="400"
        data-mana="250"
        data-skill="yamato-cannon"
    />
    <script>
        const img = document.querySelector('img')
        console.log(img.dataset);
        console.log(img.dataset.shipId);
    </script>
  1. ๋” ์ธ์ ‘ํ•œ๊ณณ(Adjacent)์œผ๋กœ ์ •๋ฐ€ํ•˜๊ฒŒ ๋ฐฐ์น˜ํ•˜๊ธฐ

insertAdjacentHTML : ์š”์†Œ ๋…ธ๋“œ๋ฅผ ๋Œ€์ƒ์˜ ์ธ์ ‘ํ•œ ์ฃผ๋ณ€์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

<strong class="sayHi">
    ๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค.
</strong>
const sayHi = document.querySelector('.sayHi');
sayHi.insertAdjacentHTML('beforebegin', '<span>์•ˆ๋…•ํ•˜์„ธ์š” ์ €๋Š”</span>');
sayHi.insertAdjacentHTML('afterbegin', '<span>์žฌํ˜„์ž…๋‹ˆ๋‹ค</span>');
sayHi.insertAdjacentHTML('beforeend', '<span>๋ฉด์ ‘์˜ค์‹œ๋ฉด</span>');
sayHi.insertAdjacentHTML('afterend', '<span>์น˜ํ‚จ์‚ฌ๋“œ๋ฆด๊ฒŒ์š”</span>');

์—ฌ๊ธฐ์„œ begin ์ด๋ž€ ์—ฌ๋Š” ํƒœ๊ทธ๋ฅผ, end ๋ž€ ๋‹ซ๋Š” ํƒœ๊ทธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  1. DOM ์•ˆ์—์„œ ๋…ธ๋“œ ํƒ์ƒ‰ํ•˜๊ธฐ
<!-- ์ฃผ์„์ž…๋‹ˆ๋‹ค ์ฃผ์„. -->
<article class="cont">
    <h1>์•ˆ๋…•ํ•˜์„ธ์š” ์ €๋Š” ์ด๋Ÿฐ ์‚ฌ๋žŒ์ž…๋‹ˆ๋‹ค.</h1>
    <p>์ง€๊ธˆ๋ถ€ํ„ฐ ์ž๊ธฐ์†Œ๊ฐœ ์˜ฌ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค</p>
    Lorem ipsum dolor sit amet consectetur adipisicing elit. Deserunt incidunt voluptates laudantium fugit, omnis
    dolore itaque esse exercitationem quam culpa praesentium, quisquam repudiandae aut. Molestias qui quas ea iure
    officiis.
    <strong>๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!</strong>
</article>
const cont = document.querySelector(".cont");
console.log(cont.firstElementChild);  // ์ฒซ๋ฒˆ์งธ ์ž์‹์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
console.log(cont.lastElementChild);   // ๋งˆ์ง€๋ง‰ ์ž์‹์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
console.log(cont.nextElementSibling); // ๋‹ค์Œ ํ˜•์ œ์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
console.log(cont.previousSibling);    // ์ด์ „ ํ˜•์ œ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
console.log(cont.children);           // ๋ชจ๋“  ์ž์‹์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
console.log(cont.childNodes);         // ๋ชจ๋“  ์ž์‹๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
console.log(cont.parentElement);      // ๋ถ€๋ชจ ์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
// ์ž๊ธฐ ์ž์‹ ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ๋ถ€๋ชจ๋กœ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด cont ํด๋ž˜์Šค ์š”์†Œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ๋‹จ, ํ˜•์ œ์š”์†Œ๋Š” ์ฐพ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
console.log(cont.querySelector('strong').closest('.cont').innerHTML);  

์ด๋ฒคํŠธ ๊ฐ์ฒด

์ด๋ฒคํŠธ์—์„œ ํ˜ธ์ถœ๋˜๋Š” ํ•ธ๋“ค๋Ÿฌ์—๋Š” ์ด๋ฒคํŠธ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ด๋ฒคํŠธ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค!

<article class="parent">
    <ol>
        <li><button class="btn-first" type="button">๋ฒ„ํŠผ1</button></li>
        <li><button type="button">๋ฒ„ํŠผ2</button></li>
        <li><button type="button">๋ฒ„ํŠผ3</button></li>
    </ol>
</article>
const btnFirst = document.querySelector('.btn-first');
btnFirst.addEventListener('click', (***event***) => {
    console.log(event);
});

์ด๋ฒคํŠธ ํ๋ฆ„

๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ๊ฐ€์žฅ ๋จผ์ € ์ด๋ฒคํŠธ ๋Œ€์ƒ์„ ์ฐพ๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

Untitled

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฒคํŠธ ๋Œ€์ƒ์„ ์ฐพ์•„๊ฐˆ ๋•Œ๋Š” ๊ฐ€์žฅ ์ƒ์œ„์˜ window ๊ฐ์ฒด๋ถ€ํ„ฐ document, body ์ˆœ์œผ๋กœ DOM ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ ๋‚ด๋ ค๊ฐ‘๋‹ˆ๋‹ค. ์ด๋ฅผ ์บก์ฒ˜๋ง ๋‹จ๊ณ„๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ ์ด๋ฒคํŠธ ๋Œ€์ƒ์„ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์—์„œ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ค‘๊ฐ„์— ๋งŒ๋‚˜๋Š” ๋ชจ๋“  ์บก์ฒ˜๋ง ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒคํŠธ ๋Œ€์ƒ์„ ์ฐพ๊ณ  ์บก์ฒ˜๋ง์ด ๋๋‚˜๋ฉด ์ด์ œ ๋‹ค์‹œ DOM ํŠธ๋ฆฌ๋ฅผ ๋”ฐ๋ผ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ๋งŒ๋‚˜๋Š” ๋ชจ๋“  ๋ฒ„๋ธ”๋ง ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง ๋‹จ๊ณ„๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๊ณผ์ •์—์„œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ฐจ๋ก€๋กœ ์‹คํ–‰๋˜๋Š”๊ฒƒ์„ ์ด๋ฒคํŠธ ์ „ํŒŒ(event propagation)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../reset.css">
    <style>
    </style>
</head>

<body>
    <article class="parent">
        <button class="btn" type="button">๋ฒ„ํŠผ</button>
    </article>

    <script>
        const parent = document.querySelector('.parent');
        const btnFirst = document.querySelector('.btn');
        btnFirst.addEventListener('click', (event) => {
            console.log("btn capture!");
        })

        window.addEventListener('click', () => {
            console.log("window capture!");
        }, true); // true : ์บก์ฒ˜๋ง ๋‹จ๊ณ„์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

        document.addEventListener('click', () => {
            console.log("document capture!");
        }, true);

        parent.addEventListener('click', () => {
            console.log("parent capture!");
        }, true);

        btnFirst.addEventListener('click', (event) => {
            console.log("btn bubble!");
        })

        parent.addEventListener('click', () => {
            console.log("parent bubble!");
        });

        document.addEventListener('click', () => {
            console.log("document bubble!");
        });

        window.addEventListener('click', () => {
            console.log("window bubble!");
        });
    </script>
</body>

</html>

์ด๋ฒคํŠธ target, currentTarget

๋ถ€๋ชจ๋ถ€ํ„ฐ ์ž์‹๊นŒ์ง€ ์ผ๋ จ์˜ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ํƒ€๊ณ ๊ฐ€๋ฉฐ ์ง„ํ–‰๋˜๋Š” ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ์˜ ํŠน์ง• ๋•๋ถ„์— ์ด๋ฒคํŠธ ๊ฐ์ฒด์—๋Š” target, currentTarget ์ด๋ผ๋Š” ์†์„ฑ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

target ์†์„ฑ์—๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์ง„์›์ง€์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค. target ์†์„ฑ์„ ํ†ตํ•ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์—†๋Š” ์š”์†Œ์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋„ ํ•ด๋‹น ์š”์†Œ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

currentTarget ์†์„ฑ์—๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์š”์†Œ๊ฐ€ ์ฐธ์กฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

<article class="parent">
    <ol>
        <li><button class="btn-first" type="button">๋ฒ„ํŠผ1</button></li>
        <li><button type="button">๋ฒ„ํŠผ2</button></li>
        <li><button type="button">๋ฒ„ํŠผ3</button></li>
    </ol>
</article>

<script>
    const parent = document.querySelector('.parent');
    parent.addEventListener('click', function (event) {
        console.log(event.target);
        console.log(event.currentTarget);
    })
</script>

์ด๋ฒคํŠธ ์œ„์ž„

์•ž์—์„œ ์šฐ๋ฆฌ๋Š” ์ด๋ฒคํŠธ์˜ ํ๋ฆ„์„ ํ†ตํ•ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์—†๋Š” ์š”์†Œ์˜ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋„ ํ•ด๋‹น ์š”์†Œ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์ด์šฉํ•ด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์—†์–ด๋„ ๋งˆ์น˜ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../reset.css">
    <style>
    </style>
</head>

<body>
    <article class="parent">
        <ol>
            <li><button class="btn-first" type="button">๋ฒ„ํŠผ1</button></li>
            <li><button type="button">๋ฒ„ํŠผ2</button></li>
            <li><button type="button">๋ฒ„ํŠผ3</button></li>
        </ol>
    </article>

    <script>
        const parent = document.querySelector('.parent');
        parent.addEventListener('click', function (event) {
            console.log(event.target);
            if (event.target.nodeName === "BUTTON") {
                event.target.textContent = "๋ฒ„ํŠผ4";
            }
        })
    </script>
</body>

</html>

์ด๋Ÿฌํ•œ ํ…Œํฌ๋‹‰์„ ์ด๋ฒคํŠธ ์œ„์ž„์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ์˜ this

์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ์˜ this ๊ฐ’์€ ์ด๋ฒคํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

<article class="parent">
    <ol>
        <li><button class="btn-first" type="button">๋ฒ„ํŠผ1</button></li>
        <li><button type="button">๋ฒ„ํŠผ2</button></li>
        <li><button type="button">๋ฒ„ํŠผ3</button></li>
    </ol>
</article>

<script>
    const parent = document.querySelector('.parent');
    parent.addEventListener('click', function (event) {
        console.log(this);
    });

		const myObj = {
        name: 'jaehyun',
        walk() {
            parent.addEventListener('click', () => {
                console.log(this.name + ' is walking');
            })
        }
    }
</script>

์ด๋Š” event.currentTarget ์†์„ฑ์˜ ์ฐธ์กฐ๊ฐ’๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

preventDefault()

๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ๋™์ž‘์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” HTML ํƒœ๊ทธ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋•Œ๋•Œ๋กœ ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ๋ฐฉํ•ด๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

<!-- ์•ต์ปค์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ค‘์ง€ -->
<a href="https://www.naver.com" class="link">๋„ค์ด๋ฒ„ ๋งํฌ์ž…๋‹ˆ๋‹ค๋งŒ..</a>
<script>
    const link = document.querySelector('.link');
    link.addEventListener('click', (event) => {
        console.log('clicked');
        event.preventDefault();
    })
</script>

<!-- submit ์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ค‘์ง€ -->
<form action="">
    <button type="submit" class="submit">์ œ์ถœ</button>
</form>
<script>
    const submit = document.querySelector('.submit');
    submit.addEventListener('click', (event) => {
        console.log('clicked');
        event.preventDefault();
    })
</script>

์ด๋ ‡๋“ฏ ์ข…์ข… ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ค‘์ง€ํ•˜๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ• ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

preventDefault ์‹ค์Šต

์ด๋ฒคํŠธ ํƒ€์ž… contextmenu๋ฅผ ์ด์šฉํ•ด ๋ธŒ๋ผ์šฐ์ € ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ๋ง‰๊ณ  'ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ๋Š” ์˜ค๋ฅธ์ชฝ ํด๋ฆญ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.โ€™ ๊ฒฝ๊ณ  ๋„์šฐ๊ธฐ

stopPropagation()

์•ž์—์„œ ์šฐ๋ฆฌ๋Š” preventDefault๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์˜ ๊ธฐ๋ณธ ์ด๋ฒคํŠธ ๋™์ž‘์„ ์ทจ์†Œํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋•Œ ์šฐ๋ฆฌ๊ฐ€ ์•ž์—์„œ ๋ฐฐ์› ๋˜ ์ด๋ฒคํŠธ ํ๋ฆ„, ์ฆ‰ ์ด๋ฒคํŠธ ์ „ํŒŒ(์ด๋ฒคํŠธ ํ”„๋กœํŒŒ๊ฒŒ์ด์…˜)๋ฅผ ๋ง‰์ง€๋Š” ๋ชปํ•ฉ๋‹ˆ๋‹ค.

<form action="">
	<button type="submit" class="submit">์ œ์ถœ</button>
</form>

<script>
	const submit = document.querySelector('.submit');
	submit.addEventListener('click', (event) => {
	    console.log('clicked');
	    event.preventDefault();
			// event.stopPropagation();
	});
	
	document.body.addEventListener('click', () => {
	    console.log('event still alive!');
	});
</script>

์ด๋•Œ ๋งŒ์•ฝ ์ด๋ฒคํŠธ ์ „ํŒŒ๋ฅผ ๋ง‰๊ณ  ์‹ถ๋‹ค๋ฉด event.stopPropagation() ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

stopPropagation() ์‹ค์Šต

<h1>๋‚˜์˜ todo list</h1>
<p>1. ์˜ค๋Š˜ ์ €๋…์—๋Š” ๋ถ€๋Œ€์ฐŒ๊ฒŒ๋ฅผ ๋“์—ฌ ๋จน๊ฒ ๋‹ค.<button type="button">์‚ญ์ œ</button></p>
<p>2. ํ›„์‹์œผ๋กœ ์ŠˆํŒ…์Šคํƒ€๋ฅผ ๋จน๊ฒ ๋‹ค.<button type="button">์‚ญ์ œ</button></p>
<p>3. ์ž๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๋‚ด์ผ ์•„์นจ ๋ฉ”๋‰ด๋ฅผ ์ƒ๊ฐํ•ด๋‘๊ฒ ๋‹ค.<button type="button">์‚ญ์ œ</button></p>

์œ„์™€ ๊ฐ™์€ HTML์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ์žˆ์„ ๋•Œ

  1. P ํƒœ๊ทธ๋ฅผ ํด๋ฆญํ•˜๋ฉด p ํƒœ๊ทธ์˜ ์ปจํ…์ธ ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” alert ์ฐฝ์„ ๋„์›Œ์ฃผ๊ณ 
  2. ์‚ญ์ œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์‚ญ์ œํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋ฌผ์–ด๋ณด๋Š” confirm ์ฐฝ์„ ๋„์›Œ์ฃผ๊ณ , ํ™•์ธ์„ ๋ˆ„๋ฅด๋ฉด Pํƒœ๊ทธ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
profile
Hey๐Ÿ–๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด