April 30, 2020
지난 포스트에서 DOM은 무엇이고 어떻게 접근하는지에 대해서 알아보았다. 이번에는 접근한 DOM을 어떻게 다룰 수 있는지에 대해 알아보려고 한다.
요소의 텍스트는 텍스트 노드에 저장되어 있고, 텍스트 노드에 접근하기 위해서는 요소 노드인 부모 노드를 거쳐야 한다. 텍스트 노드는 유일한 프로퍼티인 nodeValue를 가지고 있고 nodevalue를 이용하여 텍스트를 수정할 수 있다.
nodeValue
null을 반환한다.nodeName, nodeType을 통해 노드의 정보를 얻을 수 있다.어트리뷰트 노드 조작할 때 주로 쓰이는 프로퍼티와 메서드는 다음과 같다.
className
class 어트리뷰트 값을 취득하거나 변경한다. className 프로퍼티에 값을 할당하는 경우에 class 어트리뷰트가 존재하지 않으면 동적으로 생성 후 할당한다. class값이 여러개면 공백으로 구분하여 문자열을 반환하기 때문에 String메서드인 split(' ')을 사용해서 배열로 바꿔 사용한다.classList
add, remove, item, toggle, contains, replace 메서드를 제공한다. id
id 어트리뷰트의 값을 취득하거나 변경한다. id 프로퍼티에 값을 할당할 떄, 존재하지 않으면 동적으로 생성하여 할당한다.hasAttribute(attribute)
setAttribute(attribute, value)
removeAttribute(attribute)
HTML 콘텐츠를 조작하기 위해서 아래 프로퍼티와 메서드를 사용할 수 있다. 하지만 마크업이 포함된 콘텐츠 추가는 XSS공격에 취약하므로 주의해야 한다.
textContent
textContent 요소에 새로운 텍스트를 할당하는 방식으로 텍스트를 변경할 수 있다. 텍스트만 지정되어야 하고 마크업을 포함시키면 그것 또한 문자열로 인식된다.innerText
innerText프로퍼티로 요소의 텍스트 컨텐츠에 접근할 수 있지만 비표준이고, CSS를 고려해야 하므로 textContent 프로퍼티보다 느리다.innerHTML
DOM을 조작하면 innerHTML 프로퍼티를 사용하지 않고도 새 콘텐츠를 추가할 수 있다.
createElement() 메서드로 새로운 요소 노드를 생성한다. createElement() 메소드의 인자로 태그 이름을 전달한다.createTextNode() 메서드를 사용해서 텍스트 노드를 생성한다.appendChild() 메서드를 사용해서 생성된 노드를 DOM tree에 추가한다. createElement(tagName)
createTextNode(text)
appendChild(Node)
removeChild(Node)
insertAdjacentHTML(position,string)
beforebegin, afterbegin, beforeend, afterend 이다.innerHTML
DOM 조작방식
insertAdjacentHTML()
innerHTML처럼 XSS 공격에 취약하다.