Javascript-innerHTML없이 컨테이너 요소에 HTML 추가


167

innerHTML을 사용하지 않고 컨테이너 요소에 HTML을 추가하는 방법이 필요합니다. innerHTML을 사용하고 싶지 않은 이유는 다음과 같이 사용하기 때문입니다.

element.innerHTML += htmldata

이전 HTML과 새 HTML을 추가하기 전에 모든 HTML을 먼저 대체하여 작동합니다. 내장 플래시 비디오와 같은 동적 미디어를 재설정하기 때문에 좋지 않습니다 ...

나는 이런 식으로 작동 할 수 있습니다.

var e = document.createElement('span');
e.innerHTML = htmldata;
element.appendChild(e);

그러나 그 방법의 문제는 문서에 불필요한 범위 태그가 있다는 것입니다.

그러면 어떻게 할 수 있습니까? 감사!


1
왜 Jquery를 사용하지 않습니까? 아래에서 자세한 답변을 확인하십시오. stackoverflow.com/a/50482776/5320562
Loukan ElKadi

답변:


102

대안을 제공하려면 (사용 DocumentFragment이 효과가없는 것처럼 보입니다) : 새로 생성 된 노드의 하위 항목을 반복하여 시뮬레이션하고 추가 할 수 있습니다.

var e = document.createElement('div');
e.innerHTML = htmldata;

while(e.firstChild) {
    element.appendChild(e.firstChild);
}

2
"innerHTML"을 사용하지 않는 솔루션을 찾고 있다고 생각했습니다.
kennydelacruz

1
@kennydelacruz : OP는 기존 요소를 파괴하고 재 작성하기 때문에 기존 HTML에 새로운 HTML 을 추가 하고 싶지 않았습니다 . OP는 새 요소를 만들어서 솔루션을 찾았지만 추가했지만 추가 요소를 추가하고 싶지 않았습니다. 방금 솔루션을 확장하여 새로 만든 요소를 ​​이동 / 추가 할 수 있으며 기존 요소에는 영향을 미치지 않습니다.
Felix Kling

나는 이것이 오래되었다는 것을 알고 있지만 왜 e.firstChild를 반복 할 수 있습니까?
Toastgeraet

1
@Toastgeraet :이 예제를 반복하지 않는 이상 e.firstChild . 오히려 e자식이 있는지 확인 하고, 그렇다면 해당 자식을 요소 로 옮깁니다 .
Felix Kling

570

나는 그 대답 중 어느 것도 그 insertAdjacentHTML()방법을 언급하지 않은 것에 놀랐다 . 여기서 확인 하십시오 . 첫 번째 매개 변수는 문자열을 추가하고받는 위치입니다 ( "beforebegin", "afterbegin", "beforeend", "afterend"). OP의 상황에서는 "이전"을 사용합니다. 두 번째 매개 변수는 html 문자열입니다.

기본 사용법 :

var d1 = document.getElementById('one');
d1.insertAdjacentHTML('beforeend', '<div id="two">two</div>');

53
허용 된 것뿐만 아니라 솔루션을 시도해보십시오. 둘 다 작동하지만 두 줄 만 있고 루프는 없습니다. 나에게 승자처럼 들린다.
Corwin01

3
이 경로를 선택할 수있는 사람을 참조하십시오 :이 방법은 IE9의 테이블에서는 훌륭하지 않습니다.
Corwin01

2
Chrome에서는 알려줍니다 Uncaught TypeError: undefined is not a function!
J86

19
이 숨겨진 보석은 더 많은 노출이 필요합니다.
Seth

이 방법을 노드가 아닌 다른 것에서 사용하려고하면 오류가 발생합니다.
Alex W

15

alnafie는이 질문에 대한 훌륭한 답변을 가지고 있습니다. 참조를 위해 그의 코드의 예를주고 싶었습니다.

var childNumber = 3;

function addChild() {
  var parent = document.getElementById('i-want-more-children');
  var newChild = '<p>Child ' + childNumber + '</p>';
  parent.insertAdjacentHTML('beforeend', newChild);
  childNumber++;
}
body {
  text-align: center;
}
button {
  background: rgba(7, 99, 53, .1);
  border: 3px solid rgba(7, 99, 53, 1);
  border-radius: 5px;
  color: rgba(7, 99, 53, 1);
  cursor: pointer;
  line-height: 40px;
  font-size: 30px;
  outline: none;
  padding: 0 20px;
  transition: all .3s;
}
button:hover {
  background: rgba(7, 99, 53, 1);
  color: rgba(255,255,255,1);
}
p {
  font-size: 20px;
  font-weight: bold;
}
<button type="button" onclick="addChild()">Append Child</button>
<div id="i-want-more-children">
  <p>Child 1</p>
  <p>Child 2</p>
</div>

잘하면 이것은 다른 사람들에게 도움이됩니다.


2
나는 규칙을 고집하는 것을 싫어하지만 데모 (jsfiddle, codepen 등)를 만든 다음 편집 기능을 사용하거나 의견을 제출하여 Alnafie의 답변에 추가하면 더 좋을 것이라고 생각합니다. 제공 한 정보의 유용성에 관계없이 다른 사용자의 답변을 보여주기위한 답변 만 만드는 것은 SO의 작동 방식이 아닙니다. 모든 사용자가 답변을 만들어 다른 답변을 보여 주겠다고 결심했다고 가정 해 봅시다.
Martin James

2
<div id="Result">
</div>

<script>
for(var i=0; i<=10; i++){
var data = "<b>vijay</b>";
 document.getElementById('Result').innerHTML += data;
}
</script>

"+ ="기호로 div의 데이터를 할당하십시오. 이전 HTML 데이터를 포함하여 데이터를 추가 할 수 있습니다


11
이 질문에는 특별히을 사용 하지 않아도 됩니다 element.innerHTML += data.
musicnothing

1

이것은 DocumentFragment의도 된 것입니다.

var frag = document.createDocumentFragment();
var span = document.createElement("span");
span.innerHTML = htmldata;
for (var i = 0, ii = span.childNodes.length; i < ii; i++) {
    frag.appendChild(span.childNodes[i]);
}
element.appendChild(frag);

document.createDocumentFragment, .childNodes


방금 이것을 테스트했는데 작동하지 않습니다. 그것이 어떻게 사용해야합니까?

어디 (a)에서 왔어요 ? 오타입니까?
Ash Burlaczenko 2016 년

1
예, 오타입니다. e 여야합니다. 조각에 innerHTML을 사용할 수 있다고 생각하지 않습니다. 작동하지 않습니다
Bob

@ 밥 나는 콥 아웃 사용 jQuery에 갔다.
Raynos 2018 년

jQuery 아니요! 하나의 작은 함수에 대해서만 jQuery를 포함하지 않을 것입니다 : \ 그것은 과잉입니다
Bob

-1

어떻게 낚시를하는 엄격한 코드를 사용하는 동안. 이 게시물의 맨 아래에는 두 가지 필수 기능이 필요합니다.

xml_add('before', id_('element_after'), '<span xmlns="http://www.w3.org/1999/xhtml">Some text.</span>');

xml_add('after', id_('element_before'), '<input type="text" xmlns="http://www.w3.org/1999/xhtml" />');

xml_add('inside', id_('element_parent'), '<input type="text" xmlns="http://www.w3.org/1999/xhtml" />');

여러 요소를 추가하십시오 (네임 스페이스는 상위 요소에만 있어야 함).

xml_add('inside', id_('element_parent'), '<div xmlns="http://www.w3.org/1999/xhtml"><input type="text" /><input type="button" /></div>');

동적 재사용 가능 코드 :

function id_(id) {return (document.getElementById(id)) ? document.getElementById(id) : false;}

function xml_add(pos, e, xml)
{
 e = (typeof e == 'string' && id_(e)) ? id_(e) : e;

 if (e.nodeName)
 {
  if (pos=='after') {e.parentNode.insertBefore(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e.nextSibling);}
  else if (pos=='before') {e.parentNode.insertBefore(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e);}
  else if (pos=='inside') {e.appendChild(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true));}
  else if (pos=='replace') {e.parentNode.replaceChild(document.importNode(new DOMParser().parseFromString(xml,'application/xml').childNodes[0],true),e);}
  //Add fragment and have it returned.
 }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.