ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • DOM 기초
    Javascript 2024. 3. 7. 18:22

     

    for...of는 배열을 순회할 때 사용

    for...in은 객체의 속성을 순회할 때 사용


     

    Q. elem.children[0].previousSibling은 항상 null일까요?

    <div>
      텍스트 노드 앞에 있는 내용
      <p>첫 번째 자식 요소</p>
      <span>다른 자식 요소</span>
    </div>

    이 경우, elem.children[0]<p> 요소를 나타내고, elem.children[0].previousSibling은 텍스트 노드 "텍스트 노드 앞에 있는 내용"을 나타냅니다. 요소 노드 이외의 노드도 존재할 수 있기 때문에 previousSibling을 사용할 때는 주의가 필요합니다.


     

    ✅ console.dir(elem)과 console.log(elem)의 차이

    인수가 DOM 요소일 때는 결과가 다릅니다.

    • console.log(elem)는 요소의 DOM 트리를 출력합니다.
    • console.dir(elem)는 요소를 DOM 객체처럼 취급하여 출력합니다. 따라서 프로퍼티를 확인하기 쉽다는 장점이 있습니다.

    document.body를 인수로 넘겨서 그 차이를 직접 확인해보세요.


     

    노드 타입 확인하는 방법

     -> instansceof 사용하기 또는 nodeType


     

    'innerHTML+='  사용 시 주의점

     -> 기존 내용을 먼저 삭제하고

     -> 기존 내용과 + 새로운 내용을 합친 = 새로운 내용을 씀

     -> 기존 내용이 완전히 삭제된 후 완전히 새롭게 다시 내용이 쓰여지기 때문에 이미지 등의 리소스가 전부 다시 로딩된다.

     -> 요소 노드에만 사용할 수 있다

     -> 사용자가 입력한 문자열이 HTML 형태로 태그와 함께 저장된다. / 태그의 기능이 적용 되는것

     

    그렇다면 이런 리소스 낭비 없이 HTML을 추가하는 방법에는 뭐가 있을까?

    ✅ 

     

     

    * outerHTML은 내용을 수정하지 않는다.


     

    textcontent 

     -> 요소 내의 텍스트에만 접근 가능하다. / 태그는 그저 문자로서만 들어가는것

     -> 요소 없이 해당 텍스트만 불러온다.

     -> 사용자가 입력한 문자열이 순수 텍스트로만 저장된다. (특수문자, 태그, 일반텍스트 모두 문자열 그대로 저장)

     -> 사용자로부터 입력값을 받아서 처리해야하는 경우 순수 텍스트로만 받아오는 textContent를 사용해야한다.


     

    data 

     -> 요소가 아닌 노드(텍슽, 주석 노드 등)를 읽어올 때 사용


     

    1. 여기서 속성는 무엇인가?

    2. elem이 의미하는것은?

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

    답: 1. type, id, value / 2. input 안에 있는 id 속성을 가르키는 것.


     

    모든 속성은 아래의 메서드를 사용해 접근할 수 있습니다.

    • elem.hasAttribute(name) – 속성 존재 여부 확인
    • elem.getAttribute(name) – 속성값을 가져옴
    • elem.setAttribute(name, value) – 속성값을 변경함
    • elem.removeAttribute(name) – 속성값을 지움

     

    <input>
    
    <script>
      let input = document.querySelector('input');
    
      // 속성 추가 => 프로퍼티 갱신
      input.setAttribute('value', 'text');
      alert(input.value); // text (갱신)
    
      // 프로퍼티를 변경해도 속성이 갱신되지 않음
      input.value = 'newValue';
      alert(input.getAttribute('value')); // text (갱신 안됨!)
    </script>

    -> input.value = 'newValue'; 이 부분의 코드는 DOM을 속성을 변경하는 것이고,

         input.setAttribute('value', 'text') 이 부분의 코드는 HTML의 속성을 변경하는 것이기 때문에 getAttribute로 값이 얻어지지 않는다.


     

    href 속성의 값을 정확하게 얻고 싶다면 getAttribute을 사용하기


     

    속성 – HTML 안에 쓰임

    프로퍼티 – DOM 객체 안에 쓰임


     

    div 요소를 생성하는데에서 끝나는게 아니라 body.append와 같은 삽입 메서드를 사용해서 DOM 화면에 추가시켜줘야한다.

    <style>
    .alert {
      padding: 15px;
      border: 1px solid #d6e9c6;
      border-radius: 4px;
      color: #3c763d;
      background-color: #dff0d8;
    }
    </style>
    
    <script>
      let div = document.createElement('div');
      div.className = "alert";
      div.innerHTML = "<strong>안녕하세요!</strong> 중요 메시지를 확인하셨습니다.";
    
      document.body.append(div);
    </script>

     


    node.append(노드나 문자열) 노드나 문자열 node 끝에 삽입합니다.

    node.prepend(노드나 문자열) – 노드나 문자열을 node 맨 앞에 삽입합니다.

    node.before(노드나 문자열) –- 노드나 문자열을 node 이전에 삽입합니다.

    node.after(노드나 문자열) –- 노드나 문자열을 node 다음에 삽입합니다.

    node.replaceWith(노드나 문자열) –- node를 새로운 노드나 문자열로 대체합니다.

     

    예시)

    <ol id="ol">
      <li>0</li>
      <li>1</li>
      <li>2</li>
    </ol>
    
    <script>
      ol.before('before'); // <ol> 앞에 문자열 'before'를 삽입함
      ol.after('after'); // <ol> 뒤에 문자열 'after를 삽입함
    
      let liFirst = document.createElement('li');
      liFirst.innerHTML = 'prepend';
      ol.prepend(liFirst); // <ol>의 첫 항목으로 liFirst를 삽입함
    
      let liLast = document.createElement('li');
      liLast.innerHTML = 'append';
      ol.append(liLast); // <ol>의 마지막 항목으로 liLast를 삽입함
    </script>

     

    최종 결과)

    before
    <ol id="ol">
      <li>prepend</li>
      <li>0</li>
      <li>1</li>
      <li>2</li>
      <li>append</li>
    </ol>
    after

     

    Q. ul 안에 li 만들기

    <ul id="ul"></ul>
    
    <script>
    function getListContent() {
      let result = [];
    
      for(let i=1; i<=3; i++) {
        let li = document.createElement('li');
        li.append(i);
        result.push(li);
      }
    
      return result;
    }
    
    ul.append(...getListContent()); // append 메서드와 ...(전개 구문)은 궁합이 잘 맞습니다.
    </script>

     

     


     

    ✅ 요약

    노드 생성 메서드:

    • document.createElement(tag) – 태그 이름을 사용해 새로운 요소를 만듦
    • document.createTextNode(value) – 텍스트 노드를 만듦(잘 쓰이지 않음)
    • elem.cloneNode(deep) – 요소를 복제함. deep==true일 경우 모든 자손 요소도 복제됨

    노드 삽입, 삭제 메서드:

    • node.append(노드나 문자열) – node 끝에 노드를 삽입
    • node.prepend(노드나 문자열) – node 맨 앞에 노드를 삽입
    • node.before(노드나 문자열) –- node 이전에 노드를 삽입
    • node.after(노드나 문자열) –- node 다음에 노드를 삽입
    • node.replaceWith(노드나 문자열) –- node를 대체
    • node.remove() –- node를 제거

    문자열을 삽입, 삭제할 땐 문자열을 ‘그대로’ 넣으면 됩니다.

    ‘구식’ 메서드:

    • parent.appendChild(node)
    • parent.insertBefore(node, nextSibling)
    • parent.removeChild(node)
    • parent.replaceChild(newElem, node)

    이 메서드들은 전부 node를 반환합니다.

    html에 HTML을 넣으면 메서드 elem.insertAdjacentHTML(where, html)은 where 값에 따라 특정 위치에 HTML을 삽입함

    • "beforebegin" – elem 바로 앞에 html을 삽입
    • "afterbegin" – elem의 첫 번째 자식 요소 바로 앞에 html을 삽입
    • "beforeend" – elem의 마지막 자식 요소 바로 다음에 html을 삽입
    • "afterend" – elem 바로 다음에 html을 삽입

    문자열이나 요소 삽입에 쓰이는 유사 메서드 elem.insertAdjacentText와 elem.insertAdjacentElement도 있는데, 잘 쓰이지는 않음

    페이지 로딩이 끝나기 전에 HTML을 삽입해주는 메서드:

    • document.write(html)

    문서 로딩이 끝난 상태에서 이 메서드를 호출하면 문서 내용이 지워짐. 오래된 스크립트에서 볼 수 있음


     

    문서 어딘가에 HTML을 추가해야 할 때는 insertAdjacentHTML이 최고의 선택입니다.

    <ul id="ul">
      <li id="one">1</li>
      <li id="two">4</li>
    </ul>

     

    -> one.insertAdjacentHTML('afterend', '<li>2</li><li>3</li>');

    one li 바로 아래로 들어간다.

     

     

     

     

     

     

     

     

     

     

     

     

    'Javascript' 카테고리의 다른 글

    이벤트 기초  (0) 2024.03.14
    자바스크립트 문서  (0) 2024.03.13
    [코어 자바스크립트] 기타  (0) 2024.02.29
    모듈  (0) 2024.02.28
    제너레이터  (2) 2024.02.28

    댓글

Designed by Tistory.