일반 DOM과 innerHTML 방법에 대한 비교 분석

황제낙엽 2008.11.03 13:21 조회 수 : 3063 추천:96

sitelink4 http://1 
extra_vars4 ko 
extra_vars5 http://blog.naver.com/dihkang/30014391194 
extra_vars6 sitelink1 
DOM과 innerHTML 방법에 대한 비교 분석
   Date: 2006-12-17, 03:31 AM
자바스크립트로 HTML 문서의 엘리먼트를 동적으로 생성하거나 업데이트를 하려면 DOM의 Element 함수를 이용하거나 간단히 innerHTML 프러퍼티를 이용하면 된다. 여러 사람들이 전자를 DOM 방법, 후자를 innerHTML 방법이라 일컫고 있다.
예를 들어, 아래의 DIV 엘리먼트에 자식 요소로 'Hello Word' 라는 버튼을 생성하는 스크립트를 생각해 보자.
1 <div id="mycontentdiv"></div> 
view plain | print | copy to clipboard | ?
먼저, DOM 방법으로 스크립트를 작성한다면 아래와 같다.
1 var mydiv = document.getElementById("mycontentdiv");  
2 var btn = document.createElement("input");  
3 btn.type = "button";  
4 btn.value = "Hello Word";  
5 mydiv.appendChild(btn);  
view plain | print | copy to clipboard | ?
<소스 1>
그리고, innerHTML 방법은 아래와 같다.
1 var mydiv = document.getElementById("mycontentdiv");  
2 mydiv = "<input type='button' value='Hello Word'>";  
view plain | print | copy to clipboard | ?
<소스 2>
얼핏 보기에 효율과 성능, 그리고 기타 여러 면에서 후자의 방법이 바람직하다고 판단할 수도 있겠지만 모든 상황에서 반드시 그렇지만은 않다.
앞서 본바처럼 innerHTML 방법은 딸랑 두줄로 끝날 것을 어느 미친 개발자가 복잡하고 힘들게 DOM 방법으로 구현할까 단순히 생각하기 쉽겠지만, DOM 방법이 유용할 상황도 있고 반드시 DOM 방법을 써야만 할 때도 있다.
먼저, 반드시 DOM 방법을 써야할 상황은 innerHTML을 지원하지 않는 엘리먼트의 자식 엘리먼트를 다루아야 할 때다. 브라우저마다 innerHTML을 프러퍼티를 Read-only로만 지원되거나 innerHTML 프러퍼티 자체가 없는 엘리먼트가 있고 각기 다른데, IE의 경우 그 태그 목록은 다음과 같다.
COL, COLGROUP, FRAMESET, HTML, STYLE, TABLE, TBODY, TFOOT, THEAD, TITLE, TR
IE뿐만 아니라 그 외 파이어폭스와 오페라 등의 브라우저도 TABLE 관련 엘리먼트에서 innerHTML을 사용할 수 없다. 사실, 이점은 innerHTML을 사용하는데 있어 크게 문제 되지는 않는다. 그러나 HTML 문서의 엘리먼트를 빈번하고 세심하게 업데이트해야 하고 기존의 이벤트 리스너를 계속 유지해야 하는 상황이라면 DOM 방법이 효율적이다. 예를 들어, 아래의 DIV 엘리먼트의 첫번째 자식 엘리먼트인 'Hello Word' 버튼 엘리먼트에 onclick 이벤트에 대한 핸들러가 할당되어 있을때 자식 엘리먼트로 '<input type="text" value="innerHTML vs. DOM">'를 추가해야 한다고 가정해보자.
1 <div id="mycontentdiv">  
2 <input type="button" value="Hello Word">  
3 </div> 
4  
5 <script type="text/javascript">  
6  
7 var div = document.getElementById("mycontentdiv");  
8 var input = div.getElementsByTagName("input")[0];  
9  
10 input.addEventListener("click", iamclicked, true);  
11  
12 function iamclicked() {  
13        alertt("I am clicked.");  
14 }  
15  
16 </script> 
17  
view plain | print | copy to clipboard | ?
<소스 3>
먼저 DOM 방법으로 구현한다면 아래의 소스4를 소스3에 추가하면 된다.
1 var mydiv = document.getElementById("mycontentdiv");  
2 var btn = document.createElement("input");  
3 btn.type = "text";  
4 btn.value = "innerHTML vs. DOM";  
5 mydiv.appendChild(btn);  
view plain | print | copy to clipboard | ?
<소스 4>
그 다음으로 innerHTML 방법으로 구현한 소스는 아래와 같다.
1 var mydiv = document.getElementById("mycontentdiv");  
2 mydiv.innerHTML += "<input type='text' value='innerHTML vs. DOM'>";  
view plain | print | copy to clipboard | ?
<소스 5>
여기서 퀴즈 하나. 과연 위의 소스4와 소스5의 결과가 같을까? 답은 같지 않다이다. 소스5의 innerHTML 방법은 'Hello World' 버튼의 onclick 이벤트 핸들러를 잃어버리게 되는 결과를 가져 온다. 원래의 소스3에서는 'Hello World' 버튼을 클릭하면 iamclicked 함수가 호출되어 'I am clicked.' 라는 알림창을 띄워 주는데 소스5를 추가하면 'Hello World' 버튼을 클릭해도 'I am clicked.' 알림창이 안 뜨게 된다. 이렇듯 innerHTML을 사용하지 못하는 경우 DOM 방법을 사용해야 하는데 getElementById, createElement, appendChild 등 작성해야할 코드가 많고 이런 작업들은 개발자에게는 매우 귀찮은 일이다. 그러나 이런 힘들고 귀찮은 DOM 스크립팅을 누워서 떡먹기보다 쉽게 할 수 있는 방법들을 사용하면 노가다의 지옥에서 구원 받을 수 있다.




번호 제목 글쓴이 날짜 조회 수
246 [Gemini] ajax 와 fetch 의 차이 황제낙엽 2025.01.04 3419
245 [검토 완료] 디바이스 카메라로 촬영한 사진을 서버에 업로드하기 샘플 황제낙엽 2024.11.21 3988
244 브라우저에서 이미지를 편집(crop 등) 할 수 있는 오픈소스 Cropper.js 황제낙엽 2024.11.16 3843
243 [ChatGPT] json data 의 정렬 [1] 황제낙엽 2024.07.23 3358
242 DOMContentLoaded 이벤트와 window.onload 이벤트 황제낙엽 2024.07.15 3673
241 fetch() 사용 예제들 황제낙엽 2024.07.09 3383
240 [Copilot] Vanilla JavaScript에서 외부 스크립트 파일에 정의된 함수들을 로드 황제낙엽 2024.06.21 3760
239 [Copilot] ES6 모듈(module) 문법 황제낙엽 2024.06.21 3815
238 [Copilot] JSON 객체 내부 데이터를 순회하면서 조회하는 코드 황제낙엽 2024.06.02 3273
237 [Copilot] JavaScript로 서버에 특정 값을 POST 방식으로 전달하고 응답을 기다리지 않고 바로 종료 황제낙엽 2024.05.31 3623
236 json 데이터 내의 변수명에 prefix 로 type 표현하기 황제낙엽 2024.04.15 3364
235 fetch() 함수 사용 예제 file 황제낙엽 2023.11.23 3607
234 현재 document 의 host 와 port 를 얻는 방법 황제낙엽 2023.10.03 4211
233 (Bard) FileReader 로 여러개의 파일을 read 하는 법 file 황제낙엽 2023.08.23 3666
232 How to build a file upload service with vanilla JavaScript file 황제낙엽 2023.08.22 3716
231 (Bard) JavaScript로 JSON 배열을 작성하는 방법 황제낙엽 2023.08.21 3674
230 모바일 브라우저에서 file input element 를 이용하여 여러장의 이미지를 서버에 전송하려 할때 [1] 황제낙엽 2023.08.21 3704
229 navigator.mediaDevices 황제낙엽 2023.08.21 3800
228 Barcode Detection API 황제낙엽 2023.08.06 3859
227 정규식을 이용한 이메일 검증 스크립트 file 황제낙엽 2023.06.25 2895