ABOUT ME

Today
Yesterday
Total
  • DOM 조작 - 컨텐츠 추가하기
    프론트엔드/DOM 2020. 10. 16. 12:44

    다른 글에선 HTML에 컨텐츠를 추가하거나 읽어줄 때 다음과 같은 방법을 사용한다고 했다.

     

    선택된 요소 노도의 텍스트 값 확인: 'textContent'

    선택된 요소 노도의 텍스트 값 확인: 'innerText'

    선택된 요소 노도의 텍스트+태그까지 확인: 'innerHTML'

     

    이 중에서 'innerHTML'은 텍스트 뿐 아니라 태그는 따로 분류하여 처리한다.

     

    만약에 자바스크립트를 통해 HTML 화면상에 무언가 문서를 추가로 넣고 싶다면 'innerHTML'을 쓴다.

     

    다만 'innerHTML'은 보안상의 문제를 일으킬 수 있다.

     

    그렇다면 어떻게 해야 상대적으로 안전하게 HTML 화면에 내용을 추가해줄 수 있을까?

     

    그럴 때는 각종 노드를 만들고 다루는 메서드를 이용하면 된다.

     

    우선 간단하게 보면 다음과 같다.

     

    createElement(tagname) : 태그 이름을 인자로 전달하여 요소를 생성한다.

    createTextNode(txt) : 텍스트를 인자로 전달 받아 텍스트 노드를 생성한다.

    appendChild(Node) : 인자로 전달한 노드를 마지막 자식 요소로 DOM 트리에 추가한다.

    removeChild(Node) : 인자로 전달한 노드를 DOM 트리에서 제거한다.

     

    자세한 사용법은 다음과 같다.

    1. create 메서드 사용법

    <body>
        <div class="container"></div>
    </body>

     

    위와 같이 아무 내용도 없는 <div>에 내용을 추가해주는 함수 코드다.

     

    <script>
    
        let con = document.getElementsByClassName('container')[0];
    
        function createList(text){
        
            let p = document.createElement('p'); // p 태그 요소 노드 생성
            
            let newtext = document.createTextNode(text); // 인자로 만든 텍스트를 이용해 텍스트 노드 생성
            
            p.appendChild(newtext); // p 태그 요소 노드에 텍스트 노드를 자식으로 추가
            
            con.appendChild(p); // div 태그 요소 노드에 p 태그 요소 노드  자식으로 추가
        }
    
        createList("테스트입니다.");
    
    </script>

     

    해당 함수를 실행하면 다음과 같은 결과가 나타난다.

     

     

    콘솔에서 생성한 <p>를 출력해보면 다음과 같다.

     

    2. create 메서드와 innerHTML의 차이

    'createElement()'메서드와 'createTextNode()'메서드 이용법을 알아봤다.

     

    여기까진 좋다.

     

    그런데 이게 'innerHTML'을 대신한다는걸까?

     

    아래는 위의 내용을 실행하기 전 아무 내용이 없는 <div>태그다.

     

    이제 여기에 붉은색 글씨를 추가해줄 예정이다.

     

    <body>
        <div class="container"></div>
    </body>

     

    그리고 아래는 각각 'create'메서드와 'innerHTML'에 원하는 텍스트를 넣을 수 있는 함수다.

     

    <script>
    
        let con = document.getElementsByClassName('container')[0];
    
        function createList(text){
            let p = document.createElement('p'); // p 태그 요소 노드 생성
            
            let newtext = document.createTextNode(text); // 인자로 만든 텍스트를 이용해 텍스트 노드 생성
            
            p.setAttribute('style', 'color : red');
            
            p.appendChild(newtext); // p 태그 요소 노드에 텍스트 노드를 자식으로 추가
            
            con.appendChild(p); // div 태그 요소 노드에 p 태그 요소 노드  자식으로 추가
        }
    
        createList("<span style='color : red'> innerHTML 테스트입니다 </span>");
        
        
        function inner(text){
            let p = document.createElement('p'); // p 태그 요소 노드 생성
    
            p.innerHTML = text; // p태그에 innerHTMl로 텍스트 삽입
    
            con.appendChild(p); // div 태그 요소 노드에 p 태그 요소 노드 자식으로 추가
        }
    
        inner("<span style='color : red'> innerHTML 테스트입니다 </span>");
    
    </script>

     

    두 함수에 아래의 텍스트를 넣은 결과는 다음과 같다.

    <span style='color : red'> innerHTML 테스트입니다 </span>

     

    'textContent'를 이용할 때와 달리 'create' 메서드만으로도 'innerHTML'을 넣었을 때와 같은 효과를 낸다.

     

     

    즉 이제 사용자가 입력한 텍스트를 사용자 개입없이도 다양한 방식으로 화면에 표현할 수 있다는 것이다.

Designed by Tistory.