javascript 필드 동적 생성/제거 (innerHTML, appendChild)

javascript 필드 동적 생성/제거 (innerHTML, appendChild)

자바스크립트에서 동적으로 필드를 생성하기 위해 innerHTML을 사용해 div 필드를 붙여넣어 보았다.

var newDivHtml = “<div id=’aaa’></div>”;

document.body.innerHTML = document.body.innerHTML + “” + newDivHtml;

그러나 이 경우, 화면에는 표시가 되지만(동적 생성은 되지만), 동적 삭제가 불가능하다.

다시 document.body.innerHTML 를 출력해보면 문자열 상에서 id가 aaa인 div를 찾을 수 없기 때문이다.

구글링 해본 결과, innerHTML로 추가한 결과 문자열을 얻으려면 document.documentElement.innerHTML 을 사용하면 된다고 했지만, 테스트 결과 찾을 수 없었다.

결국 유효한 코드는 다음과 같다.

———- <javascript div 동적 생성> ———-

var newDivHtml = “<span>추가할 내용</span>”;

var div = parent.document.createElement(“div”);
div.id = “aaa”;
div.innerHTML = newDivHtml;

// body에 심기

parent.document.getElementsByTagName(“body”)[0].appendChild(div);

// 특정 필드에 심기

// parent.document.getElementById(“targetDiv”).appendChild(div);

—————————————-

———- <javascript div 동적 제거> ———-

function remove(id) {
    var elem = document.getElementById(id);
    return elem.parentNode.removeChild(elem);
}

remove(“aaa”);

—————————————-

이러한 innerHTML 을 사용할 때 문제가 하나 있었는데, 바로 for 문 또는 while 문 안에서 사용하는 경우였다.

for문 안에서 innerHTML 이나 appendChild 를 사용하면

중간 과정이 html 상에 그려지지 않는 문제가 있었다.

루프를 한 번 돌때마다 alert을 띄우면 중간 과정이 그려졌는데 그러자면 innerHTML을 사용하는 의미가 없어진다.

구글링을 해보았지만 외국 코더 분들도 딱히 답이 없어보였다.

그 중에 제일 나은 답안이 for문 혹은 while 문을 setInterval 로 바꾸는 방안이었다.

예를 들어 while 문이 아래와 같이 있다면

————— <AS-IS> —————

var i = 초기값;

while(조건) {

    // 내용…

}

// 루프 빠져나와서 수행할 내용

—————————————-

————— <TO-BE> —————

var i = 초기값;

var loop = window.setInterval(function(){

    if (!(조건)) {

        window.clearInterval(loop);

        // 루프 빠져나와서 수행할 내용

    }

    // 내용…

}, 100);

—————————————-