id로 요소 제거


1129

표준 JavaScript로 요소를 제거 할 때는 먼저 부모로 이동해야합니다.

var element = document.getElementById("element-id");
element.parentNode.removeChild(element);

부모 노드에 먼저 가야하는 것이 조금 이상해 보입니다 .JavaScript가 이런 식으로 작동하는 이유가 있습니까?


534
James가 말했듯이 DOM은 객체 제거를 직접 지원하지 않습니다. 부모에게 가서 그것을 제거해야합니다. 자바 스크립트는 요소가 자살을 허용하지는 않지만, 자살을 허용합니다 ...
Mark Henderson

21
이유가 있습니까? 리차드 페이 먼은 "아니오"라고 말합니다 . (나무 구조 프로그램을 작성했는지 기술적으로 정당화하기 쉽습니다. 자녀는 어쨌든 부모에게 알려야합니다. 그렇지 않으면 나무 구조가 파손될 수 있습니다. , 그것은 당신이 당신 자신을 정의 할 수있는 편리한 기능
일뿐

6
내가 볼 수있는 유일한 이유는 xml / xhtml 문서에 항상 루트 요소가 있어야하므로 부모가 없기 때문에 제거 할 수 없다는 것입니다.
Alex K

5
나는 Johan의 해결 방법을 매우 좋아 하며 왜 이러한 기능이 기본적으로 제공되지 않는지 잘 모르겠습니다. 시청자 수에 따라 알 수 있듯이 매우 일반적인 작업입니다.
Zaz

12
element.remove()ES5부터 직접 사용할 수 있습니다 . 당신은 부모가 필요하지 않습니다!
Gibolt

답변:


659

네이티브 DOM 기능을 보강하는 것이 항상 최상의 또는 가장 인기있는 솔루션은 아니지만 최신 브라우저에서는 잘 작동합니다.

Element.prototype.remove = function() {
    this.parentElement.removeChild(this);
}
NodeList.prototype.remove = HTMLCollection.prototype.remove = function() {
    for(var i = this.length - 1; i >= 0; i--) {
        if(this[i] && this[i].parentElement) {
            this[i].parentElement.removeChild(this[i]);
        }
    }
}

그런 다음 이와 같은 요소를 제거 할 수 있습니다

document.getElementById("my-element").remove();

또는

document.getElementsByClassName("my-elements").remove();

참고 : 이 솔루션은 IE 7 이하에서는 작동하지 않습니다. DOM 확장에 대한 자세한 내용은이 기사를 참조하십시오 .

편집 : 2019 년 내 답변을 검토 node.remove()하고 구조에 왔으며 다음과 같이 사용할 수 있습니다 (위의 polyfill없이).

document.getElementById("my-element").remove();

또는

[...document.getElementsByClassName("my-elements")].map(n => n && n.remove());

이러한 기능은 모든 최신 브라우저 (IE가 아닌)에서 사용할 수 있습니다. MDN 에 대해 자세히 알아보십시오 .


3
[document.getElementsByClassName ( "my-elements") [0] .remove ()가 아니어야합니다. ] remove () 함수는 배열로 구현되지 않았다고 생각합니다. 클래스의 모든 요소 또는 배열을 반환하는 선택기를 제거하려면 모든 요소를 ​​반복하고 각 요소에서 remove ()를 호출해야합니다.
Sedat Kilinc

1
@SedatKilinc, 실제 스 니펫을 사용해 보셨습니까? 오히려 더 포함 배열,하지만이 없습니다 NodeList또는 HTMLCollection배열과 같은 요소의 집합입니다. 두 번째 방법 정의에서는 이러한 "요소 세트"를 제거 할 수 있습니다.
Johan Dettmar

1
크롬 콘솔에서 이것을 실행하면을 사용할 때 한 번에 하나의 요소 만 삭제하는 것 같습니다 document.getElementsByClassName("my-elements").remove();. 편집 : 실제로 묶음을 삭제하지만 완료하려면 다시 실행해야합니다. 이 페이지에서 "comment-copy"클래스를 사용해보십시오.
DanielST

2
@slicedtoad 당신 말이 맞아, 내 나쁜. 요소를 거꾸로 반복하도록 함수를 수정했습니다. 잘 작동하는 것 같습니다. 당신이 말하는 행동은 업데이트 된 인덱스로 인해 발생했을 가능성이 큽니다.
Johan Dettmar

1
이러지 마 언어가 의도 한대로 항목을 제거하기 만하면됩니다. XML 구문 분석에 익숙한 사람은 자식을 삭제하기 위해 부모에게 가야 할 필요성을 인식 할 것입니다. HTML은 XML (정렬)의 상위 집합입니다.
Hal50000

283

크로스 브라우저 및 IE> = 11

document.getElementById("element-id").outerHTML = "";

3
가장 단순하고 신뢰할 수 있으며 가장 빠른 솔루션입니다. 나는 마지막 줄을 건너 뛸 수 있도록 요소를 삭제할 필요가 없습니다,하지만 오버 헤드 어느 쪽이든 .. 추가하지 않아야 참고 : 빠른 것보다 찾기 위해 노력하는 동안이 발견 $.ready대안 JS noscript태그입니다. 원하는 방식으로 사용하려면 1ms setTimeout함수 로 감싸 야했습니다 . 이것은 내 모든 문제를 한 번에 해결합니다. 그라시아 스.
dgo

outerHTML여전히 표준에 새로운 추가 사항을 명심하십시오 . 작성 시점에> 6 이상의 소프트웨어에 대한 지원을 찾고 있다면 다른 솔루션이 필요합니다. remove다른 언급 함수 유사한 경우이다. 평소처럼 polyfill을 구현하는 것이 안전합니다.
Super Cat

delete element당신은 JS에서 변수를 삭제할 수없는 것처럼 아무것도하지 않습니다; 키만;) 자신에 의해 확인 console.log(element)후 나중에 작동하지 않습니다 delete element...
Ivan Kleshnin

2
이것은 removeChild(시스템에서 약 6-7 %) 보다 약간 느립니다 . jsperf.com/clear-outerhtml-v-removechild/2
Alejandro García Iglesias

1
이것은 제거하려는 경우 iframe이 있던 공간을 남길 수 있습니다.
lacostenycoder

164

remove매번 그것에 대해 생각할 필요가 없도록 기능을 만들 수 있습니다.

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

12
전역 이동하지 않고 한 줄을 원하는 경우에, 당신은 변경할 수 있습니다 elemremove.elem. 그렇게하면 함수가 자신을 참조하므로 다른 전역 변수를 만들 필요가 없습니다. :-)
twiz

4
그렇다면 왜 엘렘을 반환해야합니까? 왜 안function remove(id) { document.getElementById(id).parentNote.removeChild(document.getElementById(id)); }
Zach Lysobey

4
@ ZachL : 솔루션이 더 분명해 보일 수 있지만 두 가지 DOM 조회를 수행하고 다른 솔루션은 피하고 싶은 것으로 보입니다.
Wk_of_Angmar

3
작동하지 않습니다. 오류가 너무 많습니다. 이것은 작동합니다 : var elem = document.getElementById ( 'id'); elem.parentNode.removeChild (elem);
Mitch Match

2
와우, 왜 그렇게 복잡해? id 문자열 대신 요소 자체를 함수에 전달하면됩니다. 이렇게하면 전체 기능에서 요소에 액세스 할 수 있고 하나의 라이너로 유지됩니다
David Fariña

97

DOM이 지원하는 것 입니다. 해당 페이지에서 "제거"또는 "삭제"를 검색하면 removeChild 만이 노드를 제거합니다.


13
그게 내 원래 질문에 대한 답변이지만 JavaScript가 왜 이렇게 작동합니까?
Zaz

5
나는 여기서 추측하고 있지만 메모리 관리와 관련이 있다고 가정합니다. 부모 노드는 자식 노드에 대한 포인터 목록을 보유하고있을 가능성이 높습니다. 부모를 사용하지 않고 노드를 방금 삭제 한 경우 부모는 계속 포인터를 잡고 메모리 누수를 일으 킵니다. 따라서 API는 부모에서 자식을 삭제하기 위해 함수를 호출하도록 강제합니다. 이것은 메모리를 누출시키지 않고 각각의 노드에서 remove를 호출하는 자식 노드를 통해 트리를 밟을 수 있기 때문에 좋습니다.
Chadams

2
이봐 요, 그 참조에는 이것이 없지만 실수로 찾았습니다. 글쓰기 element.remove();가 효과가 있습니다. 어쩌면 새로운 것일 수도 있습니다. 그러나 처음으로 저에게 효과적입니다. 나는 그것이 매우 기본적이어야하기 때문에 항상 작동해야한다고 생각합니다.
Muhammad Umer

1
그러나 IE7 이하에서는 작동하지 않습니다. IE7 이하에서는 remove ()가 작동하지 않습니다.
fanfan1609

1
내가 추측해야한다면, 이것이 작동하는 이유는 DOM 요소가 스스로를 제거 할 수 없기 때문입니다. 당신은 발 아래에서 속담 카펫을 제거하고 있습니다. 컨테이너에서 제거해야합니다. 적어도 그것이 내가 생각하려고하는 방법입니다.
PhilT

82

DOM은 노드 트리로 구성되며 각 노드에는 하위 노드에 대한 참조 목록과 함께 값이 있습니다. 따라서 element.parentNode.removeChild(element)내부에서 일어나는 일을 정확히 모방합니다. 먼저 부모 노드로 이동 한 다음 자식 노드에 대한 참조를 제거하십시오.

DOM4부터 같은 기능을 수행하는 도우미 함수가 제공됩니다 element.remove(). 이는 브라우저의 87 % (2016 년 기준)에서 작동하지만 IE 11에서는 작동하지 않습니다. 이전 브라우저를 지원해야하는 경우 다음을 수행 할 수 있습니다.


2
"기본 DOM 함수를 수정 하지 마십시오 " .
Emile Bergeron

36

하나의 요소를 제거하는 경우 :

 var elem = document.getElementById("yourid");
 elem.parentElement.removeChild(elem);

예를 들어 특정 클래스 이름을 가진 모든 요소를 ​​제거하려면 다음을 수행하십시오.

 var list = document.getElementsByClassName("yourclassname");
 for(var i = list.length - 1; 0 <= i; i--)
 if(list[i] && list[i].parentElement)
 list[i].parentElement.removeChild(list[i]);

기존 답변에 잘 설명되어 있습니다.
KyleMit

4
+1 클래스 이름으로 제거하는 간단한 예입니다. 이것은 다른 답변들에 의해 잘 다루지 않습니다
Louise Eggleton

if(list[i] && list[i].parentElement)선이 필요한가요? getElementsByClassName메소드에 의해 리턴되었다는 사실에 의해 각 요소의 존재가 보장되지 않습니까?
Hydrothermal

불행히도 그 존재는 내가 아는 한 실제로 보장되지는 않지만 그에 대한 세부 사항은 모릅니다. 방금 이상한 undefined 또는 null 값을 한 번 경험했으며 추가 조사없이 해당 검사를했습니다. 그래서 이것은 약간의 해킹입니다.
csjpeter

그것은해야document.getElementsByClassName(...
근무

21

당신은 그냥 사용할 수 있습니다 element.remove()


13
element.remove()유효한 자바 스크립트가 아니며 Chrome 과 같은 특정 브라우저에서만 작동합니다 .
Zaz

4
Josh, Firefox 및 Chrome 만 구현 한 것을 제외하고는 유효한 자바 스크립트입니다 (MDN 참조)
Tim Nguyen

10
나의 나쁜 점 element.remove() DOM4 가있는 유효한 JavaScript 이며 Internet Explorer를 제외하고는 모든 최신 브라우저에서 작동합니다.
Zaz

24
FireFox 및 Chrome에서 잘 작동합니다. IE에 관심이있는 사람
Arun Sharma

13
직업을 가진 사람들은 IE에 관심을 갖습니다!
sqram

18

ChildNode.remove()메소드는 오브젝트가 속한 트리에서 오브젝트를 제거합니다.

https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove

여기에 전화하는 방법을 보여주는 바이올린이 있습니다. document.getElementById('my-id').remove()

https://jsfiddle.net/52kp584L/

**

NodeList를 확장 할 필요가 없습니다. 이미 구현되었습니다.

**


2
IE의 모든 버전에서는 지원되지 않습니다!
MacroMan

1
여전히 IE를 개발하고 있다면 매우 유감입니다.
Alex Fallenstedt

IE 용으로 개발하지 않습니까? 당신의 고객이나 고객에게 매우 유감입니다.
MacroMan

13

remove()DOM의 메소드를 사용하여 해당 요소를 직접 제거 할 수 있습니다 .

다음은 예입니다.

let subsWrapper = document.getElementById("element_id");
subsWrapper.remove();
//OR directly.
document.getElementById("element_id").remove();


7

부모 노드에 먼저 가야하는 것이 조금 이상해 보입니다 .JavaScript가 이런 식으로 작동하는 이유가 있습니까?

함수 이름은입니다 removeChild(). 부모가 없을 때 자식을 어떻게 제거 할 수 있습니까? :)

반면에, 당신이 보여준대로 항상 전화를 걸 필요는 없습니다. element.parentNode주어진 노드의 부모 노드를 얻는 도우미입니다. 부모 노드를 이미 알고 있다면 다음과 같이 사용할 수 있습니다.

전의:

// Removing a specified element when knowing its parent node
var d = document.getElementById("top");
var d_nested = document.getElementById("nested");
var throwawayNode = d.removeChild(d_nested);

https://developer.mozilla.org/en-US/docs/Web/API/Node/removeChild

===================================================== =======

더 많은 것을 추가하려면 :

어떤 대답을 대신 사용하는 것을 지적 parentNode.removeChild(child);, 당신은 사용할 수 있습니다 elem.remove();. 그러나 내가 알았 듯이 두 기능에는 차이가 있으며 그 답변에는 언급되어 있지 않습니다.

를 사용 removeChild()하면 제거 된 노드에 대한 참조가 반환됩니다.

var removedChild = element.parentNode.removeChild(element); 
console.log(removedChild); //will print the removed child.

그러나를 사용 elem.remove();하면 참조를 반환하지 않습니다.

var el = document.getElementById('Example');
var removedChild = el.remove(); //undefined

https://developer.mozilla.org/en-US/docs/Web/API/ChildNode/remove

이 동작은 Chrome 및 FF에서 확인할 수 있습니다. 나는 그것이 주목할 가치가 있다고 믿는다 :)

내 대답이 질문에 가치를 더하고 도움이되기를 바랍니다.


6

ele.parentNode.removeChild (ele)를 사용하는 함수는 사용자가 작성했지만 아직 HTML에 삽입하지 않은 요소에는 작동하지 않습니다. jQuery 및 Prototype과 같은 라이브러리는 현명하게 다음과 같은 방법을 사용하여 이러한 제한을 피합니다.

_limbo = document.createElement('div');
function deleteElement(ele){
    _limbo.appendChild(ele);
    _limbo.removeChild(ele);
}

DOM의 독창적 인 디자이너가 부모 / 자식 및 이전 / 다음 탐색을 오늘날 인기있는 DHTML 수정보다 높은 우선 순위로 유지했기 때문에 JavaScript가 그렇게 작동한다고 생각합니다. 하나의 <input type = 'text'>에서 읽고 DOM의 상대 위치로 다른 것에 쓸 수 있다는 것은 90 년대 중반에 유용했습니다. 전체 HTML 양식이나 대화식 GUI 요소의 동적 생성이 거의 번거로 웠던시기였습니다. 일부 개발자의 눈.


3

부모 노드에 먼저 가야하는 것이 조금 이상해 보입니다 .JavaScript가 이런 식으로 작동하는 이유가 있습니까?

IMHO : 그 이유는 다른 환경에서 본 것과 같습니다. "링크"를 기반으로 작업을 수행하고 있습니다. 연결되어있는 동안에는 삭제할 수 없습니다.

나무 가지를 자르는 것처럼. 자르는 동안 나무에 가장 가까운쪽에 앉으십시오. 그렇지 않으면 결과는 ... 불행합니다 (재미 있지만).


2

이것은 실제로 FireFox에서 나온 것입니다 ... IE는 한 번 앞서 팩보다 앞서 있었고 요소를 직접 제거 할 수있었습니다.

이것은 내 가정에 불과하지만 부모를 통해 자녀를 제거 해야하는 이유는 FireFox가 참조를 처리하는 방식에 문제가 있다고 생각합니다.

hari-kari를 직접 커밋하기 위해 객체를 호출 한 경우, 사망 한 직후에도 해당 참조를 보유하고 있습니다. 이로 인해 여러 가지 불쾌한 버그가 생길 수 있습니다. 버그를 제거하지 못하거나 제거하지만 유효한 것으로 보이는 참조를 유지하거나 단순히 메모리 누수와 같은 버그가 발생할 수 있습니다.

그들이 문제를 깨달았을 때 해결 방법은 부모를 통해 요소를 제거하는 것이 었습니다. 요소가 사라지면 이제 부모에 대한 참조를 유지하기 때문입니다. 이것은 모든 불쾌 함을 막을 것이고 (예를 들어 노드별로 트리 노드를 닫는 경우) 다소 멋지게 압축 될 것입니다.

쉽게 고칠 수있는 버그 여야하지만 웹 프로그래밍의 다른 많은 것들과 마찬가지로 릴리스가 서두르고 이로 이어질 것입니다. 많은 코드를 깨는 것.

다시,이 모든 것은 단순히 내 추측 일뿐입니다.

그러나 나는 웹 프로그래밍이 마침내 완전한 봄 청소를 받고,이 모든 이상한 작은 특이성이 정리되고 모든 사람들이 동일한 규칙에 따라 연주하기 시작하는 날을 고대합니다.

아마도 내 로봇 하인이 저에게 임금을 청구 한 것 같습니다.


10
파이어 폭스가이 일을 담당하고있는 것은 의심 스럽다. DOM Level 1 인터페이스removeChild 의 메소드입니다 . Node
Felix Kling

0

내가 이해 한 바에 따르면 노드를 직접 제거하는 것은 Firefox에서만 작동하지 않으며 Internet Explorer에서만 작동합니다. 따라서 Firefox를 지원하려면 부모에게 가서 자식을 제거해야합니다.

참조 : http://chiragrdarji.wordpress.com/2007/03/16/removedelete-element-from-page-using-javascript-working-in-firefoxieopera/


6
그것은 실제로 내 질문에 대답하지 않으며, 연결된 페이지가 내 것보다 더 나쁜 해결책을 제공합니다.
Zaz

0
// http://javascript.crockford.com/memory/leak.html
// cleans dom element to prevent memory leaks
function domPurge(d) {
    var a = d.attributes, i, l, n;
    if (a) {
        for (i = a.length - 1; i >= 0; i -= 1) {
            n = a[i].name;
            if (typeof d[n] === 'function') {
                d[n] = null;
            }
        }
    }
    a = d.childNodes;
    if (a) {
        l = a.length;
        for (i = 0; i < l; i += 1) {
            domPurge(d.childNodes[i]);
       }
    }
}

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

-3

이것은 스크립트 오류없이 요소를 제거하는 가장 좋은 기능입니다.

function Remove(EId)
{
    return(EObj=document.getElementById(EId))?EObj.parentNode.removeChild(EObj):false;
}

참고하십시오 EObj=document.getElementById(EId).

이것은 하나의 등호가 아닙니다 ==.

element EId가 존재하면 함수가 제거하고 그렇지 않으면 false가 아닌 false를 반환합니다 error.


4
전역 변수를 만듭니다.
bjb568

1
또한 다른 답변 의 최악의 버전 이지만 2 년 늦었습니다.
Emile Bergeron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.