JavaScript에서 DOM 노드의 모든 하위 요소 제거


872

JavaScript에서 DOM 노드의 모든 하위 요소를 제거하는 방법은 무엇입니까?

다음과 같은 HTML이 있다고 가정 해보십시오.

<p id="foo">
    <span>hello</span>
    <div>world</div>
</p>

그리고 원하는 노드를 가져옵니다.

var myNode = document.getElementById("foo");

어떻게 자녀들 제거 할 수 있습니다 foo단지 그 정도 <p id="foo"></p>남아?

그냥 할 수 있을까 :

myNode.childNodes = new Array();

또는 몇 가지 조합을 사용해야 removeElement합니까?

나는 대답이 곧바로 DOM이되고 싶다. DOM 전용 답변과 함께 jQuery에 답변을 제공하면 추가 포인트가 있습니다.

답변:


1674

옵션 1 A : 지우기 innerHTML.

  • 이 방법은 간단하지만 브라우저의 HTML 파서를 호출하기 때문에 고성능 응용 프로그램에는 적합하지 않을 수 있습니다 (브라우저 값이 빈 문자열 인 경우 브라우저 최적화 될 수 있음 ).

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  myNode.innerHTML = '';
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via innerHTML</button>

옵션 1 B : 지우기 textContent

  • 위와 같이 사용하십시오 .textContent. MDN에 따르면innerHTML 브라우저가 HTML 파서를 호출하지 않고 대신 요소의 모든 하위 요소를 단일 #text노드로 즉시 대체 할 때보 다 더 빠릅니다 .

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  myNode.textContent = '';
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via textContent</button>

옵션 2 A : 모든 항목을 제거하기 위해 반복 lastChild:

  • 이 답변에 대한 이전 편집은 사용 firstChild되었지만 lastChild컴퓨터 과학과 같이 사용하도록 업데이트되었지만 일반적 으로 컬렉션 의 마지막 요소 를 제거하는 것보다 컬렉션 의 마지막 요소 를 제거하는 것이 훨씬 빠릅니다 (컬렉션 구현 방법에 따라 다름) ).
  • 루프는 (예를 들어 요소 목록이 UA에 의해 직접 연결 목록으로 구현 된 경우) 보다 확인이 더 빠를 firstChild 경우를 대비 하여 계속 확인합니다 .firstChildlastChild

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  while (myNode.firstChild) {
    myNode.removeChild(myNode.lastChild);
  }
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello</span>
</div>
<button id='doFoo'>Remove via lastChild-loop</button>

옵션 2 B : 모든 항목을 제거하기 위해 반복 lastElementChild:

  • 이 접근 방식 은 부모의 모든 비 Element(즉, #text노드 및 <!-- comments -->) 자식 (자손은 아님)을 유지합니다. 이는 응용 프로그램 (예 : 인라인 HTML 주석을 사용하여 템플릿 명령을 저장하는 템플릿 시스템)에서 바람직 할 수 있습니다.
  • Internet Explorer lastElementChild는 IE9 에서만 지원을 추가했기 때문에이 방법은 최근까지 사용되지 않았습니다 .

doFoo.onclick = () => {
  const myNode = document.getElementById("foo");
  while (myNode.lastElementChild) {
    myNode.removeChild(myNode.lastElementChild);
  }
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <!-- This comment won't be removed -->
  <span>Hello <!-- This comment WILL be removed --></span>
  <!-- But this one won't. -->
</div>
<button id='doFoo'>Remove via lastElementChild-loop</button>

보너스 : Element.clearChildren원숭이 패치 :

  • ElementJavaScript 의 프로토 타입에 새로운 메소드 속성을 추가하여 HTML 요소 객체 가 있는el.clearChildren() 곳 으로 간단하게 호출 할 수 있습니다 .el
  • 엄밀히 말하면 이것은 표준 DOM 기능이나 누락 된 기능이 아니기 때문에 폴리 필이 아닌 원숭이 패치입니다. 원숭이 패치는 많은 상황에서 올바르게 권장되지 않습니다.

if( typeof Element.prototype.clearChildren === 'undefined' ) {
    Object.defineProperty(Element.prototype, 'clearChildren', {
      configurable: true,
      enumerable: false,
      value: function() {
        while(this.firstChild) this.removeChild(this.lastChild);
      }
    });
}
<div id='foo' style="height: 100px; width: 100px; border: 1px solid black;">
  <span>Hello <!-- This comment WILL be removed --></span>
</div>
<button onclick="this.previousElementSibling.clearChildren()">Remove via monkey-patch</button>


6
jQuery에서 다음 두 가지 문제가 고려 될 수 있습니다.이 방법은 자식 (및 기타 자손) 요소뿐만 아니라 일치하는 요소 세트 내의 텍스트도 제거합니다. DOM 사양에 따르면 요소 내의 모든 텍스트 문자열은 해당 요소의 자식 노드로 간주되기 때문입니다. AND "메모리 누수를 피하기 위해 jQuery는 요소 자체를 제거하기 전에 하위 요소에서 데이터 및 이벤트 핸들러와 같은 다른 구성을 제거합니다."
jottos

104
BTW, lastChild를 사용하여 좀 더 효과적인 것 같다 jsperf.com/innerhtml-vs-removechild/15
안드레이 Lushnikov

24
innerHTML은 HTML 만 다루는 경우에만 작동합니다. 예를 들어 SVG가 내부에있는 경우 요소 제거 만 작동합니다.
stwissel

34
절대 innerHTML = ''를 사용하지 마십시오. 하지마 문제는 항목이 제거 된 것처럼 보이지만 내부적으로 노드가 지속되고 속도가 느려진다는 것입니다. 한 가지 이유로 모든 개별 노드를 제거해야합니다. Chrome 및 IE에서 테스트되었습니다. innerHTML "솔루션"이 잘못되었으므로 제거해보십시오.
Kenji

15
@vsync 나는 Kenji의 의견이 근거가 없다고 생각합니다. 이렇게는 innerHTML = ''느리지 만, 나는 그것의 "잘못"생각하지 않습니다. 메모리 누수에 대한 모든 주장은 증거로 백업해야합니다.
Chris Middleton

115

innerHTMLm93a가 올바르게 언급했듯이 현재 허용되는 답변은 (IE 및 Chrome에서는) 느리다 는 점에서 잘못 되었습니다.

이 방법을 사용하면 Chrome과 FF가 훨씬 빨라집니다 (첨부 된 jquery 데이터가 손상됨).

var cNode = node.cloneNode(false);
node.parentNode.replaceChild(cNode, node);

FF 및 Chrome의 경우 먼 초에 IE에서 가장 빠릅니다.

node.innerHTML = '';

InnerHTML 은 이벤트 핸들러를 파괴하거나 jquery 참조를 손상시키지 않습니다 . https://developer.mozilla.org/en-US/docs/Web/API/Element.innerHTML .

가장 빠른 DOM 조작 방법 (이전 두 방법보다 느림)은 범위 제거이지만 IE9까지는 범위가 지원되지 않습니다.

var range = document.createRange();
range.selectNodeContents(node);
range.deleteContents();

언급 된 다른 메소드는 비교 가능한 것처럼 보이지만 이상치 jquery (1.1.1 및 3.1.1)를 제외하고 innerHTML보다 훨씬 느립니다. 이는 다른 것보다 상당히 느립니다.

$(node).empty();

여기 증거 :

http://jsperf.com/innerhtml-vs-removechild/167 http://jsperf.com/innerhtml-vs-removechild/300 https://jsperf.com/remove-all-child-elements-of-a- dom-node-in-javascript (이전 URL 편집이 작동하지 않으므로 jsperf 재부팅을위한 새 URL)

Jsperf의 "테스트 별 루프"는 종종 "반복마다"로 이해되며 첫 번째 반복 만 제거 할 노드가 있으므로 결과가 의미가 없습니다. 게시시이 스레드의 테스트가 잘못 설정되었습니다.


2
jsperf가 완전히 손상되었습니다. 그다지 좋은 증거는 아닙니다.
bryc

4
이것이 현재 가장 좋은 대답입니다. 이 스레드의 다른 모든 것은 정보가 잘못되었습니다 (!) 나쁜 오래된 테스트를 모두 정리해 주셔서 감사합니다.
Ben

6
"InnerHTML은 이벤트 핸들러를 파괴하거나 jquery 참조를 엉망으로 만들지 않습니다." 데이터가 고아가되어 데이터 jQuery.cache를 관리 할 수있는 유일한 참조가 방금 파괴 한 요소에 있었기 때문에 메모리 누수가 발생합니다.

1
"InnerHTML은 이벤트 핸들러를 파괴하거나 jquery 참조를 엉망으로 만들지 않습니다"는 자식이 아닌 컨테이너를 말합니다. cloneNode컨테이너를 끄면 컨테이너에 대한 참조가 유지되지 않습니다 (jquery 또는 기타). jquery의 캐시는 jquery 데이터가 첨부되어 있으면 jquery를 사용하여 요소를 제거하는 것이 좋습니다. 바라건대 그들은 어느 시점에서 WeakMaps 로 전환하기를 바랍니다 . $ .cache의 정리 (또는 존재 여부)는 공식적으로 문서화되지 않은 것으로 보입니다.
npjohns 2016 년

10
jsperf 테스트는 여기서 중단되었습니다. 테스트 엔진은 다음과 같이보고합니다. "오류 : 반복 중에 Dom 노드가 다시 작성되지 않아 테스트 결과가 의미가 없습니다."
senderle

73

최신 자바 스크립트를 remove!

const parent = document.getElementById("foo");
while (parent.firstChild) {
    parent.firstChild.remove();
}

이것은 ES5에서 노드 제거를 쓰는 새로운 방법입니다. 바닐라 JS이며 이전 버전보다 훨씬 잘 읽습니다 .

대부분의 사용자는 최신 브라우저를 가지고 있거나 필요한 경우 변환 할 수 있습니다.

브라우저 지원 -2019 년 12 월 95 %


14
parent.children / parent.childNodes가 라이브 목록이므로 for 루프가 작동하지 않습니다. remove를 호출하면 목록이 수정되므로 반복자가 모든 것을 반복한다고 보장하지는 않습니다. 예를 들어 크롬에서는 다른 모든 노드를 건너 뜁니다. while (parent.firstChild) { parent.removeChild(parent.firstChild); }루프 를 사용하는 것이 좋습니다 . developer.mozilla.org/en-US/docs/Web/API/ParentNode/children developer.mozilla.org/en-US/docs/Web/API/Node/childNodes
qix 10

3
읽기 while (parent.firstChild && !parent.firstChild.remove());
쉽지는

1
성능이 그리 [...parent.childNodes].forEach(el => el.remove());

1
이것은 Typescript에서 작동하지 않습니다 ... 대신 사용하십시오while (selectElem.firstElementChild) { selectElem.firstElementChild.remove(); }
John Henckel

43
var myNode = document.getElementById("foo");
var fc = myNode.firstChild;

while( fc ) {
    myNode.removeChild( fc );
    fc = myNode.firstChild;
}

당신이 jQuery를이 자손에 영향이있을 가능성이 있다면, 당신은 해야한다 jQuery를 데이터를 정리하는 몇 가지 방법을 사용합니다.

$('#foo').empty();

jQuery .empty()메소드 는 제거중인 요소와 관련된 jQuery가 정리되도록합니다.

단순히 DOM자식을 제거하는 방법을 사용하면 해당 데이터가 유지됩니다.


innerHTML 메소드가 가장 성능이 우수합니다. 즉, jquery의 .empty ()로 정리되는 데이터 : 재귀 루프를 사용하여 자식 태그와 관련된 jquery 내부의 data ()를 제거합니다 (느리지 만 메모리 사용량을 크게 줄일 수 있음). .onclick = ...과 같은 jquery 자식에 이러한 이벤트를 제거하지 않으면 innerHTML을 설정해도 누출되지 않습니다. 가장 좋은 대답은-달려 있습니다.
Chris Moschini

1
왜 while 루프의 조건에 firstChild 표현식을 직접 넣지 않겠습니까? while ( myNode.firstChild ) {
Victor Zamanian

while(fc = myNode.firstChild){ myNode.removeChild(fc); }
Valen

36

jQuery를 사용하는 경우 :

$('#foo').empty();

그렇지 않은 경우 :

var foo = document.getElementById('foo');
while (foo.firstChild) foo.removeChild(foo.firstChild);

20

가장 빠른...

var removeChilds = function (node) {
    var last;
    while (last = node.lastChild) node.removeChild(last);
};

jsperf.com에 대한 링크 를 제공 한 Andrey Lushnikov에게 감사합니다. (쿨 사이트!) .

편집 : 명확하게 말하면 Chrome에서 firstChild와 lastChild 사이의 성능 차이는 없습니다. 가장 좋은 대답은 성능에 대한 좋은 솔루션을 보여줍니다.


LINT 경고가없는 동일한 내용 : clear : function (container) {for (;;) {var child = container.lastChild; if (! child) break; container.removeChild (자식); }}
cskwg

9

자식이없는 노드 만 갖고 싶다면 다음과 같이 복사본을 만들 수도 있습니다.

var dupNode = document.getElementById("foo").cloneNode(false);

달성하려는 대상에 따라 다릅니다.


3
어쩌면 당신은 이것을 따라 할 수 parent.replaceChild(cloned, original)있습니까? 그것은 자식을 하나씩 제거하는 것보다 빠를 수 있으며 DOM을 지원하는 모든 것 (SVG를 포함한 모든 유형의 XML 문서)에서 작동해야합니다. innerHTML을 설정하는 것이 자식을 하나씩 제거하는 것보다 빠를 수도 있지만 HTML 문서 이외의 다른 곳에서는 작동하지 않습니다. 그 시간을 테스트해야합니다.
Maarten

13
를 사용하여 추가 한 이벤트 리스너는 복사하지 않습니다 addEventListener.
Matthew

당신이 그 제한으로 살 수있는 경우, 빠른 확실히이다 : jsperf.com/innerhtml-vs-removechild/137
DanMan

7

다른 접근 방식이 있습니다.

function removeAllChildren(theParent){

    // Create the Range object
    var rangeObj = new Range();

    // Select all of theParent's children
    rangeObj.selectNodeContents(theParent);

    // Delete everything that is selected
    rangeObj.deleteContents();
}

1
이것은 흥미롭지 만 다른 방법에 비해 상당히 느리게 보입니다 : jsperf.com/innerhtml-vs-removechild/256
Polaris878

6
element.textContent = '';

표준을 제외하고 innerText와 같습니다. 그건 약간 느린 것보다 removeChild(),하지만 사용하기 쉽게하고 삭제 너무 많은 물건이없는 경우에 많은 성능 차이를하지 않습니다.


텍스트 노드는 요소가 아닙니다
check_ca

죄송합니다 당신이 바로, 그것은 참으로 모든 어린이 요소를 제거하고
check_ca

이전 버전의 Internet Explorer에서는 작동하지 않습니다.
pwdst

4

DanMan, Maarten 및 Matt에 대한 답변. 텍스트를 설정하기 위해 노드를 복제하는 것은 실제로 내 결과에 실용적인 방법입니다.

// @param {node} node
// @return {node} empty node
function removeAllChildrenFromNode (node) {
  var shell;
  // do not copy the contents
  shell = node.cloneNode(false);

  if (node.parentNode) {
    node.parentNode.replaceChild(shell, node);
  }

  return shell;
}

// use as such
var myNode = document.getElementById('foo');
myNode = removeAllChildrenFromNode( myNode );

또한 이것은 부모 노드에 액세스하려고 할 때 null을 반환하는 DOM에없는 노드에서 작동합니다. 또한 안전해야 할 경우 컨텐츠를 추가하기 전에 노드가 비어 있으면 실제로 도움이됩니다. 아래의 사용 사례를 고려하십시오.

// @param {node} node
// @param {string|html} content
// @return {node} node with content only
function refreshContent (node, content) {
  var shell;
  // do not copy the contents
  shell = node.cloneNode(false);

  // use innerHTML or you preffered method
  // depending on what you need
  shell.innerHTML( content );

  if (node.parentNode) {
    node.parentNode.replaceChild(shell, node);
  }

  return shell;
}

// use as such
var myNode = document.getElementById('foo');
myNode = refreshContent( myNode );

요소 내부의 문자열을 바꿀 때이 방법이 매우 유용하다는 것을 알았습니다. 노드를 정리하는 방법을 걱정하지 않고 노드에 무엇을 포함할지 확실하지 않은 경우 새로 시작하십시오.


3
최악의 일. 원래 노드를 복제본으로 바꾸면 원래 노드에 대한 참조가 손실됩니다. 이벤트 처리기 및 기타 바인딩이 작동하지 않습니다.
Arun Aravind

4

여기 내가 일반적으로하는 일이 있습니다.

HTMLElement.prototype.empty = function() {
    while (this.firstChild) {
        this.removeChild(this.firstChild);
    }
}

그리고 voila, 나중에 다음을 사용하여 dom 요소를 비울 수 있습니다.

anyDom.empty()

나는이 해결책을 좋아한다! innerHTML을 빈 문자열로 설정하는 것보다 이것을 사용해야하는 이유는 무엇입니까?
코디네이터

성능 : domEl.innerHTML = ""열악하고 나쁜 습관으로 간주
Ado Ren

3

이를 달성하기위한 몇 가지 옵션이 있습니다.

가장 빠른 ():

while (node.lastChild) {
  node.removeChild(node.lastChild);
}

대안 (느리게) :

while (node.firstChild) {
  node.removeChild(node.firstChild);
}

while (node.hasChildNodes()) {
  node.removeChild(node.lastChild);
}

제안 된 옵션이있는 벤치 마크


3
var empty_element = function (element) {

    var node = element;

    while (element.hasChildNodes()) {              // selected elem has children

        if (node.hasChildNodes()) {                // current node has children
            node = node.lastChild;                 // set current node to child
        }
        else {                                     // last child found
            console.log(node.nodeName);
            node = node.parentNode;                // set node to parent
            node.removeChild(node.lastChild);      // remove last node
        }
    }
}

요소 내의 모든 노드가 제거됩니다.


... 불필요한 복잡하고 그것이 실제로 어떻게 작동하는지에 대한 설명이 없기 때문에 (실제로 명백하지는 않습니다), 나는 의심합니다.
Periata Breatta

2

innerText가 승자입니다! http://jsperf.com/innerhtml-vs-removechild/133 . 이전의 모든 테스트에서 부모 노드의 내부 돔은 처음 반복에서 삭제 된 다음 empty div에 적용된 innerHTML 또는 removeChild를 삭제했습니다.


5
innerText그래도 독점적 인 MS 일입니다. 그냥 말하면
DanMan

1
이것은 결함이있는 테스트라는 것을 확신하십시오-var box로 사용할 수는 없지만 id를 기반으로 DOM 조회를 통해 사용할 수 있으며 while루프는이 느린 호출을 여러 번 처벌합니다.
nrabinowitz

2

Javascript를 통해 노드의 하위 노드를 제거하는 가장 간단한 방법

var myNode = document.getElementById("foo");
while(myNode.hasChildNodes())
{
   myNode.removeChild(myNode.lastChild);
}

2

나는 사람들이하는 것을 보았다 :

while (el.firstNode) {
    el.removeChild(el.firstNode);
}

누군가가 사용 el.lastNode이 더 빠르다고 말했다

그러나 이것이 가장 빠르다고 생각합니다.

var children = el.childNodes;
for (var i=children.length - 1; i>-1; i--) {
    el.removeNode(children[i]);
}

어떻게 생각해?

추신 :이 주제는 저에게 생명의 은인이었습니다. 내 파이어 폭스 애드온은 cuz를 거부했습니다. innerHTML을 사용했습니다. 오랜 습관이었습니다. 그때 나는 이것을 foudn. 그리고 실제로 속도 차이를 발견했습니다. 로드시 innerhtml은 업데이트하는 데 시간이 걸렸지 만 addElement를 사용하면 즉시 업데이트됩니다!


1
글쎄, 나는 가장 빠른지 아닌지 생각한다. 일부 jsperf 테스트 는 두 경우 모두를 증명할 수있다
Nikos M.

이러한 테스트에 감사드립니다. 그들은 for (var i=0...하나를 포함하지 않습니다. 그러나 여기 내가 그 테스트를 수행했을 때 얻은 것이 있습니다. i.imgur.com/Mn61AmI.png 이 세 가지 테스트에서 firstNode는 lastNode 및 innerHTML보다 빠릅니다.
Noitidart

나는 테스트를 추가했다 : el.firstNode 방법을 수행하는 jsperf.com/innerhtml-vs-removechild/220 흥미로운 것들이 가장 빠른 방법입니다
Noitidart

2

범위 루프를 사용하면 가장 자연스럽게 느껴집니다.

for (var child of node.childNodes) {
    child.remove();
}

Chrome과 Firefox에서 측정 한 결과 약 1.3 배 느립니다. 정상적인 상황에서는 이것이 중요하지 않을 것입니다.


2
 let el = document.querySelector('#el');
 if (el.hasChildNodes()) {
      el.childNodes.forEach(child => el.removeChild(child));
 }

1
귀하의 코드가 무엇을하고 있는지에 대한 답변을 제공해주십시오.
Nirav Joshi

1
자체 설명
blacksheep

1

일반적으로 JavaScript는 배열을 사용하여 DOM 노드 목록을 참조합니다. 따라서 HTMLElements 배열을 통해 관심이 있다면 잘 작동합니다. 또한 JavaScript proto 대신 배열 참조를 사용하기 때문에 IE를 포함한 모든 브라우저에서 작동해야합니다.

while(nodeArray.length !== 0) {
  nodeArray[0].parentNode.removeChild(nodeArray[0]);
}

1

왜 우리가 가장 간단한 방법을 따르지 않습니까?

const foo = document.querySelector(".foo");
while (foo.firstChild) {
  foo.firstChild.remove();     
}
  • 상위 div 선택
  • 첫 번째 자식 요소가 없어 질 때까지 While 루프 내에서 "remove"메서드 사용

다른 사용자가 기능을 이해할 수 있도록 코드 줄을 설명하십시오. 감사!
Ignacio Ara 10

@IgnacioAra 완료!
Neelansh Verma

1

누군가 다른 사람 이이 질문을 언급하고 아직 보지 못한 방법을 추가 할 것이라고 생각했습니다.

function clear(el) {
    el.parentNode.replaceChild(el.cloneNode(false), el);
}

var myNode = document.getElementById("foo");
clear(myNode);

명확한 기능은 요소를 가져오고 부모 노드를 사용하여 자식이없는 복사본으로 대체합니다. 요소가 희소 한 경우 성능이 크게 향상되지 않지만 요소에 노드가 많은 경우 성능이 향상됩니다.


1
사실 여기에 언급 된 것 같다 stackoverflow.com/a/15441725/576767
펠릭스 Gagnon의-Grenier의

Felix +1 수정에 감사드립니다.
Harry Chilinguerian

1

기능적 접근 방식 :

const domChildren = (el) => Array.from(el.childNodes)
const domRemove = (el) => el.parentNode.removeChild(el)
const domEmpty = (el) => domChildren(el).map(domRemove)

domChildren의 "childNodes"는 직계 자식 요소의 nodeList를 제공하며, 아무것도 찾을 수 없으면 비어 있습니다. nodeList에 맵핑하기 위해 domChildren은이를 노드로 변환합니다. domEmpty는 domRemove 함수를 제거하는 모든 요소에 domRemove 함수를 맵핑합니다.

사용법 예 :

domEmpty(document.body)

body 요소에서 모든 자식을 제거합니다.


0

jQuery의 다른 방법

var foo = $("#foo");
foo.children().remove();
//or
$("*", foo ).remove();
//or
foo.html("");
//or
foo.empty();

OP가 스트레이트 DOM으로 대답하는 것이 바람직하기 때문에 다운 투표.
16 :

또한, jQuery를이있다 .empty()방법을, 단지 $("#foo").empty()충분하다
YakovL

-1

단순히 IE 만 :

parentElement.removeNode(true);

true -심하게 제거하는 것-모든 어린이도 제거됨을 의미


1
IE? 이것은 21 세기입니다!
everlasto

-1

가장 쉬운 방법 :

let container = document.getElementById("containerId");
container.innerHTML = "";

이것이 작동하는 동안 container.innerHTML = nullInternet Explorer에 텍스트가 표시되도록 주의하십시오 null. 따라서 이것은 실제로 어린이를 제거하지는 않습니다.
Arjan

-1

for 루프를 사용하여 간단하고 빠르게 !!

var myNode = document.getElementById("foo");

    for(var i = myNode.childNodes.length - 1; i >= 0; --i) {
      myNode.removeChild(myNode.childNodes[i]);
    }

이것은 <span>태그 에서 작동하지 않습니다 !


무엇보다도 모든 코드에서 <span>태그를 제거하지 않습니다
Mohit Karkar

-3

당신은에 뭔가 다시 넣고 싶은 경우 divinnerHTML 아마 더 좋다.

내 예 :

<ul><div id="result"></div></ul>

<script>
  function displayHTML(result){
    var movieLink = document.createElement("li");
    var t = document.createTextNode(result.Title);
    movieLink.appendChild(t);
    outputDiv.appendChild(movieLink);
  }
</script>

.firstChildor .lastChild메소드를 사용하면 displayHTML()나중에 함수가 작동하지 않지만 .innerHTML메소드에 문제가 없습니다 .


-4

이것은 순수한 자바 스크립트입니다 .jQuery를 사용하지 않지만 모든 브라우저에서도 작동하며 IE는 매우 간단합니다.

   <div id="my_div">
    <p>Paragraph one</p>
    <p>Paragraph two</p>
    <p>Paragraph three</p>
   </div>
   <button id ="my_button>Remove nodes ?</button>

   document.getElementById("my_button").addEventListener("click",function(){

  let parent_node =document.getElemetById("my_div"); //Div which contains paagraphs

  //Let find numbers of child inside the div then remove all
  for(var i =0; i < parent_node.childNodes.length; i++) {
     //To avoid a problem which may happen if there is no childNodes[i] 
     try{
       if(parent_node.childNodes[i]){
         parent_node.removeChild(parent_node.childNodes[i]);
       }
     }catch(e){
     }
  }

})

or you may simpli do this which is a quick way to do

document.getElementById("my_button").addEventListener("click",function(){

 let parent_node =document.getElemetById("my_div");
 parent_node.innerHTML ="";

})

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