HTML*Element 개체 개요
HTML 문서 내의 각 element 들은 고유한 성질을 가지며,
각자 element를 DOM 트리내의 노드 개체로 인스턴스화하는 고유한 자바스크립트 생성자를 가진다.
HTML*Element 개체의 속성 및 메서드 (상속받은 것 포함)
HTML*Element 노드에 존재하는 속성 및 메서드와 관련된 정확한 정보를 얻으려면,
사양서를 무시하고 브라우저에게 물어보는 것이 제일 좋다.
다음 코드에서 생성한 배열을 살펴보면 HTML element 노드에 존재하는 속성 및 메서드에 대해 상세히 알 수 있다.
<script>
var anchor = document.querySelector('a');
// element 고유 속성
console.log(Object.keys(anchor).sort());
// element 고유 속성 및 상속 받은 속성
var documentPropertiesIncludeInherited = [];
for(var p in document){
documentPropertiesIncludeInherited.push(p);
}
console.log(documentPropertiesIncludeInherited.sort());
// element가 상속받은 속성만
var documentPropertiesOnlyInherited = [];
for(var p in document){
if(!document.hasOwnProperty(p)){
documentPropertiesOnlyInherited.push(p);
}
}
console.log(documentPropertiesOnlyInherited.sort());
</script>
중요하게 생각되는 주요 속성 및 메서드 목록
- createElement()
- tagName
- children
- getAttribute()
- setAttribute()
- hasAttribute()
- removeAttribute()
- classList()
- dataset
- attributes
Element 생성
<script>
var elementNode = document.createElement("textarea");
document.body.appendChild(elementNode);
</script>
Element의 태그 이름 얻기
tagName을 사용하면 element의 이름에 접근할 수 있다.
tagName 속성은 nodeName이 반환하는 것과 동일한 값을 반환한다.
<script>
console.log(document.querySelector("a").tagName); // A 출력
console.log(document.querySelector("a").nodeName); // A 출력
</script>
Element의 Attribute 및 값에 대한 리스트/컬렉션 얻기
attributes 속성을 사용하면 현재 정의된 attr 노드의 컬렉션을 얻을 수 있다.
<script>
var atts = document.querySelector('a').attributes;
for(var i=0; i< atts.length; i++){
console.log(atts[i].nodeName +'='+ atts[i].nodeValue);
}
</script>
attributes 속성을 통해 반환되는 배열은 라이브 상태라는 점을 고려해야 한다.
이는 내용물이 언제든 변경될 수 있다는 것을 의미.
반환된 배열이 상속받고 있는 NamedNodeMap은
getNamedItem(), setNamedItem(), removeNamedItem()과 같이 배열을 조작하기 위한 메서드를 제공한다.
이 메서드를 사용하여 attribute를 조작하는 것보다는
getAttribute(), setAttribute(), hasAttribute(), removeAttribute()를 사용하는 것이 좋다.
attributes를 사용할 때의 유일한 이점은 라이브 상태의 목록을 반환한다는 것 뿐이다.
attributes 속성은 유사 배열 컬렉션이며, 읽기 전용인 length 속성을 가진다.
Element의 Attribute 값 획득/설정/제거
element의 attribute값을 가져오고 설정 및 제거하기 위한 가장 일관된 방법은
getAttribute(), setAttribute(), removeAttribute() 메서드를 사용하는 것이다.
<script>
var atts = document.querySelector("a");
// attribute 제거
atts.removeAttribute("href");
atts.removeAttribute("title");
atts.removeAttribute("style");
atts.removeAttribute("class");
// attribute 설정
atts.setAttribute("href", "#");
atts.setAttribute("title", "어쩌고");
atts.setAttribute("style", "padding:0");
atts.setAttribute("class", "link_g");
// attribute 가져오기
console.log(atts.getAttribute("href"));
console.log(atts.getAttribute("title"));
console.log(atts.getAttribute("style"));
console.log(atts.getAttribute("class"));
</script>
setAttribute()를 사용하여 attribute 값을 null이나 ''로 설정하지 말고 removeAttribute()를 사용하자.
Element가 특정 attribute를 가지고 있는지 확인하기
hasAttribute() 메서드를 사용하 판별한다.
<a href="#" title="title" style="margin:0" class="link"></a>
<script>
var atts = document.querySelector("a");
console.log(
atts.hasAttribute("href"),
atts.hasAttribute("title"),
atts.hasAttribute("style"),
atts.hasAttribute("class")
)
</script>
element가 attribute를 포함하고 있으면 값을 가지지 않더라도 true를 반환한다.
Class Attribute 값 리스트 얻기
classList 속성을 사용하면 className 속성에서 반환되는 공백으로 구분된 문자열 값을 사용하는 것보다
훨신 쉽게 class attribute 값 리스트에 접근할 수 있다.
<div class="big brown bear"></div>
<script>
var elm = document.querySelector("div");
console.log(elm.classList); // big brown bear {0="big", 1="brown", 2="bear", length=3, ...}
console.log(elm.className); // big brown bear
</script>
classList는 유사 배열 컬렉션이며 읽기 전용인 length 속성을 가진다.
읽기 전용이지만 add(), remove(), contains(), toggle() 메서드를 사용해서 변경할 수 있다. IE10부터 지원
Class attribute에 하위 값 추가 및 제거
classList.add()와 classList.remove() 메서드를 사용하면, class attribute의 값을 간단하게 편집할 수 있다.
<div class="dog"></div>
<script>
var elm = document.querySelector("div");
elm.classList.add("cat");
elm.classList.remove("dog");
console.log(elm.className); // cat
</script>
Class attribute 값 토글
classList.toggle() 메서드를 사용하면, class attribute의 하위 값을 토글 시킬 수 있다.
값이 누락된 경우 추가하거나 값이 이미 있는 경우 제거할 수 있게 해준다.
<div class="visible"></div>
<script>
var elm = document.querySelector("div");
elm.classList.toggle("visible");
elm.classList.toggle("grow");
console.log(elm.className); // grow
</script>
Class attribute 값이 특정 값을 가지고 있는지 판별하기
classList.contains() 메서드를 사용하면 class attribute 값이 특정 하위 값을 가지고 있는지 알수있다.
<div class="big brown bear"></div>
<script>
var elm = document.querySelector("div");
console.log(elm.classlist.contains("brown")); // true
</script>
data-* attribue를 가져오고 설정하기
element 노드의 dataset 속성은 element 에서 data-*로 시작하는 모든 attribute를 가진 개체를 제공해준다.
<div data-foo-foo="foo" data-bar-bar="bar"></div>
<script>
var elm = document.querySelector("div");
// 가져오기
console.log(elm.dataset.fooFoo); // foo
console.log(elm.dataset.barBar); // bar
// 설정하기
elm.dataset.gooGoo = "goo";
console.log(elm.dataset); // DOMStringMap {fooFoo="foo", barBar="bar", gooGoo="goo"}
// element가 DOM 내에서 어떤 모습인지 확인
console.log(elm); // <div data-foo-foo="foo" data-bar-bar="bar", data-goo-goo="goo">
</script>
dataset은 data attribute들의 camelCase 버전을 가지고 있다.
즉 data-foo-foo는 dataset DOMStringMap 개체 내에 fooFoo라는 속성으로 나열된다.
하이픈은 camelCasing으로 대체된다.
dataset은 ie9에서 제공되지 않으며 getAttribue("data-foo"), removeAttribute("data-foo"), setAttribue("data-foo"), hasAttribue("data-foo")는 언제나 사용 가능하다.
특정 Element 노드 선택하기
단일 element 노드에 대한 참조를 얻는데 가장 흔히 사용되는 메서드는 다음과 같다.
- querySelector()
- getElementById()
<ul>
<li>Hello</li>
<li>big</li>
<li id="last">last</li>
</ul>
<script>
console.log(document.querySeletor("li").textContent); // hello
console.log(document.getElementById("last").textContent); // last
</script>
getElementById() 메서드는 querySelector() 메서드에 비해 매우 단순하다.
querySelector() 메서드는 CSS selector 문법 형식의 매개 변수를 허용한다.
querySelector()는 selector를 기반으로 문서 내에서 발견되는 첫 번째 노드 element를 반환한다.
Element 노드 리스트 선택 및 생성
노드 리스트 선택 및 생성하는데 가장 흔히 사용된느 메서드는 다음과 같다.
- querySelectorAll()
- getElementsByTagName()
- getElementsByClassName()
<ul>
<li class="liClass">hello</li>
<li class="liClass">big</li>
</ul>
<script>
// 다음 메서드들은 모두 DOM 내의 <li> element 리스트를 동일하게 생성 및 선택한다.
console.log(document.querySelectorAll("li"));
console.log(document.getElementsByTagName("li"));
console.log(document.getElementsByClassName("liClass"));
</script>
getElementsByTagName()과 getElementsByClassName()으로 생성된 nodeList는 라이브 상태로 간주되며,
리스트를 생성하고 선택한 후에 문서가 업데이트된 경우에도 문서의 상태를 항상 반영한다.
querySelectorAll() 메서드는 라이브 상태의 element 리스트를 반환하지 않는다.
이는 querySelectorAll()에서 반환하는 리스트는 리스트 생성 시점의 문서 스냅샷이며,
문서의 변경 내용을 반영하지 않는다는 것을 의미한다.
해당 리스트는 정적이며, 라이브 상태가 아니다.
querySelectorAll(), getElementsByTagName(), getElementsByClassName()은 element 노드에도 정의되어 있다.
그 덕분에 메서드의 결과를 DOM 트리의 특정 부분에 한정할 수 있다.
document.getElementById("header").getElementsByClassName("a")
직계 자식 Element 노드를 모두 선택
<ul>
<li><strong>hi</strong</li>
<li>there</li>
</ul>
<script>
var ulElement = document.querySelector("ul").children;
console.log(ulElement); // [<li>,<li>]
</script>
children은 직계 element 노드만을 제공하며, element가 아닌 노드는 제외된다.
자식이 없는 경우, children은 빈 유사 배열 리스트를 반환한다.
컨텍스트 기반 Element선택
통상적으로 document 개체를 통해 접근되는
querySelector(), querySelectorAll(), getELementsByTagName(), getElementsByClassName()은 element 노드에도
정의되어 있다.
<ul>
<li class="liClass">hello</li>
<li class="liClass">world</li>
</ul>
<script>
var div = document.querySelector("div");
console.log(div.querySelector("ul"));
console.log(div.querySelectorAll("li"))
console.log(div.getElementsByTagName("li"))
console.log(div.getElementsByClassName("liClass"));
</script>
이 메서드들은 라이브 상태의 DOM에서만 동작하는 것이 아니라, 코드로 생성한 DOM 구조에서도 동작한다.
<script>
// DOM 구조 생성
var divElm = document.createElement("div");
var ulElm = document.createElement("ul");
var liElm = document.createElement("li");
liElm.setAttribute("class","liClass");
ulElm.appendChild(liElm);
divElm.appendChild(ulElm);
// DOM 구조상에서 선택 메서드를 사용
console.log(divElm.querySelector("ul"));
console.log(divElm.querySelectorAll("li"))
console.log(divElm.getElementsByTagName("li"))
console.log(divElm.getElementsByClassName("liClass"));
</script>
사전에 구성된 Element 노드 선택/리스트
document.all HTML 문서 내의 모든 element
document.forms 문서 내의 모든<form>
document.images 문서 내의 모든 <img>
documnet.links 문서 내의 모든<a>
document.scripts 문서 내의 모든 <script>
document.styleSheets 문서 내의 모든 <link> 또는 <style>
선택될 Element를 검증하기 위해 matches()를 사용하기
<ul>
<li>hello</li>
<li>world</li>
</ul>
<script>
console.log(document.querySelector("li").matches("li:first-child"));
</script>
<ul> 내의 첫 번째 <li>를 선택한 후 이 element가 li:first-child에 들어맞는지 물어본다.
'UI개발' 카테고리의 다른 글
DOM - 텍스트 노드 (0) | 2016.10.17 |
---|---|
DOM - Element 노드 지오메트리와 스크롤링 지오메트리 / 인라인 스타일 (0) | 2016.09.22 |
DOM - Document 노드 (0) | 2016.09.19 |
DOM - 노드 개요 (0) | 2016.09.11 |
-webkit-tap-highligh-color (0) | 2016.08.07 |