๐Ÿ“ŒLanguage/JavaScript

TIL) DOM ๊ธฐ์ดˆ, DOM ๋‹ค๋ฃจ๊ธฐ, CRUD, ๋ถ€๋ชจ, ์ž์‹, ํ˜•์ œ ์ฐพ๊ธฐ

hellohailie 2022. 5. 17. 15:40

 

 

DOM (Document Object Model)

DOM์€ HTML ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋ฌผ์ด๋‹ค. 

HTML ๋ฌธ์„œ์˜ ๊ณ„์ธต์  ๊ตฌ์กฐ์™€ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ ์ด๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” API, ์ฆ‰ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŠธ๋ฆฌ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. 

HTML ์š”์†Œ๋ฅผ Object(JavaScript Object)์ฒ˜๋Ÿผ ์กฐ์ž‘(Manipulation)ํ•  ์ˆ˜ ์žˆ๋Š” Model์ด๋‹ค. ์ฆ‰, JavaScript๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด, DOM์œผ๋กœ HTML์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

DOM์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•œ๋‹ค.
DOM์˜ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ณ , HTML๊ณผ DOM์ด ์–ด๋–ป๊ฒŒ ๋‹ฎ์•„์žˆ๋Š”์ง€ ์ดํ•ดํ•œ๋‹ค.
HTML์—์„œ JavaScript ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์ฃผ์˜์ ์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•œ๋‹ค.
[์‹ฌํ™”]DOM๊ณผ JavaScript์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

HTML์— JavaScript๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” <script> ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•œ๋‹ค. 

 

<script src="ํŒŒ์ผ๋ช….js"></script>

 

์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋Š” ๊ณผ์ •์—์„œ <script> ์š”์†Œ๋ฅผ ๋งŒ๋‚˜๋ฉด, ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” HTML ํ•ด์„์„ ์ž ์‹œ ๋ฉˆ์ถ˜๋‹ค.

HTML ํ•ด์„์„ ์ž ์‹œ ๋ฉˆ์ถ˜ ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” <script> ์š”์†Œ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•œ๋‹ค.

<script> ์š”์†Œ๋Š” ๋“ฑ์žฅ๊ณผ ํ•จ๊ป˜ ์‹คํ–‰๋œ๋‹คโญ๏ธ

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ DOM์€ document ๊ฐ์ฒด์— ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ๋Š”, ์–ด๋””์—์„œ๋‚˜ document ๊ฐ์ฒด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋ถ€๋ชจ, ์ž์‹, ํ˜•์ œ ์ฐพ๊ธฐ, ์„ ํƒํ•˜๊ธฐ (childNodes, parentNode, Sibling)
<div id=mother>
    <div id=one></div>
    <div id=two></div>
    <div id=three></div>
</div>

 

๋ถ€๋ชจ๊ฐ€ ์ž์‹ ์ฐพ๊ธฐchildNodes

// ๋ถ€๋ชจ ์ƒ์„ฑ
var mother = document.getElementById('mother');
// ๋ชจ๋“  ์ž์‹ ์ฐพ๊ธฐ
var every = mother.childNodes;
// ์ฒซ๋ฒˆ์งธ ์ž์‹ ์ฐพ๊ธฐ
var one = mother.firstChild;
// ์„ธ๋ฒˆ์งธ ์ž์‹ ์ฐพ๊ธฐ
var three = mother.lastChild;

 

์ž์‹์ด ๋ถ€๋ชจ ์ฐพ๊ธฐ parentNode

var one = document.getElementById('one');
var mother = one.parentNode;

 

ํ˜•์ œ ์ฐพ๊ธฐ Sibling

var one = document.getElementById('one');
var two = one.nextSibling;
var one = two.previousSibling;


์ถœ์ฒ˜: https://itun.tistory.com/501 [Bino]

 

 


DOM ๋‹ค๋ฃจ๊ธฐ

 

CRUD(Create, Read, Update and Delete)๋ฅผ ์ดํ•ดํ•œ ํ›„ ์„ธ์„ธํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์•Œ์ž!

DOM์„ JavaScript๋กœ ์กฐ์ž‘ํ•˜์—ฌ HTML Element๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. (CREATE)
DOM์„ JavaScript๋กœ ์กฐ์ž‘ํ•˜์—ฌ HTML Element๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. (READ)
DOM์„ JavaScript๋กœ ์กฐ์ž‘ํ•˜์—ฌ HTML Element๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. (UPDATE)
DOM์„ JavaScript๋กœ ์กฐ์ž‘ํ•˜์—ฌ HTML Element๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. (DELETE)
์ƒ์„ฑํ•œ HTML Element๋ฅผ ๋ถ€๋ชจ ์—˜๋ฆฌ๋จผํŠธ์˜ ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋กœ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค. (APPEND)
innerHTML๊ณผ textContent์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•œ๋‹ค.

์‹ฌํ™”

DOM๊ณผ JavaScript์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
createDocumentFragment๋ฅผ ํ™œ์šฉํ•˜์—ฌ, ๋” ํšจ์œจ์ ์œผ๋กœ DOM์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
HTML5 template tag ์‚ฌ์šฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
element์™€ node์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
children๊ณผ childNodes์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
remove์™€ removeChild์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.
๊ฐ™์€ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ appendChild ํ•˜๋ฉด, ๊ธฐ์กด ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ณต์‚ฌํ• ๊นŒ?
offsetTop ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ์ขŒํ‘œ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
offsetWidth ๋“ฑ์„ ์ด์šฉํ•˜์—ฌ ํฌ๊ธฐ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

*๋ Œ๋” ํŠธ๋ฆฌ๋Š” ๋ Œ๋”๋ง์„ ์œ„ํ•œ ํŠธ๋ฆฌ ๊ตฌ์กฐ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. (๋ธŒ๋ผ์šฐ์ € ํ™”๋ฉด์— ๋ Œ๋”๋ง๋˜๋Š” ๋…ธ๋“œ๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.)

ex) meta ํƒœ๊ทธ, scriptํƒœ๊ทธ, display:none ๋“ฑ์€ ๋…ธ๋“œ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค. 

DOM์„ JavaScript๋กœ ์กฐ์ž‘ํ•˜์—ฌ HTML Element๋ฅผ ์ถ”๊ฐ€ (CRUD) .createElement()

 

โœ”๏ธ ์ƒˆ๋กœ์šด <div> ์š”์†Œ๋ฅผ ๋งŒ๋“ค๊ธฐ ๐Ÿ‘‡

document.createElement('div')

 

 


CREATE์—์„œ ์ƒ์„ฑํ•œ tweetDiv๋ฅผ *ํŠธ๋ฆฌ ๊ตฌ์กฐ์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ .append()

<๊ธฐ์กด html>

 

 

 

1. 'div'์š”์†Œ (element)๋ฅผ ์ƒ์„ฑํ•ด์„œ tweetDiv ๋ณ€์ˆ˜์— ๋„ฃ์–ด์ค€๋‹ค. 

2. body ์•ˆ์— ๋„ฃ์–ด์ค€๋‹ค. 

 

 

<div>๊ฐ€ body ์•ˆ์— ๋“ค์–ด๊ฐ”๋‹ค!

id๊ฐ€ contianer์ธ <div>์™€๋Š” ํ˜•์ œ์ด๋‹ค. 

 

 

 


DOM์„ JavaScript๋กœ ์กฐ์ž‘ํ•˜์—ฌ HTML Element๋ฅผ ์กฐํšŒ (CRUD) querySelector

 

HTML ์š”์†Œ("div"), id("#tweetList"), class(.tweet)๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. 

const getOneTweet = document.getElementById('container')
const queryOneTweet = document.querySelector('#container')

 

 

<div>๋ฅผ ์ƒ์„ฑํ•ด์„œ id๊ฐ€ contianer์ธ <div>์•ˆ์— ๋„ฃ์–ด๋ณด์ž!

1. id๊ฐ€ contianer์ธ ์š”์†Œ๋ฅผ ์ฐพ์•„์„œ container๋ผ๋Š” ๋ณ€์ˆ˜์— ๋„ฃ์–ด์ฃผ์ž.

2. <div>๋ฅผ ์ƒ์„ฑํ•ด์„œ tweetDiv๋ผ๋Š” ๋ณ€์ˆ˜์— ๋„ฃ์–ด์ฃผ์ž.

3. container์— append๋ฅผ ์‚ฌ์šฉํ•ด์„œ tweetDiv๋ฅผ ๋„ฃ์ž!

 

 

๊ฒฐ๊ณผ

 

 


DOM์„ JavaScript๋กœ ์กฐ์ž‘ํ•˜์—ฌ HTML Element๋ฅผ ๋ณ€๊ฒฝ (CRUD) .textContent = '';

 

 

โœ”๏ธ 'div' ์š”์†Œ ์ƒ์ƒ ํ›„, textContent๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์—ด์„ ์ž…๋ ฅํ•˜๊ธฐ ๐Ÿ‘‡

const oneDiv = document.createElement('div');
oneDiv.textContent = 'dev';
console.log(oneDiv) // <div>dev</div>

 

 

โœ”๏ธ classList.add๋ฅผ ์ด์šฉํ•ด 'tweet' ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๐Ÿ‘‡

oneDiv.classList.add('tweet')
console.log(oneDiv) // <div class="tweet">dev</div>

 

์ถ”๊ฐ€๊ณต๋ถ€

.setAttribute() => ์š”์†Œ์˜ ์†์„ฑ ๊ฐ’์„ ์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ

element.setAttribute( 'attributename', 'attributevalue' )

โฌ†๏ธ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•

attributename์—๋Š” ์†์„ฑ ์ด๋ฆ„์„, attributevalue์—๋Š” ์†์„ฑ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.

 

 

document.getElementById( 'xyz' ).setAttribute( 'title', 'This is title' )

id๊ฐ€ 'xyz'์ธ ์š”์†Œ์˜ ์†์„ฑ ์ด๋ฆ„์„ title๋กœ, ์†์„ฑ๊ฐ’์„ 'This is title'๋กœ ์ •ํ•œ๋‹ค. 

๋งŒ์•ฝ ์ด๋ฏธ ์†์„ฑ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ์ง€์šฐ๊ณ  ์ƒˆ ๊ฐ’์„ ์ ์šฉํ•œ๋‹ค.

 

 

 


DOM์„ JavaScript๋กœ ์กฐ์ž‘ํ•˜์—ฌ HTML Element๋ฅผ ์‚ญ์ œ (CRUD

 

์‚ญ์ œ ์ „ ์˜ค๋ฆฌ์ง€๋‚  HTML ์ฝ”๋“œ

 

1-1. ์‚ญ์ œํ•˜๋ ค๋Š” ์š”์†Œ์˜ ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ

 

const container = document.querySelector('#container')
const tweetDiv = document.createElement('div')
container.append(tweetDiv)
tweetDiv.remove() // ์ด๋ ‡๊ฒŒ append ํ–ˆ๋˜ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1-2. ์‚ญ์ œํ•  class ์ด๋ฆ„์„ ์•„๋Š” ๊ฒฝ์šฐ classList.remove('class name');

let elFailureMessage = document.querySelector('.failure-message');
console.log(elFailureMessage);

elFailureMessage.classList.remove('hide');

 

 

2-1. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์‹ ์š”์†Œ๋ฅผ ์ง€์šธ ๋•Œ innerHTML

 

document.querySelector('#container').innerHTML = '';

 

๐Ÿ”ดํ•˜์ง€๋งŒ innerHTML์€ ์‚ฌ์ดํŠธ์˜ ๊ณต๊ฒฉ ๊ฒฝ๋กœ๊ฐ€ ๋˜์–ด ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์œ„ํ—˜์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.  //

์ฐธ๊ณ )<script> ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด harmless!!

 

๋”ฐ๋ผ์„œ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋ฅผ ์‚ฝ์ž… ํ•  ๋•Œ๋Š” innerHTML ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋Œ€์‹  ์ „๋‹ฌ ๋œ ๋‚ด์šฉ์„ HTML๋กœ ํŒŒ์‹ฑํ•˜์ง€ ์•Š๊ณ  ์›์‹œ ํ…์ŠคํŠธ(raw text)๋กœ ์‚ฝ์ž…ํ•˜๋Š” Node.textContent๋ฅผ ์‚ฌ์šฉ์„ ๊ถŒ๊ณ ํ•œ๋‹ค. 

 

 

2-2. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž์‹ ์š”์†Œ๋ฅผ ์ง€์šธ ๋•Œ removeChild

 

const container = document.querySelector('#container');
while (container.firstChild) {
  container.removeChild(container.firstChild);
}

=> removeChild ์™€ while ์„ ์ด์šฉํ•ด ์ž์‹ ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด, ์ œ๋ชฉ์— ํ•ด๋‹นํ•˜๋Š” H2 "Tweet List"๊นŒ์ง€ ์‚ญ์ œ๋œ๋‹ค. 

 

 

 

3-1. ๋ถ€๋ถ„์‚ญ์ œ ํ•˜๊ธฐ 

 

container์˜ ์ž์‹ ์š”์†Œ๊ฐ€ 1๊ฐœ๋งŒ ๋‚จ์„ ๋•Œ๊นŒ์ง€, ๋งˆ์ง€๋ง‰ ์ž์‹ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ๐Ÿ‘‡

 

const container = document.querySelector('#container');
while (container.children.length > 1) {
  container.removeChild(container.lastChild);
}

 

3-2. ๋ถ€๋ถ„์‚ญ์ œ ํ•˜๊ธฐ

 

ํด๋ž˜์Šค ์ด๋ฆ„์ด tweet์ธ ์š”์†Œ๋งŒ ์ฐพ์•„์„œ ์ œ๊ฑฐํ•˜๊ธฐ ๐Ÿ‘‡

const tweets = document.querySelectorAll('.tweet')
tweets.forEach(function(tweet){
    tweet.remove();
})

or

const tweets = document.querySelectorAll('.tweet')
for (let tweet of tweets){
    tweet.remove()
}

 

์ถ”๊ฐ€๊ณต๋ถ€ ํ•„์š”

forEach