1346

When removing an element with standard JavaScript, you must go to its parent first:

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

Having to go to the parent node first seems a bit odd to me, is there a reason JavaScript works like this?

9
  • 589
    As James said, the DOM does not support removing an object directly. You have to go to its parent and remove it from there. Javascript won't let an element commit suicide, but it does permit infanticide... Commented Aug 1, 2010 at 23:36
  • 22
    Is there a reason? Richard Feynman says no. (Well the technical justification is easy to see if you have written any tree-structure programs. The child must inform the parent anyway otherwise the tree structure may be broken. Since it must do it internally anyway, if it provided you a one line function, it's just a convenient function for you that you may as well define yourself.) Commented Jan 9, 2012 at 3:56
  • 6
    The only reason i see is that there should be always a root element in an xml/xhtml document, so you won't be able to remove it because it doesn't have a parent Commented Oct 16, 2012 at 8:38
  • 5
    I quite like Johan's workaround, and I'm not sure why those functions aren't provided natively. As evidenced by the number of viewers, it's a very common operation. Commented Aug 12, 2013 at 13:36
  • 25
    You can use element.remove() directly as of ES5. You don't need the parent! Commented Aug 13, 2017 at 5:14

19 Answers 19

776

I know that augmenting native DOM functions isn't always the best or most popular solution, but this works fine for modern browsers.

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]);
        }
    }
}

And then you can remove elements like this

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

or

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

Note: this solution doesn't work for IE 7 and below. For more info about extending the DOM read this article.

EDIT: Reviewing my answer in 2019, node.remove() has come to the rescue and can be used as follows (without the polyfill above):

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

or

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

These functions are available in all modern browsers (not IE). Read more on MDN.

Sign up to request clarification or add additional context in comments.

4 Comments

what about while(this.length){ this[0].parentElement.removeChild(this[0]); } ?
@AurelianoFarSuau, that should probably work as well (haven't tested it myself). However this loop will read the length value each time which might be slightly slower. Also to my knowledge you'd need if(this[i] && this[i].parentElement) to be sure that the current element still exists and has a parent element, otherwise you might get errors thrown for nested elements, etc.
Don't do this. Simply remove items the way the language intends. Anyone familiar with parsing XML will recognize the need to get to the parent to delete children. HTML is a superset of XML (sort of).
Especially useful when using a framework like DHTMLX suite, specifically when you have multiple forms in tabbars with the same name and id and you're trying to implement AJAX. Paste this at the top of each form to nullify previously loaded forms so that the current form is the only one that's loaded. Thanks a lot!
335

Crossbrowser and IE >= 11:

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

5 Comments

This seems the simplest, most reliable, and fastest solution. I don't need to delete the element so I skip the last line, but that shouldn't add any overhead either way.. Note: I found this while trying to find a faster than $.ready js alternative to noscript tags. In order to use it how I wanted, I had to wrap it in a 1ms setTimeout function. This solves all of my problems at once. Gracias.
Keep in mind outerHTML is still a new(er) addition to to the standard. If you're looking for support on any software >6 at the time of writing, you'll need another solution. The remove function mentioned by others is a similar case. As usual it's safe to implement a polyfill.
delete element does nothing as you can't delete variables in JS, only keys ;) Check for yourself it doesn't work by console.log(element) after delete element...
This is a bit slower than removeChild (about 6-7% on my system). See jsperf.com/clear-outerhtml-v-removechild/2
This might leave a space where an iframe used to be if that's what you're trying to remove.
199

You could make a remove function so that you wouldn't have to think about it every time:

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

7 Comments

If you want the one-liner without going global, you can change elem to remove.elem. That way the function references itself, so you don't have to create another global variable. :-)
so, why do you need to return the elem? Why not function remove(id) { document.getElementById(id).parentNote.removeChild(document.getElementById(id)); }
@ZachL: Whilst your solution might seem the more obvious, it performs two DOM lookups which is slower and something the other solutions seem to want to avoid.
Does not work. Too many errors. This works : var elem = document.getElementById('id') ; elem.parentNode.removeChild(elem);
Wow, why so complicated. Just pass the element itself to the function instead of a id string. This way the element is accessible in the whole function plus it stays a one liner
|
145

Update 2011

This was added to the DOM spec back in 2011, so you can just use:

element.remove()

The DOM is organized in a tree of nodes, where each node has a value, along with a list of references to its child nodes. So element.parentNode.removeChild(element) mimics exactly what is happening internally: First you go the parent node, then remove the reference to the child node.

As of DOM4, a helper function is provided to do the same thing: element.remove(). This works in 96% of browsers (as of 2020), but not IE 11.

If you need to support older browsers, you can:

1 Comment

Please don't "modify the native DOM functions".
99

It's what the DOM supports. Search that page for "remove" or "delete" and removeChild is the only one that removes a node.

5 Comments

That answers my original question, but why does JavaScript work like this?
I'm just guessing here, But I would assume it has to do with memory management. The parent node most likely holds a list of pointers to the child nodes. If you just deleted a node (without using parent), the parent would still hold the pointer and cause a memory leak. So the api forces you to call a function on the parent to delete the child. this also is nice because it can walk the tree down through the child nodes calling remove on each of them, and not leaking memory.
hey guys, even though that reference doesn't have this, i found it accidentally. writing element.remove(); will work. Maybe it's something new. But first time for me and it works. I think it should have worked always as it's very basic must have stuff.
But it does not work in IE7 and below. From IE7 and below, remove() does not work
If I had to guess, the reason it works like this is that DOM elements can't remove themselves. You're removing the proverbial carpet from under it's feet. You have to remove it from the container. At least that's how I try to think of it.
39

For removing one element:

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

For removing all the elements with for example a certain class name:

 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]);

5 Comments

This is well covered by the existing answers.
Why is the if(list[i] && list[i].parentElement) line necessary? Isn't the existence of each element guaranteed by the fact that it was returned by the getElementsByClassName method?
Unfortunately the existence is not really guaranteed as far as I know, but I do not know the details about it. I just experienced some strange undefined or null value once, and I put that check there without further investigation. So this is a bit of hack.
It should be document.getElementsByClassName(...
Really, it should be Elements instead of Element. Thank you.
29

you can just use element.remove()

4 Comments

Josh, it is valid javascript, except only Firefox and Chrome implemented it (See MDN)
My bad, element.remove() is valid JavaScript with DOM4, and works in all modern browsers, naturally with the exception of Internet Explorer.
According to MDN's ChildNode.remove() page, Edge supports it as well.
MDN also provides a polyfill for IE support developer.mozilla.org/en-US/docs/Web/API/ChildNode/…
21

You can directly remove that element by using remove() method of DOM.

here's an example:

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

Comments

20

The ChildNode.remove() method removes the object from the tree it belongs to.

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

Here is a fiddle that shows how you can call document.getElementById('my-id').remove()

https://jsfiddle.net/52kp584L/

**

There is no need to extend NodeList. It has been implemented already.

**

1 Comment

Note, this isn't supported in any version of IE!
12

According to DOM level 4 specs, which is the current version in development, there are some new handy mutation methods available: append(), prepend(), before(), after(), replace(), and remove().

https://catalin.red/removing-an-element-with-plain-javascript-remove-method/

Comments

9

You can simply use

document.getElementById("elementID").outerHTML="";

It works in all browsers, even on Internet Explorer.

Comments

8

Having to go to the parent node first seems a bit odd to me, is there a reason JavaScript works like this?

The function name is removeChild(), and how is it possible to remove the child when there's no parent? :)

On the other hand, you do not always have to call it as you have shown. element.parentNode is only a helper to get the parent node of the given node. If you already know the parent node, you can just use it like this:

Ex:

// 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

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

To add something more:

Some answers have pointed out that instead of using parentNode.removeChild(child);, you can use elem.remove();. But as I have noticed, there is a difference between the two functions, and it's not mentioned in those answers.

If you use removeChild(), it will return a reference to the removed node.

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

But if you use elem.remove();, it won't return you the reference.

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

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

This behavior can be observed in Chrome and FF. I believe It's worth noticing :)

Hope my answer adds some value to the question and will be helpful!!

Comments

8

Shortest

I improve Sai Sunder answer because OP uses ID which allows to avoid getElementById:

elementId.remove();

box2.remove();          // remove BOX 2

this["box-3"].remove(); // remove BOX 3 (for Id with 'minus' character)
<div id="box1">My BOX 1</div>
<div id="box2">My BOX 2</div>
<div id="box-3">My BOX 3</div>
<div id="box4">My BOX 4</div>

Comments

8

Functions that use ele.parentNode.removeChild(ele) won't work for elements you've created but not yet inserted into the HTML. Libraries like jQuery and Prototype wisely use a method like the following to evade that limitation.

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

I think JavaScript works like that because the DOM's original designers held parent/child and previous/next navigation as a higher priority than the DHTML modifications that are so popular today. Being able to read from one <input type='text'> and write to another by relative location in the DOM was useful in the mid-90s, a time when the dynamic generation of entire HTML forms or interactive GUI elements was barely a twinkle in some developer's eye.

Comments

3

Having to go to the parent node first seems a bit odd to me, is there a reason JavaScript works like this?

IMHO: The reason for this is the same as I've seen in other environments: You are performing an action based on your "link" to something. You can't delete it while you're linked to it.

Like cutting a tree limb. Sit on the side closest to the tree while cutting or the result will be ... unfortunate (although funny).

Comments

2

From what I understand, removing a node directly does not work in Firefox, only Internet Explorer. So, to support Firefox, you have to go up to the parent to remove it's child.

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

1 Comment

That doesn't really answer my question, and the page you linked to provides a worse solution than mine.
2

This one actually comes from Firefox... for once, IE was ahead of the pack and allowed the removal of an element directly.

This is just my assumption, but I believe the reason that you must remove a child through the parent is due to an issue with the way Firefox handled the reference.

If you call an object to commit hari-kari directly, then immediately after it dies, you are still holding that reference to it. This has the potential to create several nasty bugs... such as failing to remove it, removing it but keeping references to it that appear valid, or simply a memory leak.

I believe that when they realized the issue, the workaround was to remove an element through its parent because when the element is gone, you are now simply holding a reference to the parent. This would stop all that unpleasantness, and (if closing down a tree node by node, for example) would 'zip-up' rather nicely.

It should be an easily fixable bug, but as with many other things in web programming, the release was probably rushed, leading to this... and by the time the next version came around, enough people were using it that changing this would lead to breaking a bunch of code.

Again, all of this is simply my guesswork.

I do, however, look forward to the day when web programming finally gets a full spring cleaning, all these strange little idiosyncracies get cleaned up, and everyone starts playing by the same rules.

Probably the day after my robot servant sues me for back wages.

1 Comment

I doubt that Firefox is responsible for this. removeChild is a method of the DOM Level 1 Node interface.
1
// 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);
}

Comments

-2

This is the best function to remove an element without script error:

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

Note to EObj=document.getElementById(EId).

This is ONE equal sign not ==.

if element EId exists then the function removes it, otherwise it returns false, not error.

2 Comments

Creates a global variable.
It's also a worst version of another answer, but 2 years late.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.