JavaScript로 HTML 요소 삽입


105

다음 구문을 사용할 때 각 속성 및 이벤트 유형에 대한 해결 방법을 지루하게 검색하는 대신 :

elem = document.createElement("div");
elem.id = 'myID';
elem.innerHTML = ' my Text '
document.body.insertBefore(elem,document.body.childNodes[0]);

전체 HTML 요소를 문자열로 선언 할 수있는 방법이 있습니까? 처럼:

elem = document.createElement("<div id='myID'> my Text </div>");
document.body.insertBefore(elem,document.body.childNodes[0]);

답변:


124

직접 엉망으로 innerHTML만드는 대신 조각을 만든 다음 삽입하는 것이 좋습니다.

function create(htmlStr) {
    var frag = document.createDocumentFragment(),
        temp = document.createElement('div');
    temp.innerHTML = htmlStr;
    while (temp.firstChild) {
        frag.appendChild(temp.firstChild);
    }
    return frag;
}

var fragment = create('<div>Hello!</div><p>...</p>');
// You can use native DOM methods to insert the fragment:
document.body.insertBefore(fragment, document.body.childNodes[0]);

혜택:

  1. insertBefore, appendChild 등과 같은 삽입을 위해 네이티브 DOM 메서드를 사용할 수 있습니다.
  2. 삽입되기 전에 실제 DOM 노드에 액세스 할 수 있습니다. 조각의 childNodes 개체에 액세스 할 수 있습니다.
  3. 문서 조각을 사용하는 것은 매우 빠릅니다. DOM 외부에 요소를 만드는 것보다 빠르며 특정 상황에서는 innerHTML보다 빠릅니다.

innerHTML함수 내에서 사용 되지만 모든 것이 DOM 외부에서 발생하므로 생각보다 훨씬 빠릅니다.


3
이 createDocumentFragment ()는 "레거시"innerHTML만큼 좋지 않을 것이라고 확신합니다.
TheFlash

2
이 방법은 모든 최신 브라우저에서 작동합니다. IE 5.5 이하의 경우 다음과 같은 검사를 수행 할 수 있습니다. if (document.createDocumentFragment) {create ( '...'); } else {/ * 아마도 innerHTML 사용 * /}
James

32
crescentfresh, 나는 사람들을 돕는 것을 좋아하기 때문에 그렇게 돕습니다. 솔루션이 모든 상황에서 100 % 작동하지 않으면 죄송합니다. 너무 염려된다면 이미 제공된 답변에 대해 불필요하게 비판적이지 않고 자신의 솔루션을 제공하지 않는 이유는 무엇입니까? 추상화에는 항상 가장자리 케이스가 있습니다! 이것은 학습 환경입니다. 우리는 사람들에게 해결책을 제공하기 위해 여기에있는 것이 아닙니다. 우리는 우리가하는 일에서 서로를 더 잘할 수 있도록 돕기 위해 여기에 있습니다! 그리고 미안하지만 "AJAX"를 언급 한 사람은 어디 있습니까?
James

1
그럴 수 있지. 죄송합니다. 나는 여기에 경고가 전혀 언급되지 않은 추상화가 너무 많다고 느낍니다.
Crescent Fresh

1
SIME의 VIDAS의 대답은 훨씬 더 - 이것은 필요 이상 방법이 더 복잡하다
JonnyRaa

83

당신은 이것을 원합니다

document.body.insertAdjacentHTML( 'afterbegin', '<div id="myID">...</div>' );

13
이것이 왜 받아 들여지지 않는지 확실하지 않습니다. 이 방법은 간단하고 분명 올
JonnyRaa

@JonnyLeeds 이것은 body요소 에서 작동하지 않는 것 같지만 다른 요소에서는 잘 작동합니다.
Phill

1
@Phill 물론 <body>. 사실, 그것을 실행하는 <body>것은 콘솔을 통해 웹 페이지에 스타일 시트와 같은 것을 삽입하는 나의 표준 방법입니다. 어떤 문제가 있습니까?
Šime Vidas

@ ŠimeVidas 아마도 body 요소가 실행 시간에 정의되지 않았기 때문일 것입니다 ... 나는 그 문제를 방지하기 위해 당신의 줄을 window.onload = function () {…}과 짝을지었습니다
GDY

@Grandy Phill은 다른 요소에서도 작동한다고 썼습니다. <body>정의되지 않은 경우 다른 모든 요소도 마찬가지이므로 Phill의 문제가 아닐 수 있습니다.
Šime Vidas

32

insertAdjacentHTML 살펴보기

var element = document.getElementById("one");
var newElement = '<div id="two">two</div>'
element.insertAdjacentHTML( 'afterend', newElement )
// new DOM structure: <div id="one">one</div><div id="two">two</div>

position 은 삽입하려는 요소에 대한 상대적인 위치 입니다.

'beforebegin' 요소 자체 앞

'afterbegin' 요소 바로 안쪽, 첫 번째 자식 앞

'beforeend' 요소 바로 내부, 마지막 자식 뒤

'afterend' 요소 자체 뒤


17

구식 JavaScript에서는 다음과 같이 할 수 있습니다.

document.body.innerHTML = '<p id="foo">Some HTML</p>' + document.body.innerHTML;

귀하의 의견에 대한 답변 :

[...] 요소가 아닌 새 요소의 속성과 이벤트의 소스를 선언하는 데 관심이있었습니다 innerHTML.

하지만 새 HTML을 DOM에 삽입해야합니다. 이것이 innerHTML구식 JavaScript 예제에서 사용되는 이유 입니다. innerHTMLBODY요소는 새로운 HTML로 앞에 추가됩니다. .NET 내부의 기존 HTML을 실제로 건드리지 않습니다 BODY.

이를 명확히하기 위해 위에서 언급 한 예를 다시 작성하겠습니다.

var newElement = '<p id="foo">This is some dynamically added HTML. Yay!</p>';
var bodyElement = document.body;
bodyElement.innerHTML = newElement + bodyElement.innerHTML;
// note that += cannot be used here; this would result in 'NaN'

JavaScript 프레임 워크를 사용하면이 코드가 훨씬 덜 장황 해지고 가독성이 향상됩니다. 예를 들어 jQuery를 사용하면 다음을 수행 할 수 있습니다.

$('body').prepend('<p id="foo">Some HTML</p>');

꽤 좋습니다. 하지만 요소의 innerHTML이 아니라 새 요소의 속성과 이벤트의 소스를 선언하는 데 관심이있었습니다.
TheFlash

1
document.getElementsByTagName('body')[0]실제로 document.body, 좋은 점 으로 대체 될 수 있습니다 . 그러나 BODY 대신 기존의 다른 요소에 새 HTML을 추가하거나 추가하려면 document.getElementById()및 / 또는 document.getElementsByTagName(); 을 사용해야합니다 . 이것이 제가 예제에서 사용한 이유입니다.
Mathias Bynens

1
또한 "innerHTML"을 직접 추가 / 삽입하는 경우 코드가 매우 지저분해질 수 있습니다.
James

1
@JimmyP : 무슨 쓰레기! 이 질문의 목적은 HTML을 구성하는 함수 (attrib 별 attrib, 노드 별, 요소 별)를 사용하는 대신 HTML을 문자열로 직접 삽입 할 수 있도록하는 것입니다.
TheFlash

1
이것은 모든 이벤트 핸들러를 분리하고 메모리 누수를 크게 유발할 수 있습니다.
adardesign 2010-08-22

1

공정하게 말하면 상당히 새롭고 제한적이지만이 기술의 유일한 잠재적 인 문제는 일부 테이블 요소를 동적으로 생성 할 수 없다는 사실입니다.

숨겨진 DIV에 "템플릿"요소를 추가 한 다음 cloneNode (true)를 사용하여 복제본을 만들고 필요에 따라 추가하여 템플릿에 양식을 사용합니다. 중복을 방지하기 위해 필요에 따라 ID를 다시 할당해야한다는 점을 명심하십시오.


-1

다른 사람들이 말했듯이 편리한 jQuery prepend 기능을 에뮬레이션 할 수 있습니다.

var html = '<div>Hello prepended</div>';
document.body.innerHTML = html + document.body.innerHTML;

어떤 사람들은 innerHTML 을 "혼잡"하지 않는 것이 낫다고 말하지만 , 다음을 알고 있다면 많은 사용 사례에서 신뢰할 수 있습니다.

경우 <div>, <span>또는 <noembed>노드는 문자를 포함하는 자식 텍스트 노드를 (가 &), ( <), 또는 ( >)는 innerHTML을은이 문자를 반환 &amp, &lt&gt각각. Node.textContent이러한 텍스트 노드 내용의 올바른 복사본을 가져 오는 데 사용 합니다.

https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML

또는:

var html = '<div>Hello prepended</div>';
document.body.insertAdjacentHTML('afterbegin', html)

insertAdjacentHTML아마도 좋은 대안 일 것입니다 : https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML


-2

기존 페이지의 태그 안에 HTML 코드를 삽입하려면 Jnerator를 사용 하십시오 . 이 도구는이 목표를 위해 특별히 만들어졌습니다.

다음 코드를 작성하는 대신

    var htmlCode = '<ul class=\'menu-countries\'><li
        class=\'item\'><img src=\'au.png\'></img><span>Australia </span></li><li
        class=\'item\'><img src=\'br.png\'> </img><span>Brazil</span></li><li
        class=\'item\'> <img src=\'ca.png\'></img><span>Canada</span></li></ul>';
    var element = document.getElementById('myTag');
    element.innerHTML = htmlCode;

더 이해하기 쉬운 구조를 작성할 수 있습니다.

    var jtag = $j.ul({
        class: 'menu-countries',
        child: [
            $j.li({ class: 'item', child: [
                $j.img({ src: 'au.png' }),
                $j.span({ child: 'Australia' })
            ]}),
            $j.li({ class: 'item', child: [
                $j.img({ src: 'br.png' }),
                $j.span({ child: 'Brazil' })
            ]}),
            $j.li({ class: 'item', child: [
                $j.img({ src: 'ca.png' }),
                $j.span({ child: 'Canada' })
            ]})
        ]
    });
    var htmlCode = jtag.html();
    var element = document.getElementById('myTag');
    element.innerHTML = htmlCode;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.