DOMì ì´ì©íë©´ ììì ììì ì½í ì¸ ì 무ìì´ë í ì ììµëë¤. íì§ë§ 무ì¸ê°ë¥¼ í기 ì ì, ë¹ì°í ì¡°ìíê³ ì íë DOM ê°ì²´ì ì ê·¼íë ê²ì´ ì íëì´ì¼ í©ëë¤.
DOMì ìííë 모ë ì°ì°ì document ê°ì²´ìì ììí©ëë¤. document ê°ì²´ë DOMì ì ê·¼í기 ìí 'ì§ì
ì âì´ì£ . ì§ì
ì ì íµê³¼íë©´ ì´ë¤ ë
¸ëìë ì ê·¼í ì ììµëë¤.
ìë 그림ì DOM ë ¸ë íìì´ ì´ë¤ ê´ê³ë¥¼ íµí´ ì´ë£¨ì´ì§ëì§ë¥¼ ë³´ì¬ì¤ëë¤.
íì´íë¡ ëíë¸ ê´ê³ì ëíì¬ ì¢ ë ìì¸í ììë´ ìë¤.
í¸ë¦¬ ìë¨ì documentElementì body
DOM í¸ë¦¬ ìë¨ì ë
¸ëë¤ì documentê° ì ê³µíë íë¡í¼í°ë¥¼ ì¬ì©í´ ì ê·¼í ì ììµëë¤.
<html>=document.documentElementdocument를 ì ì¸íê³ DOM í¸ë¦¬ ê¼ë기ì ìë 문ì ë ¸ëë<html>íê·¸ì í´ë¹íëdocument.documentElementì ëë¤.<body>=document.bodydocument.bodyë<body>ììì í´ë¹íë DOM ë ¸ëë¡, ì주 ì°ì´ë ë ¸ë ì¤ íëì ëë¤.<head>=document.head<head>íê·¸ëdocument.headë¡ ì ê·¼í ì ììµëë¤.
document.bodyê° nullì¼ ìë ìì¼ë 주ìíì¸ì.ì¤í¬ë¦½í¸ë¥¼ ì½ë ëì¤ì ì¡´ì¬íì§ ìë ììë ì¤í¬ë¦½í¸ìì ì ê·¼í ì ììµëë¤.
ë¸ë¼ì°ì ê° ìì§ document.body를 ì½ì§ ìì기 ë문ì <head> ìì ìë ì¤í¬ë¦½í¸ìì document.bodyì ì ê·¼íì§ ëª»íì£ .
ë°ë¼ì ìë ìììì 첫 ë²ì§¸ alert ì°½ì nullì´ ì¶ë ¥ë©ëë¤.
<html>
<head>
<script>
alert( "HEAD: " + document.body ); // null, ìì§ <body>ì í´ë¹íë ë
¸ëê° ìì±ëì§ ììì
</script>
</head>
<body>
<script>
alert( "BODY: " + document.body ); // HTMLBodyElement, ì§ê¸ì ë
¸ëê° ì¡´ì¬íë¯ë¡ ì½ì ì ìì
</script>
</body>
</html>
nullì 'ì¡´ì¬íì§ ìì'ì ì미í©ëë¤.DOMìì null ê°ì 'ì¡´ì¬íì§ ììâì´ë 'í´ë¹íë ë
¸ëê° ììâì ì미í©ëë¤.
childNodes, firstChild, lastChildë¡ ìì ë ¸ë íìí기
ìì¼ë¡ ì¬ì©í ë ê°ì§ ì©ì´ë¥¼ 먼ì ì ìíê³ ì¤ëª ì ì´ì´ëê°ëë¡ íê² ìµëë¤.
- ìì ë
¸ë(child node, children) ë ë°ë¡ ìëì ìì ìì를 ëíë
ëë¤. ìì ë
¸ëë ë¶ëª¨ ë
¸ëì ë°ë¡ ìëìì ì¤ì²© ê´ê³ë¥¼ ë§ëëë¤.
<head>ì<body>ë<html>ììì ìì ë ¸ëì ëë¤. - íì ë ¸ë(descendants) ë ì¤ì²© ê´ê³ì ìë 모ë ìì를 ì미í©ëë¤. ìì ë ¸ë, ìì ë ¸ëì 모ë ìì ë ¸ë ë±ì´ íì ë ¸ëê° ë©ëë¤.
ìë ìììì <body>ë <div>ì <ul>, ëª ê°ì ë¹ í
ì¤í¸ ë
¸ë를 ìì ë
¸ëë¡ ê°ìµëë¤.
<html>
<body>
<div>ìì</div>
<ul>
<li>
<b>í목</b>
</li>
</ul>
</body>
</html>
<div>ë <ul>ê°ì <body>ì ìì ììë¿ë§ ìëë¼ <ul>ì ìì ë
¸ëì¸ <li>ì <b>ê°ì´ ë ê¹ì ê³³ì ìë ì¤ì²© ììë <body>ì íì ë
¸ëê° ë©ëë¤.
childNodes 컬ë ì
ì í
ì¤í¸ ë
¸ë를 í¬í¨í 모ë ìì ë
¸ë를 ë´ê³ ììµëë¤.
ìë ìì를 ì¤ííë©´ document.bodyì ìì ë
¸ëê° ì¶ë ¥ë©ëë¤.
<html>
<body>
<div>ìì</div>
<ul>
<li>í목</li>
</ul>
<div>ë</div>
<script>
for (let i = 0; i < document.body.childNodes.length; i++) {
alert( document.body.childNodes[i] ); // Text, DIV, Text, UL, ... , SCRIPT
}
</script>
...ì¶ê° ë´ì©...
</body>
</html>
ìì를 ì¤ííë©´ í¥ë¯¸ë¡ì´ ì ì´ íë ë°ê²¬ë©ëë¤. ë§ì§ë§ì <script>ê° ì¶ë ¥ëì£ . <script> ìë ë ë§ì ë´ì©(â¦ì¶ê° ë´ì©â¦)ì´ ìì§ë§, ì¤í¬ë¦½í¸ ì¤í ìì ì ë¸ë¼ì°ì ê° ì¶ê° ë´ì©ì ì½ì§ 못í ìíì´ê¸° ë문ì ì¤í¬ë¦½í¸ ìì ì¶ê° ë´ì©ì ë³´ì§ ëª»í´ì ì´ë° ê²°ê³¼ê° ëíë¬ìµëë¤.
firstChildì lastChild íë¡í¼í°ë¥¼ ì´ì©íë©´ 첫 ë²ì§¸, ë§ì§ë§ ìì ë
¸ëì ë¹ ë¥´ê² ì ê·¼í ì ììµëë¤.
ì´ íë¡í¼í°ë¤ì ë¨ì¶í¤ ê°ì ìí ì í©ëë¤. ìì ë ¸ëê° ì¡´ì¬íë©´ ìë ë¹êµë¬¸ì íì ì°¸ì´ ë©ëë¤.
elem.childNodes[0] === elem.firstChild
elem.childNodes[elem.childNodes.length - 1] === elem.lastChild
ì°¸ê³ ë¡ ìì ë
¸ëì ì¡´ì¬ ì¬ë¶ë¥¼ ê²ì¬í ë í¨ì elem.hasChildNodes()를 ì¬ì©í ìë ììµëë¤.
DOM 컬ë ì
ììì ì´í´ë³¸ childNodesë ë§ì¹ ë°°ì´ ê°ì ë³´ì
ëë¤. íì§ë§ childNodesë ë°°ì´ì´ ìë ë°ë³µ ê°ë¥í(iterable, ì´í°ë¬ë¸) ì ì¬ ë°°ì´ ê°ì²´ì¸ 컬ë ì
(collection) ì
ëë¤.
childNodesë 컬ë ì
ì´ê¸° ë문ì ìëì ê°ì í¹ì§ì ê°ì§ëë¤.
for..of를 ì¬ì©í ì ììµëë¤.
for (let node of document.body.childNodes) {
alert(node); // 컬ë ì
ë´ì 모ë ë
¸ë를 ë³´ì¬ì¤ëë¤.
}
ì´í°ë¬ë¸ì´ê¸° ë문ì Symbol.iterator íë¡í¼í°ê° 구íëì´ ìì´ì for..of를 ì¬ì©íë ê²ì´ ê°ë¥íì£ .
- ë°°ì´ì´ ìë기 ë문ì ë°°ì´ ë©ìë를 ì¸ ì ììµëë¤.
alert(document.body.childNodes.filter); // undefined (filter ë©ìëê° ììµëë¤.)
첫 ë²ì§¸ í¹ì§ì ì¥ì ì¼ë¡ ìì©í©ëë¤. ë ë²ì§¸ í¹ì§ì ì© ì¢ì§ë ìì§ë§ Array.fromì ì¬ì©íë©´ âì§ì§â ë°°ì´ì ë§ë¤ ì ì기 ë문ì ì°¸ì ë§í©ëë¤. 컬ë ì
ì ë°°ì´ ë©ìë를 ì¬ì©íê³ ì¶ë¤ë©´ Array.fromì ì ì©í©ìë¤.
alert( Array.from(document.body.childNodes).filter ); // function
DOM 컬ë ì ì ë¹ë¡¯í´ ì´ë² ì±í°ìì ì¤ëª íë 모ë íìì© íë¡í¼í°ë ì½ê¸° ì ì©ì ëë¤.
childNodes[i] = ...를 ì´ì©í´ ìì ë
¸ë를 êµì²´íë ê² ë¶ê°ë¥íì£ .
DOMì ë³ê²½íë ¤ë©´ ë¤ë¥¸ ë©ìëê° íìí©ëë¤. ë¤ì ì±í°ìì ì´ ë©ìëì ëí´ ì´í´ë³´ê² ìµëë¤.
ëªëª ìì¸ì¬íì ì ì¸íê³ ê±°ì 모ë DOM 컬ë ì ì ì´ìììµëë¤. DOMì íì¬ ìí를 ë°ìíë¤ë ë§ì´ì£ .
elem.childNodes를 참조íê³ ìë ëì¤ì DOMì ìë¡ì´ ë
¸ëê° ì¶ê°ëê±°ë ìì ëë©´, ë³ê²½ì¬íì´ ì»¬ë ì
ìë ìëì¼ë¡ ë°ìë©ëë¤.
for..in ë°ë³µë¬¸ì ì¬ì©íì§ ë§ì¸ì,컬ë ì
ì for..of를 ì´ì©í´ ìíí ì ììµëë¤. ê·¸ë°ë° ê°ë for..inì ì¬ì©íë ¤ë ì¬ëë¤ì´ ìì£ .
for..inì ì ë ì¬ì©íì§ ë§ì¸ì. for..in ë°ë³µë¬¸ì ê°ì²´ì 모ë ì´ê±° ê°ë¥í íë¡í¼í°ë¥¼ ìíí©ëë¤. 컬ë ì
ì ê±°ì ì¬ì©ëì§ ìë âì¶ê°â íë¡í¼í°ê° ìëë°, ì´ íë¡í¼í°ê¹ì§ ìí ëìì í¬í¨í길 ìíì§ ìì¼ì¤ ê±°ëê¹ì.
<body>
<script>
// 0, 1, length, item, values ë± ë¶íìí íë¡í¼í°ê¹ì§ë ì¶ë ¥ë©ëë¤.
for (let prop in document.body.childNodes) alert(prop);
</script>
</body>
íì ì ë¶ëª¨ ë ¸ë
ê°ì ë¶ëª¨ë¥¼ ê°ì§ ë ¸ëë íì (sibling) ë ¸ë ë¼ê³ ë¶ë¦ ëë¤.
<head>ì <body>ë ëíì ì¸ íì ë
¸ëì
ëë¤.
<html>
<head>...</head><body>...</body>
</html>
<body>ë<head>ì âë¤ì(next)â í¹ì 'ì°ì¸¡(right)'ì ìë íì ë ¸ëì ëë¤.<head>ë<body>ì âì´ì (previous)â í¹ì 'ì¢ì¸¡(left)'ì ìë íì ë ¸ëì ëë¤.
ë¤ì íì ë
¸ëì ëí ì ë³´ë nextSibling, ì´ì íì ë
¸ëì ëí ì ë³´ë previousSibling íë¡í¼í°ìì ì°¾ì ì ììµëë¤.
ë¶ëª¨ ë
¸ëì ëí ì ë³´ë parentNode íë¡í¼í°ë¥¼ ì´ì©í´ 참조í ì ììµëë¤.
ìì:
// <body>ì ë¶ëª¨ ë
¸ëë <html>ì
ëë¤
alert( document.body.parentNode === document.documentElement ); // true
// <head>ì ë¤ì íì ë
¸ëë <body>ì
ëë¤.
alert( document.head.nextSibling ); // HTMLBodyElement
// <body>ì ì´ì íì ë
¸ëë <head>ì
ëë¤.
alert( document.body.previousSibling ); // HTMLHeadElement
ìì ê° ì´ë
ì§ê¸ê¹ì§ ì¸ê¸í íì ê´ë ¨ íë¡í¼í°ë 모ë ì¢
ë¥ì ë
¸ë를 참조í©ëë¤. childNodes를 ì´ì©íë©´ í
ì¤í¸ ë
¸ë, ìì ë
¸ë, ì¬ì§ì´ 주ì ë
¸ëê¹ì§ 참조í ì ìì£ .
íì§ë§ ì¤ë¬´ìì í ì¤í¸ ë ¸ëë 주ì ë ¸ëë ì ë¤ë£¨ì§ ììµëë¤. ì¹ íì´ì§ë¥¼ 구ì±íë íê·¸ì ë¶ì ì¸ ìì ë ¸ë를 ì¡°ìíë ìì ì´ ëë¤ìì´ì£ .
ì´ë° ì¤ì ìí©ì í ëë¡ DOM ìì ë ¸ë íìì´ ì´ë»ê² ì´ë£¨ì´ì§ëì§ ììë´ ìë¤.
ì 그림 ì ê´ê³ë ì±í° ì쪽ìì ë¤ë¤ë ê´ê³ì ì ì¬í´ ë³´ì
ëë¤. Elementë¼ë ë¨ì´ê° ì¶ê°ë ì ë§ ë¤ë¥´ë¤ì.
childreníë¡í¼í°ë í´ë¹ ììì ìì ë ¸ë ì¤ ìì ë ¸ëë§ì ê°ë¦¬íµëë¤.firstElementChildìlastElementChildíë¡í¼í°ë ê°ê° 첫 ë²ì§¸ ìì ìì ë ¸ëì ë§ì§ë§ ìì ìì ë ¸ë를 ê°ë¦¬íµëë¤.previousElementSiblingê³¼nextElementSiblingì íì ìì ë ¸ë를 ê°ë¦¬íµëë¤.parentElementë ë¶ëª¨ ìì ë ¸ë를 ê°ë¦¬íµëë¤.
parentElementë ì´ë»ê² ëëì?parentElement íë¡í¼í°ë ë¶ëª¨ 'ìì ë
¸ëâ를 ë°ííë ë°ë©´ parentNode íë¡í¼í°ë 'ì¢
ë¥ì ìê´ìì´ ë¶ëª¨ ë
¸ëâ를 ë°íí©ëë¤. ëê° ë íë¡í¼í°ë ê°ì ë
¸ë를 ë°íí©ëë¤.
ê·¸ë°ë° document.documentElementìëì ê°ì ìí©ììë ë¤ë¥¸ ë
¸ë를 ë°íí©ëë¤.
alert( document.documentElement.parentNode ); // document
alert( document.documentElement.parentElement ); // null
ë°í ê°ì´ ë¤ë¥¸ ì´ì ë <html>ì í´ë¹íë document.documentElementì ë¶ëª¨ë documentì¸ë°, document ë
¸ëë ìì ë
¸ëê° ìë기 ë문ì
ëë¤. ë°ë¼ì ì ìììì parentNodeë ìëí ëë¡ document ë
¸ë를 ë°ííì§ë§, parentElementë nullì ë°íí©ëë¤.
ì´ë° ì¬ìí ì°¨ì´ë ììì ìì ë
¸ë elemìì ììí´ <html>ê¹ì§ ê±°ì¬ë¬ ì¬ë¼ê°ê³ ì¶ìë°, documentê¹ì§ë ê°ê³ ì¶ì§ ìì ë ì ì©íê² íì©í ì ììµëë¤.
while(elem = elem.parentElement) { // <html>ê¹ì§ ê±°ì¬ë¬ ì¬ë¼ê°ëë¤.
alert( elem );
}
ìì ë³´ìë ìììì childNodes를 childrenì¼ë¡ ëì²´í´ë´
ìë¤. ìì ë
¸ëë§ ì¶ë ¥ëë ê²ì íì¸í ì ììµëë¤.
<html>
<body>
<div>ìì</div>
<ul>
<li>í목</li>
</ul>
<div>ë</div>
<script>
for (let elem of document.body.children) {
alert(elem); // DIV, UL, DIV, SCRIPT
}
</script>
...
</body>
</html>
í ì´ë¸ íìí기
ì§ê¸ê¹ì§ DOM íì 기본 íë¡í¼í°ë¥¼ ììë³´ììµëë¤.
ê·¸ë°ë° ì¼ë¶ DOM ìì ë ¸ëë í¸ì를 ìí´ ê¸°ë³¸ íë¡í¼í° ì¸ì ì¶ê°ì ì¸ íë¡í¼í°ë¥¼ ì§ìí©ëë¤.
í ì´ë¸ì´ ê°ì¥ ëíì ì ëë¤. ì¢ ë ìì¸í ììë´ ìë¤.
<table> ììë 기본 íë¡í¼í° ì´ì¸ì ë¤ìê³¼ ê°ì íë¡í¼í°ë¥¼ ì§ìí©ëë¤.
table.rowsë<tr>ìì를 ë´ì 컬ë ì ì 참조í©ëë¤.table.caption/tHead/tFootì ê°ê°<caption>,<thead>,<tfoot>ìì를 참조í©ëë¤.table.tBodiesë<tbody>ìì를 ë´ì 컬ë ì ì 참조í©ëë¤. íì¤ì ë°ë¥´ë©´, í ì´ë¸ ë´ì ì¬ë¬ ê°ì<tbody>ê° ì¡´ì¬íë ê² ê°ë¥íë°, ìµìí íëë 무조건 ìì´ì¼ í©ëë¤. HTML 문ììë<tbody>ê° ìëë¼ë ë¸ë¼ì°ì ë<tbody>ë ¸ë를 DOMì ìëì¼ë¡ ì¶ê°í©ëë¤.
<thead>, <tfoot>, <tbody> ììë rows íë¡í¼í°ë¥¼ ì§ìí©ëë¤.
tbody.rowsë tbody ë´<tr>ìì 컬ë ì ì 참조í©ëë¤.
<tr> ììë ë¤ì íë¡í¼í°ë¥¼ ì§ìí©ëë¤.
tr.cellsë 주ì´ì§<tr>ìì 모ë<td>,<th>ì ë´ì 컬ë ì ì ë°íí©ëë¤.tr.sectionRowIndexë 주ì´ì§<tr>ì´<thead>/<tbody>/<tfoot>ì쪽ìì ëª ë²ì§¸ ì¤ì ìì¹íëì§ë¥¼ ëíë´ë ì¸ë±ì¤ë¥¼ ë°íí©ëë¤.tr.rowIndexë<table>ë´ìì í´ë¹<tr>ì´ ëª ë²ì§¸ ì¤ì¸ ì§ë¥¼ ëíë´ë ì«ì를 ë°íí©ëë¤.
<td>ì <th> ììë ë¤ì íë¡í¼í°ë¥¼ ì§ìí©ëë¤.
td.cellIndexë<td>ë<th>ê° ìí<tr>ìì í´ë¹ ì ì´ ëª ë²ì§¸ì¸ì§ë¥¼ ëíë´ë ì«ì를 ë°íí©ëë¤.
ì©ë¡:
<table id="table">
<tr>
<td>ì¼</td><td>ì´</td>
</tr>
<tr>
<td>ì¼</td><td>ì¬</td>
</tr>
</table>
<script>
// 'ì´'ê° ì í td를 ê°ì ¸ì´(첫 ë²ì§¸ ì¤, ë ë²ì§¸ 칸)
let td = table.rows[0].cells[1];
td.style.backgroundColor = "red"; // ê°ì¡°
</script>
íì ê´ë ¨í ê³µì ëª ì¸ìë tabular dataìì ì°¾ìë³¼ ì ììµëë¤.
í ì´ë¸ê³¼ ë§ì°¬ê°ì§ë¡, HTML í¼(form)ìë§ ì¸ ì ìë íì íë¡í¼í°ë ììµëë¤. í¼ì ë°°ì°ë©´ì ì´ íë¡í¼í°ì ëí´ìë ì´í´ë³´ëë¡ íê² ìµëë¤.
ìì½
íì íë¡í¼í°ë¥¼ ì¬ì©íë©´ ì´ì ë ¸ëë¡ ë°ë¡ ì´ëí ì ììµëë¤.
íì íë¡í¼í°ë í¬ê² ë ê°ì ì§í©ì¼ë¡ ëë©ëë¤.
- 모ë ë
¸ëì ì ì© ê°ë¥í
parentNode,childNodes,firstChild,lastChild,previousSibling,nextSibling - ìì ë
¸ëìë§ ì ì© ê°ë¥í
parentElement,children,firstElementChild,lastElementChild,previousElementSibling,nextElementSibling
í ì´ë¸ê³¼ ê°ì ëªëª DOM ììë ì¶ê° íë¡í¼í°ì ì½í ì¸ ì ì ìí ì ìê² í´ì£¼ë 컬ë ì ì ì ê³µí©ëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.