본문 바로가기

FE

1.5 주요 노드 프로퍼티 (2)

모던 JavaScript 튜토리얼 파트 2. 브라우저: 문서, 이벤트, 인터페이스를 읽고 정리, 기록

 

브라우저 환경과 다양한 명세서

 

브라우저 환경과 다양한 명세서

 

ko.javascript.info

 

innerHTML로 내용 조작하기

innerHTML 프로퍼티를 사용하면 요소 안의 HTML을 문자열 형태로 받아올 수 있다.

요소 안 HTML을 수정할 수도 있다.

 

<script> 태그를 삽입하면 해당 태그는 HTML의 리부가 되지만, 스크립트는 실행되지 않음

 

‘innerHTML +=’ 사용 시 주의점

내용 추가가 아니라 내용을 덮어쓰기 때문에 주의해서 사용해야 한다.

  1. 기존 내용 삭제
  2. 기존 내용과 새로운 내용을 합친 새로운 내용

기존 내용이 완전히 삭제된 후 밑바닥부터 다시 내용이 쓰여지기 때문에 이미지 등의 리소스 전부가 다시 로딩된다.

→ 버벅임 존재

또한 여러 부작용이 존재한다.

  • 드래그 해제
  • 사용자 입력 값이 사라짐

innerHTML 말고 HTML을 추가하는 방법을 사용하면 부작용 없이 원하는 HTML 추가 가능


outerHTML로 요소의 전체 HTML 보기

outerHTML 프로퍼티엔 요소 전체 HTML이 담겨있다.

outerHTML = innerHTML + 요소

<div id="elem">Hello <b>World</b></div>

<script>
	  alert(elem.outerHTML); // <div id="elem">Hello <b>World</b></div>
</script>

innerHTML과 달리 outerHTML을 사용해서 HTML을 쓸 땐 요소 자체가 바뀌지 않음

대신 outerHTML은 DOM안의 요소를 교체

예시를 보면 div 태그는 바뀌지 않음

<div>Hello, world!</div>

<script>
  let div = document.querySelector('div');

  // div.outerHTML를 사용해 <p>...</p>로 교체
  div.outerHTML = '<p>새로운 요소</p>'; // (*)

  // 어! div가 그대로네요!
  alert(div.outerHTML); // <div>Hello, world!</div> (**)
</script>

바뀌지 않는 이유는?

outerHTML에서 하는 할당 연산이 DOM 요소(div)를 수정하지 않기 때문이다.

할당 연산은 요소를 DOM에서 제거하고 새로운 HTML 조각을 넣는다.

  1. ‘document’에서 div를 삭제
  2. 새로운 HTML 조각인 <p>A new element</p>을 삭제 후 생긴 공간에 삽입
  3. div엔 여전히 기존 값이 저장되어 있고 새로운 HTML 조각은 어디에도 저장되어 있지 않음

elem.outerHTML 에 무언가를 수정할 땐 elem이 수정되지 않는다.


nodeValue/data로 텍스트 노드 내용 조작하기

innerHTML 프로퍼티는 요소 노드에만 사용 가능

텍스트 노드 같은 다른 타입의 노드에는 nodeValue, data를 사용해야 한다.

  • ex) 주석 노드
<body>
  안녕하세요.
  <!-- 주석 -->
  <script>
    let text = document.body.firstChild;
    alert(text.data); // 안녕하세요.

    let comment = text.nextSibling;
    alert(comment.data); // 주석
  </script>
</body>

필요한 경우 주석 노드에 필요한 지시사항을 처리할 때 사용한다.

<!-- if isAdmin -->
  <div>관리자로 로그인하였습니다!</div>
<!-- /if -->

textContent로 순수한 텍스트만

textContent를 사용하면 요소 내의 텍스트에 접근할 수 있다.

<태그>는 제외하고 오로지 텍스트만 추출 가능

→ 텍스트를 안전하게 사용할 수 있다.

  • 예시)
<div id="news">
  <h1>주요 뉴스!</h1>
  <p>화성인이 지구를 침공하였습니다!</p>
</div>

<script>
  // 주요 뉴스! 화성인이 지구를 침공하였습니다!
  alert(news.textContent);
</script>

innerHTML과 textContent 비교

innerHTML: 사용자가 입력한 문자열이 ‘HTML 형태로’ 태그와 함께 저장

textContent: 사용자가 입력한 문자열이 ‘순수 텍스트 형태’로 저장 / 태그를 구성하는 특수문자들이 문자열로 처리된다.

  • 예시)
<div id="elem1"></div>
<div id="elem2"></div>

<script>
  let name = prompt("이름을 알려주세요.", "<b>이보라</b>");

  elem1.innerHTML = name; // 굵은 글씨로 출력
  elem2.textContent = name; // <b>이보라</b>로 출력
</script>

hidden 프로퍼티

hidden은 HTML 안에서도 쓸 수 있고, 자바스크립트에서도 쓸 수 있다.

hidden = style=”display: none”

<div>아래 두 div를 숨겨봅시다.</div>

<div hidden>HTML의 hidden 속성 사용하기</div>

<div id="elem">자바스크립트의 hidden 프로퍼티 사용하기</div>

<script>
  elem.hidden = true;
</script>

기타 프로퍼티

value

<input>과 <select>, <textarea>의 값이 저장된다.

대응하는 클래스: HTMLInputElement, HTMLSelectElement 등

href

<a href=”…”> 의 href 속성이 저장된다.

대응하는 클래스: HTMLAnchorElement

id

id 속성 값이 저장됨. 모든 요소에서 사용 가능

대응하는 클래스: HTMLElement

  • 예시)
<input type="text" id="elem" value="value">

<script>
  alert(elem.type); // "text"
  alert(elem.id); // "elem"
  alert(elem.value); // value
</script>

프로퍼티 항목을 보는 방법

  1. 특정 클래스에서 지원하는 프로퍼티 전체를 보고 싶다면 명세서를 읽기.
  1. 명세서를 읽지 않고 개발자 도구의 콘솔 창에 console.dir(elem)를 입력하면 해당 요소에서 지원하는 프로퍼티 목록을 확인할 수 있다.
  2. 개발자 도구의 Elements 패널의 하위 패널 중 'Properties’를 선택해도 동일한 목록을 확인할 수 있습니다.

'FE' 카테고리의 다른 글

1.7 문서 수정하기  (4) 2024.11.15
1.6 속성과 프로퍼티  (0) 2024.11.14
1.5 주요 노드 프로퍼티 (1)  (0) 2024.11.12
1.4 getElement*, querySelector*로 요소 검색하기  (0) 2024.11.11
1.3 DOM 탐색하기  (0) 2024.11.10