JavaScript - DOM(Document Object Model), 요소 선택, getElements~
DOM('Document Object Model')
- '문서 객체 모델' 이라하며 document 객체를 의미
- HTML 요소(element)를 제어(생성, 삭제 등)하기 위해 사용
- HTML 문서가 만들어지면 눈에 보이지 않지만 위의 그림처럼 HTML 요소들을 노드(node)와 노드가 연결된 tree 구조로 만들어 준다.
- html, head, meta, title, body, h1, p와 같은 태그 요소들 => '요소 노드'
- 텍스트 => '텍스트 노드'
* DOM에 대한 작업 *
- 먼저 요소를 선택할 수 있어야 한다.
- 요소를 직접 선택하는 방법
- 노드와 상대 위치로 선택하는 방법
요소의 선택
1) 요소를 직접 선택하는 방법
메서드 | 설명 |
getElementById() | document.getElementById("apple")일 경우 HTML 요소 중 id 속성이 "apple"인 요소를 선택 한 개의 요소만 선택 |
getElementsByClassName() | document.getElementsByClassName("name")일 경우 HTML 요소 중 class 명이 "name"인 요소들을 선택 복수 개의 요소를 선택 |
getElementsByTagName() | document.getElementsByTagName("ul")일 경우 HTML 요소 중 태그명이 "ul"인 요소들을 선택 복수 개의 요소를 선택 |
getElementsByName() | document.getElementsByName("error")일 경우 HTML 요소 중 name명이 "error"인 요소들을 선택 복수 개의 요소를 선택 |
<body>
<div id="content">
<ul class="name">
<li>내용1</li>
<li>내용2</li>
</ul>
<ul class="menu">
<li>내용1</li>
<li>내용2</li>
</ul>
<ul>
<li>내용1</li>
<li>내용2</li>
</ul>
<input type="text" name="txt" value="자바스크립트" />
<input type="text" name="txt" value="제이쿼리" />
</div>
</body>
<script>
document.onload = start();
function start() {
var result = "";
var content = document.getElementById("content");
var menu = document.getElementsByClassName("menu");
var ul = document.getElementsByTagName("ul");
var txt = document.getElementsByName("txt");
result += content + "\n";
result += menu + "\n";
result += ul + "\n";
result += txt;
alert(result);
}
</script>
>> 결과
>> 설명
getElementById() 메서드를 제외한 나머지 메서드들은 'object HTML Collection'과 'object NodeList'가 출력
=> 복수 개의 요소들이 변수에 저장되었기 때문
복수 개로 저장된 요소들을 다시 개별적으로 선택하고 싶다면 ...
- ul.item(index) -> ul.item(0) ul 변수에 저장된 ul 요소들 중 첫 뻔재 ul 요소를 선택
- ul[index] -> 복수 개의 요소가 변수에 저장되면 내부적으로 요소들을 배열로 만들어 저장, ul[1]로 두번째 요소 선택
- ul.length -> ul 변수에 저장된 ul 요소는 모두 3개이므로 3이 된다.
메서드명에 'getElements'처럼 's'가 붙은 복수형 메서드들은 요소를 하나만 선택한다고 해서 다음과 같이 사용할 수 없다.
getElementsByTagName("p")는 모든 p 요소를 선택하므로 '<p>내용</p>' 는 p 요소 중 가장 첫 번째 요소가 된다.
<body>
<p>내용</p>
</body>
<script>
var p=document.getElementsByTagName("p");
p.style.backgroundColor="red"; -> 사용 X
//p[0].style.backgroundColor="red"; -> 사용 O
//p.item(0).style.backgroundColor="red"; -> 사용 O
</script>
'result+=txt.item(0).value' 에서의 value 속성은 input 요소의 value 속성값을 의미
<body>
<input type="text" name="txt" value="자바스크립트" />
<input type="text" name="txt" value="제이쿼리" />
</body>
<script>
window.onload = function () {
var result = "";
var txt = document.getElementsByName("txt");
result += txt.item(0).value + "\n";
result += txt.item(1).value + "\n";
//result+=txt[0].value;
//result+=txt[1].value;
result += txt.length;
alert(result);
};
</script>
2) 상대 위치로 선택하는 방법
색상 표시된 속성들은 노드를 선택 할 때 빈 문자도 텍스트 노드로 선택하므로 사용시 주의!
속성 | 설명 |
parentNode | 현재 선택된 요소의 어미 노드를 선택 |
childNodes | 현재 선택된 요소의 자식 노드들(요소 노드, 텍스트 노드)을 선택 |
children | 현재 선택된 요소의 자식 노드들(요소 노드)을 선택 |
nextSibing | 현재 선택된 요소의 이전 형제 노드를 선택 |
previousSibing | 현재 선택된 요소의 다음 형제 노드를 선택 |
firstChild | 현재 선택된 요소의 자식 노드 중 첫 번째 노드를 선택 |
lastChild | 현재 선택된 요소의 자식 노드 중 마지막 노드를 선택 |
tagName | 현재 선택된 요소의 태그명을 반환 |
nodeValue | 현재 선택된 노드의 value 값을 반환 |
nodeType | 현재 선택된 노드의 타입을 반환 'childNodes'로 가져온 자식 노드 중에서 '빈 텍스트 노드'를 빼고 요소 노드만 저장 가능 nodeType이 요소 노드 : 1 nodeType이 속성 노드 : 2 node Type이 텍스트 노드 : 3 |
id | 현재 선택된 요소의 id값을 반환 |
className | 현재 선택된 요소의 class 값을 반환 |
'childNodes' 와 'children' 속성은 비슷한 기능을 가지고 있지만 차이점 존재!
<body>
<div>
<ul id="gnb">
<li><a href="#">메뉴1</a></li>
<li><a href="#">메뉴2</a></li>
<li><a href="#">메뉴3</a></li>
</ul>
</div>
</body>
<script>
window.onload = function () {
var gnb = document.getElementById("gnb");
var gnbChilds = gnb.childNodes;
var gnbChildren = gnb.children;
alert(gnbChilds.length + "/" + gnbChildren.length); // 7/3 출력
};
</script>
>> 설명
childNodes 속성의 경우 : 자식 노드로 <li>만 선택하는 것이 아니라 행 구분을 위해 '엔터'를 사용한 곳(빈문자)도 자식 노드로 취급
ul 요소 안에 '엔터'를 4번 사용 + li요소가 3개이므로 gnbChilds 변수에 7개 자식노드 저장
변수에 복수 개의 노드가 저장되면 item() 메서드나 배열 사용 가능
gnbChilds.item(0) ~ gnbChilds.item(6) 또는 gnbChilds[0] ~ gnbChilds[6]
children 속성의 경우 : 공백 문자는 무시하고 li 요소 3개만 자식 노드로 선택, 3개의 자식 노드를 gnbChildren 변수에 저장
gnbChildren.item(0) ~ gnbChildren.item(2) 또는 gnbChildren[0] ~ gnbChildren[2]