DOM에 HTML 문자열 추가


121

이 HTML 문자열을 추가하는 방법

var str = '<p>Just some <span>text</span> here</p>';

ID가있는 DIV에 'test'DOM에있는 ?

(Btw div.innerHTML += str;는 허용되지 않습니다.)

답변:


243

사용 insertAdjacentHTML이 가능한 경우는 true, 그렇지 않은 경우는 대체 어떤 종류를 사용합니다. insertAdjacentHTML 은 현재의 모든 브라우저에서 지원됩니다 .

div.insertAdjacentHTML( 'beforeend', str );

라이브 데모 : http://jsfiddle.net/euQ5n/


1
@alex 동일한 개념입니다 : HTML 문자열을 구문 분석하여 DOM에 넣습니다. 그러나 기능은 다릅니다- innerHTML문자열을 요소 (모든 자식 대체)에 insertAdjacentHTML넣는 반면 (1) 요소 앞에, (2) 요소 뒤에, (3) 요소 내부에 첫 번째 자식 앞에 놓거나 (4) 마지막 자식 뒤의 요소 내부.
Šime Vidas 2011 년

3
@alex insertAdjacentHTML는 요소의 기존 자식을 직렬화하고 재분석하지 않기 innerHTML때문에에 추가하는 것보다 빠릅니다 insertAdjacentHTML.
hsivonen 2011 년

2
또한 insertAdjacentHTML변경된 양식 요소의 값을 유지하는 반면에 추가 innerHTML하면 요소가 다시 작성되고 모든 양식 컨텍스트가 손실됩니다.
Brandon Gano 2013

20

이것이 허용됩니까?

var child = document.createElement('div');
child.innerHTML = str;
child = child.firstChild;
document.getElementById('test').appendChild(child);

jsFiddle .

그러나 , 닐의 대답은 더 나은 솔루션입니다.


1
@ Šime DOM API로 작업하는 것은 항상 해킹처럼 느껴집니다. : P 없이 문자열을 직렬화 해제 하시겠습니까 innerHTML?
alex

예, 브라우저의 HTML 파서를 활용하는 다른 방법이 있다면 알고 싶습니다 ...
Šime Vidas 2011-09-06

1
@ Šime-브라우저의 HTML 파서 인 innerHTML과 document.write를 활용하는 방법은 두 가지 뿐이라고 생각합니다. 그리고 innerHTML이 해킹이라고 생각한다면 ...
Alohci 2011-09-06

@Alohci가 있습니다 또 다른 방법 : insertAdjacentHTML.
Šime Vidas 2011 년

1
@ Šime-감사합니다. WHATWG 버전을 찾았습니다. 그것은에있어 DOM 구문 분석 및 직렬화 사양. innerHTML 및 insertAdjacentHTML뿐만 아니라 outerHTML 및 createContextualFragment가 있음을 나타냅니다.
Alohci 2011 년

16

공연

AppendChild(E)는 크롬 및 사파리의 다른 솔루션보다 2 배 이상 빠르며, insertAdjacentHTML(F)는 파이어 폭스에서 가장 빠릅니다. innerHTML=(B) (와 혼동하지 마십시오+= ) A는 () 모든 브라우저에서 두 번째 빠른 솔루션이며 E와 F보다 훨씬 더 편리합니다

세부

환경 설정 (2019.07.10) Chrome 75.0.3770 (64 비트), Safari 11.1.0 (13604.5.6), Firefox 67.0.0 (64 비트)에서 MacOs High Sierra 10.13.4

여기에 이미지 설명 입력

  • Chrome E (초당 140k 작업)가 가장 빠르고 B (47k) 및 F (46k)가 초, A (332)가 가장 느립니다.
  • 파이어 폭스에서 F (94k)가 가장 빠르며 B (80k), D (73k), E (64k), C (21k) 가장 느림은 A (466)입니다.
  • Safari E (207k)에서 가장 빠르고 B (89k), F (88k), D (83k), C (25k), 가장 느린 것은 A (509)

여기 에서 컴퓨터 에서 테스트를 재생할 수 있습니다.


12

아이디어는 innerHTML중간 요소에서 사용한 다음 모든 자식 노드를를 통해 원하는 위치로 이동하는 것 appendChild입니다.

var target = document.getElementById('test');
var str = '<p>Just some <span>text</span> here</p>';

var temp = document.createElement('div');
temp.innerHTML = str;
while (temp.firstChild) {
  target.appendChild(temp.firstChild);
}

이것은 이벤트 핸들러를 지우는 것을 방지 div#test하지만 여전히 HTML 문자열을 추가 할 수 있습니다.


3

올바른 방법은 insertAdjacentHTML. 8 이전의 Firefox에서는 태그 가 포함되지 않은 Range.createContextualFragment경우 다시 사용할 수 str있습니다 script.

태그 str가 포함 된 경우 조각 을 삽입하기 전에에서 반환 한 조각에서 요소 script를 제거해야합니다 . 그렇지 않으면 스크립트가 실행됩니다. ( 스크립트를 실행할 수 없음으로 표시합니다.)scriptcreateContextualFragmentinsertAdjacentHTML


언급 해 주셔서 감사합니다 createContextualFragment . 사용자가 쿠키 설정에 동의하는 경우에만 스크립트가 포함 된 일부 html 포함을 만드는 방법을 찾고있었습니다.
schliflo

3

빠른 해킹 :


<script>
document.children[0].innerHTML="<h1>QUICK_HACK</h1>";
</script>

사용 사례 :

1 : .html 파일로 저장하고 chrome, firefox 또는 edge에서 실행합니다. (IE는 작동하지 않습니다)

2 : http://js.do 에서 사용

실행 중 : http://js.do/HeavyMetalCookies/quick_hack

주석으로 분류 :

<script>

//: The message "QUICK_HACK" 
//: wrapped in a header #1 tag.
var text = "<h1>QUICK_HACK</h1>";

//: It's a quick hack, so I don't
//: care where it goes on the document,
//: just as long as I can see it.
//: Since I am doing this quick hack in
//: an empty file or scratchpad, 
//: it should be visible.
var child = document.children[0];

//: Set the html content of your child
//: to the message you want to see on screen.
child.innerHTML = text;

</script>

내가 게시 한 이유 :

JS.do에는 두 가지 필수 항목이 있습니다.

  1. 자동 완성 없음
  2. 수직 모니터 친화적

그러나 console.log 메시지는 표시되지 않습니다. 빠른 해결책을 찾기 위해 여기에 왔습니다. 스크래치 패드 코드 몇 줄의 결과를보고 싶을 뿐이고 다른 솔루션은 작업이 너무 많습니다.


1

왜 허용되지 않습니까?

document.getElementById('test').innerHTML += str

그것을하는 교과서 방식 일 것입니다.


4
그래도 연결된 이벤트 핸들러를 죽일#test입니다. 일반적으로 바람직하지 않습니다.
alex

흥미 롭습니다. 정말 논리적이지 않은 것 같습니다.
Nick Brunt

2
HTML을 문자열로 직렬화 한 다음 HTML을 다시 설정하는 것에 대해 생각한다면 논리적이라고 생각합니다.
alex

이벤트 핸들러를 재설정하려면 JavaScript를 다시 실행해야한다고 생각합니다. 그럴 수 있지.
Nick Brunt 2011 년

1
@Nick DOM의 일부를 문자열 화 (직렬화)하여 다른 문자열과 연결 한 다음 전체를 DOM으로 다시 구문 분석 할 수는 없습니다. alex가 말했듯이 직렬화는 바인딩 된 이벤트 핸들러를 기록하지 않습니다. 직렬화가 모든 것을 캡처 할 수 있다고해도 여전히 그렇게하고 싶지 않을 것입니다.
Šime Vidas 2011 년

0

이것은 해결할 수 있습니다

 document.getElementById("list-input-email").insertAdjacentHTML('beforeend', '<div class=""><input type="text" name="" value="" class="" /></div>');

3
스택 오버플로에 오신 것을 환영합니다. 긴 한 줄의 코드를 붙여 넣는 것이 아니라 컨텍스트를 제공하기 위해 답변의 일부로 코드를 설명하십시오. 당신이 그것을 이해하더라도 다른 사람들은 그 일을 이해하지 못할 수 있습니다.
loan.burger

0

InnerHTML은 기존 노드에 대한 이벤트와 같은 모든 데이터를 지 웁니다.

firstChild와 함께 자식 추가는 innerHTML에 첫 번째 자식 만 추가합니다. 예를 들어 다음을 추가해야하는 경우 :

 <p>text1</p><p>text2</p>

text1 만 표시됩니다.

이것에 대해 :

자식을 추가하여 innerHTML에 특수 태그를 추가 한 다음 생성 한 태그를 삭제하여 outerHTML을 편집합니다. 얼마나 똑똑한 지 모르겠지만 나를 위해 작동하거나 outerHTML을 innerHTML로 변경할 수 있으므로 함수 바꾸기를 사용할 필요가 없습니다.

function append(element, str)
{

  var child = document.createElement('someshittyuniquetag');
		
  child.innerHTML = str;

  element.appendChild(child);

  child.outerHTML = child.outerHTML.replace(/<\/?someshittyuniquetag>/, '');

// or Even child.outerHTML = child.innerHTML


  
}
<div id="testit">
This text is inside the div
<button onclick="append(document.getElementById('testit'), '<button>dadasasdas</button>')">To div</button>
<button onclick="append(this, 'some text')">to this</button>
</div>


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.