본문 바로가기
Development (국비 복습 )/자바

[2023-09-09]DOM,노드추가 방법

by Puddingforever 2023. 3. 9.

1.문서객체모델 DOM

소스를 적으면 , 브라우저가 잘못된 부분을 정리해서 보여준다.

이렇게 브라우저가 소스를 분석해서 처리해준 것이 요소(element)인데. 이걸해주는게 문서객체모델(Document Object Model)이다.

 

DOM은 상위태그 하위태그로 구성되어있으며, 각각 룰이 있다. 

<head>요소는 meta태그나, css를 넣어줌 

<body>요소에는 코드를 넣어줌 

 

만약 style을 <body> 맨밑에 적으면, 코드를 읽은 후, 스타일로 가서 스타일을 입힌 후 다시 문서로 가기 때문에 비효율적이다. 

 

요소(부모요소 Parent) 밑에 있는 요소(자식요소Child )들

만약 상하관계가 없다면 이웃(Sibling)이라고 함 

Parent , Siblings , Child

만약 Parents라고 했을 경우, 부모도 포함하고 그 위까지 포함한다. 

자바스크립트는 이러한 객체 모델을 이용하여 다음과 같은 작업을 할 수 있습니다.

 

- 자바스크립트는 새로운 HTML 요소나 속성을 추가할 수 있습니다.

- 자바스크립트는 존재하는 HTML 요소나 속성을 제거할 수 있습니다.

- 자바스크립트는 HTML 문서의 모든 HTML 요소를 변경할 수 있습니다.

- 자바스크립트는 HTML 문서의 모든 HTML 속성을 변경할 수 있습니다.

- 자바스크립트는 HTML 문서의 모든 CSS 스타일을 변경할 수 있습니다.

- 자바스크립트는 HTML 문서에 새로운 HTML 이벤트를 추가할 수 있습니다.

- 자바스크립트는 HTML 문서의 모든 HTML 이벤트에 반응할 수 있습니다.

 

 

 

 

[참고!!]

소스 쓸 때, 모든건 DOM 객체에 등록된다. 
DOM객체에 등록된 것중의 최상위 객체는 window객체이다.  

 


1.getElementsByTagName() 

 

DOM객체의 item()메소드는 선택된 요소의 값을 가져온다. 

DOM객체의 getElementsByTagName()은 선택된 요소값을 가져오며, 저장되는 값은 배열이다

    var selectedElements = document.getElementsByTagName("li");
    
    for(var i=0; i<selectedElements.length; i++){
        document.write(selectedElements.item(i).innerHTML + "<br>");
        selectedElements.item(i).style.color="red";
    }

[li,li,li] 이런식으로 저장됨 

style은 css설정을 바꿔준다 .

 

2.getElementById() 

id값으로 선택할 때는 찾은 첫번째 id값만 가져온다. 

<ul>
    <li>첫번째 아이템입니다.</li>
    <li id="even">두번째 아이템입니다.</li>
    <li>세번째 아이템입니다.</li>
    <li id="even">네번째 아이템입니다.</li> // 안바뀜
    <li>다섯번째 아이템입니다.</li>
</ul>

<script>
    //id값으로 선택할 때는 먼저 찾은 거만 선택된다. 
    var selectedElement = document.getElementById("even");
    selectedElement.style.color = "blue";
</script>

3.getElementsByClass

 

class의 이름은 여러가지 넣을 수 있다.

    <li class="even evenli">아이템입니다.</li>

이건 이름이 even도 되고, evenli도 되는 것이다.

 

class로 요소를 선택할 때도 getElementsByClassName

s이기 때문에 배열로 반환한다. [li,li]

<ul>
    <li>첫번째 아이템입니다.</li>
    <li class="even">두번째 아이템입니다.</li>
    <li>세번째 아이템입니다.</li>
    <li class="even evenli">네번째 아이템입니다.</li> 
    <li>다섯번째 아이템입니다.</li>
</ul>

<script>
   var selectedElements = document.getElementsByClassName("even");
   for(var myElement of selectedElements){
        myElement.style.color = "green"; 
   }

4.getElementsByName()

문서상의 name속성값으로 요소를 선택함 

이것도 s로 되어있기 때문에 배열로 저장됨 

<ul>
    <li>첫번째 아이템입니다.</li>
    <li name="even">두번째 아이템입니다.</li>
    <li>세번째 아이템입니다.</li>
    <li name="even">네번째 아이템입니다.</li> 
    <li>다섯번째 아이템입니다.</li>
</ul>
<p name="even">첫번째 단락입니다.</p>

<script>
    var selectedElement = document.getElementsByName("even");
    for(var i=0;i<selectedElement.length;i++){
        selectedElement[i].style.color = "red";
    }
</script>

5. querySelectorAll() , querySelector()

querySelectorAll() : 모든 요소를 선택해서 요소들이 저장된 배열 객체를 반환합니다

querySelector(): 요소를 하나만 선택

<ul>
    <li id="myLi" class="odd" name="odd">첫번째 아이템이에요</li>
    <li id="myLi" class="even" name="even">두번째 아이템이에요</li>
    <li id="myLi" class="odd" name="odd">세번째 아이템이에요</li>
    <li id="myLi" class="even" name="even">네번째 아이템이에요</li>
    <li id="myLi" class="odd" name="even">다섯번째 아이템이에요</li>
</ul>

<script>
    //var selectedElements = document.getElementsByClassName("odd");
    var selectedElements = document.querySelectorAll("li.odd");
    var selectedElements = document.querySelectorAll("p.odd");

    for(var myElement of selectedElements){
        document.write(myElement.innerHTML + "<br>");
        myElement.style.color = "red";
    }
</script>

 getElementById()아이디가 여러개여도 처음 요소만 선택되었는데 querySelectorAll는 모든 요소가 선택된다. 

 

<ul>
    <li id="myOdd" class="odd" name="odd">첫번째 아이템이에요</li>
    <li id="myOdd" class="even" name="even">두번째 아이템이에요</li>
    <li id="myOdd" class="odd" name="odd">세번째 아이템이에요</li>
    <li id="myOdd" class="even" name="even">네번째 아이템이에요</li>
    <li id="myOdd" class="odd" name="even">다섯번째 아이템이에요</li>
</ul>

<script>
   var selectedElements = document.querySelectorAll("#myOdd");
    for(var myElement of selectedElements){
        document.write(myElement.innerHTML + "<br>");
        myElement.style.color = "red";
    }

 

 var selectedElements = document.querySelectorAll("*[name='odd']"); // name속성이 odd인 모든 요소를 선택 
    var selectedElements = document.querySelectorAll("p[name='odd']"); // name속성이 odd인 모든 p요소

css selector 복습 !! 

		/*name 속성이 p1인 모든 p 요소 선택 */
		/*p[name="p1"] {background-color:aqua;}*/

		/*name 속성이 p1인 모든 요소 선택 */
		/* *[name="p1"] {background-color:aqua;}*/

		/*name 속성을 가진 p 요소 선택 */
		/* p[name] {background-color:aqua;}*/

노드(node) : 요소 하나하나 

 

 

 

노드리스트 

 

 

 

 


부모요소.appendChild(자식요소) 

부모요소의 맨 끝에 자식 요소를 추가한다. 

 

appendChild()를 하면 , 기존에 있던걸 가져온거라서 원래 있던게 삭제되고 그냥 옮겨온다.

 

 

 

 

이를 피하려면 , 문서를 그냥 만들고 추가하면 되지 않을까?

하지만 이는 잘못된 사용방법이다. 텍스트  형식의 값으로 새로운 요소를 추가할 수 없다

function appendNode2(){
        var parent = document.getElementById("listDiv");
        var newItem = "<p>새로추가</p>"
        parent.appendChild(newItem);
        
        //parent.appendChild("<p>새로추가</p>")
    }

 

올바른 방법은 createElement() 메소드를 사용해서 요소를 만든 후에, 그 안에 텍스트노드를 넣는다. 

function appendNode2(){
var parent = document.getElementById("listDiv");    
//요소를 document객체의 자식으로 생성, 자동으로 <p>랑 </p>가 생성 
var newItem = document.createElement("p");
//p요소에 텍스트노드를 추가
newItem.innerHTML = "새로 추가됨";
//요소 추가
parent.appendChild(newItem);
}

 

 

insertBefore(요소1,요소2)

요소2앞에 요소1을 넣음 

 


    //insertBefore(요소2,요소3)
    function insertNode1(){
        var parent = document.getElementById("listDiv");
        var existItem = document.getElementById("p2"); // css
        var newItem = document.getElementById("h2"); //javasript
        parent.insertBefore(newItem,existItem); css 앞에 javascript 추가 
    }

 

 

    function insertNode2(){
        var parent = document.getElementById("listDiv");
        var existItem = document.getElementById("p2"); //css
        var newItem = document.createElement("p"); 
        newItem.innerHTML = "insertBefore로 추가되었습니다."
        parent.insertBefore(newItem,existItem)
    }

 

 

 

참고 !! 

 

새로만든 Node를 기준으로는 옮길 수 없다 에러남

The node before which the new node is to be inserted is not a child of this node.
    at addNode

 

 function addNode(){
        var parent = document.getElementById("listDiv");
        var p1 = document.getElementById("p1");
        var p2 = document.getElementById("p2");

        var createE = document.createElement("p");
        createE.innerHTML = "세번째";

        parent.insertBefore(p1,createE);

    }

 

속성값 추가 

setAttribute(속성,속성값)

  var newItem = document.createElement("p"); //속성추가

        // //p요소의 class속성에 p1이 설정되도록 구현
        // //1.속성노드 생성
        // var newAttr = document.createAttribute("class");
        // //2.속성 노드에 값을 지정
        // newAttr.value = "p1";
        // //3.값이 설정된 속성노드를 요소노드에 추가
        // newItem.setAttributeNode(newAttr);

        newItem.setAttribute("class","p2")
        newItem.setAttribute("style","color:red");
        newItem.setAttribute("style","font-size:30px;")

 

 

 

화면에 표시된 노드추가5 버튼을 클릭했을 때, 다음의 기능이 동작하는
함수를 정의하고, 테스트합니다.
1.id가 myResult인 요소 안에 textarea 요소를 추가하고 
createElement()

2.추가되는 textarea요소에 다음의 속성과 값을 설정
폭 300px , 높이 100px
입력란에 ->원하는 내용을 입력하세요  .. (placeholder)
. 입력시에 사라지도록 구현 

<script>
    function appendNode3(){
        var parent = document.getElementById("myResult");
        var child = document.createElement("textarea"); 
        child.setAttribute("style","width:300px;height:100px");
        child.setAttribute("placeholder","'원하는 내용을 입력하세요'");
        parent.appendChild(child);
    }
</script>

 

 

class속성을 추가하려 했으나 설정되지 않았다. 

이런 노드 처리 방법은 바뀌는 경우도 있지만 바뀌지 않는 경우도 많다. 

 

 

<h1>요소의 속성변경</h1>
<a id="myLink" href="https://www.daum.net">Daum으로 이동</a>
<button type="button" onclick="changeToNaver()">네이버로 변경</button>
<hr>
<input id="mname" class="mname" name="mname">

<script>
    function changeToNaver(){
        var myLink = document.getElementById("myLink") ;
        //방법1: 속성에다가 추가한 것 
        myLink.innerHTML = "네이버로 이동" ;
        myLink.href = "https://www.naver.com" ;
        myLink.class = "yourLink" ;

        //방법2
        // myLink.innerHTML = "네이버로 이동"
        // myLink.setAttribute("href", "https://www.naver.com") ;
        // myLink.setAttribute("class", "yourLink2") ;
    }
</script>

setAttribute 는 속성이 무조건 바뀐다

<h1>요소의 속성변경</h1>
<a id="myLink" class="myLink" href="https://www.daum.net">Daum으로 이동</a>
<button type="button" onclick="changeToNaver()">네이버로 변경</button>
<hr>
<input id="mname" class="myInput">

<script>
    function changeToNaver(){
        var myLink = document.getElementById("myLink") ;
        var myInput = document.getElementById("mname") ;

        // //방법1: 속성에다가 추가한 것 
        // myLink.innerHTML = "네이버로 이동" ;
        // myLink.href = "https://www.naver.com" ;
        // myLink.class = "yourLink" ; //설정 X
        // var myInput = document.getElementById("mname");
        // myInput.class = "yourInput";
        // myInput.value = "함수실행 입력값입니다."

        //방법2
        myLink.innerHTML = "네이버로 이동"
        myLink.setAttribute("href", "https://www.naver.com") ;
        myLink.setAttribute("class", "yourLink2") ;

        myInput.setAttribute("value","함수실행 입력값입니다.2");
        myInput.setAttribute("class","yourInput");


    }

 

댓글