IDで要素を削除


1129

標準のJavaScriptで要素を削除するときは、最初にその親に移動する必要があります。

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

最初に親ノードに移動する必要があるのは少し奇妙に思えますが、JavaScriptがこのように機能する理由はありますか?


534
Jamesが言ったように、DOMはオブジェクトの直接削除をサポートしていません。あなたはその親に行き、そこから削除する必要があります。Javascriptは要素が自殺することを許可しませんが、それは幼児殺しを許可します...
マークヘンダーソン

21
理由はありますか?リチャードファインマンはノーと言う。(もしあなたがツリー構造のプログラムを書いたかどうか、技術的な正当化は簡単にわかります。子はとにかく親に通知しなければなりません。そうでなければツリー構造が壊れる可能性があります。とにかく内部で行う必要があるため、1行の関数を提供した場合、自分で定義できる便利な機能です。)
kizzx2

6
私が見る唯一の理由は、xml / xhtmlドキュメントには常にルート要素が存在する必要があるため、親がないために削除できないことです
Alex K

5
私はJohanの回避策がかなり好きですが、これらの関数がネイティブに提供されない理由がわかりません。視聴者の数からわかるように、これは非常に一般的な操作です。
Zaz 2013

12
element.remove()ES5から直接使用できます。あなたは親を必要としません!
Gibolt 2017

回答:


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()し、救助に来て、次のように使用できます(上記のポリフィルなし):

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、2014

1
@SedatKilinc、実際のスニペットを試しましたか?むしろ全く関与する配列が、存在しないNodeListか、HTMLCollectionアレイ状要素の集合です。2番目のメソッド定義では、これらの「要素セット」を削除できます。
Johan Dettmar、2015年

1
これをChromeコンソールで実行すると、を使用しているときに一度に1つの要素しか削除されないようdocument.getElementsByClassName("my-elements").remove();です。編集:実際にはいくつかを削除しますが、完了するには再実行が必要です。このページの「comment-copy」クラスで試してください。
DanielST 2015

2
@slicedtoadあなたが正しい、私の悪い。要素を逆方向にループするように関数を変更しました。正常に動作するようです。あなたが話している動作は、更新されたインデックスが原因である可能性が高いです。
Johan Dettmar、2015

1
これを行わないでください。言語が意図する方法でアイテムを削除するだけです。XMLの解析に慣れている人なら誰でも、子を削除するために親にアクセスする必要があることを認識するでしょう。HTMLはXML(の一種)のスーパーセットです。
Hal50000 2016年

283

クロスブラウザとIE> = 11:

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

3
これは、最もシンプルで、最も信頼性が高く、最も速いソリューションのようです。要素を削除する必要はないので、最後の行をスキップしますが、どちらの方法でもオーバーヘッドが追加されることはありません。:これは、$.readyjsの代わりにnoscriptタグよりも速い方法を見つけようとしたときに見つかりました。思い通りに使うために、1msのsetTimeout関数でラップする必要がありました。これにより、すべての問題が一度に解決されます。グラシアス。
dgo 2014年

心に留めておくのはouterHTML、標準への新しい(まだ)追加です。執筆時点で6以上のソフトウェアのサポートを探している場合は、別のソリューションが必要になります。remove他の人が言及機能が類似した場合です。いつものように、ポリフィルを実装しても安全です。
スーパーキャット

delete elementJSで変数を削除できないため、何もせず、キーのみを削除します;)console.log(element)後までに機能しないことを確認してくださいdelete element...
Ivan Kleshnin '23

2
これは少し遅いremoveChild(私のシステムでは約6-7%)。jsperf.com/clear-outerhtml-v-removechild/2を
アレハンドロガルシアイグレシアス

1
これにより、削除しようとしているのがiframeだった場所が残る場合があります。
lacostenycoder

164

remove毎回考える必要がないように関数を作成できます。

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

12
あなたはグローバル行くことなくワンライナーをしたい場合は、変更することができますelemremove.elem。この方法では、関数がそれ自体を参照するため、別のグローバル変数を作成する必要はありません。:-)
twiz

4
では、なぜelemを返す必要があるのですか?なんでだろうfunction remove(id) { document.getElementById(id).parentNote.removeChild(document.getElementById(id)); }
ザックリソビー2013

4
@ZachL:あなたのソリューションはより明白に思われるかもしれませんが、遅い2つのDOMルックアップを実行し、他のソリューションは避けたいようです。
Wk_of_Angmar 2013

3
動作しません。エラーが多すぎます。これは機能します:var elem = document.getElementById( 'id'); elem.parentNode.removeChild(elem);
ミッチマッチ

2
うわー、なぜそんなに複雑なのか。id文字列ではなく、要素自体を関数に渡すだけです。このようにして、要素は関数全体でアクセス可能であり、1つのライナーにとどまります
DavidFariñaSep

97

それはDOMがサポートするものです。そのページで「remove」または「delete」を検索し、removeChildだけがノードを削除します。


13
これで元の質問に答えますが、JavaScriptがなぜこのように機能するのですか?
Zaz

5
私はここで推測しているだけですが、メモリ管理に関係していると思います。親ノードは、おそらく子ノードへのポインターのリストを保持しています。(親を使用せずに)ノードを削除しただけの場合、親は引き続きポインタを保持しているため、メモリリークが発生します。したがって、APIは親の関数を呼び出して子を削除するように強制します。これは、各ノードでremoveを呼び出すことで子ノードをツリーをたどることができ、メモリをリークしないので、これも素晴らしいことです。
Chadams 2013年

2
こんにちは、そのリファレンスにこれがないのに、偶然見つけました。書き込みelement.remove();は動作します。多分それは何か新しいものです。しかし、私にとって初めてで、それは機能します。それは非常に基本的なものを持っている必要があるので、私はそれが常に機能するはずだったと思います。
Muhammad Umer 2013

1
ただし、IE7以下では機能しません。IE7以下では、remove()は機能しません
fanfan1609

1
推測しなければならないのですが、このように機能するのは、DOM要素が自分自身を削除できないためです。あなたはそれの足の下からことわざのカーペットを取り除いています。コンテナから削除する必要があります。少なくとも、私はそう考えています。
PhilT 2015

82

DOMはノードのツリーに編成され、各ノードには値があり、その子ノードへの参照のリストも含まれます。したがって、element.parentNode.removeChild(element)内部で何が起こっているかを正確に模倣します。最初に親ノードに移動し、次に子ノードへの参照を削除します。

DOM4以降、同じことを行うためのヘルパー関数が提供されていますelement.remove()。これはブラウザの87%(2016年時点)では機能しますが、IE 11では機能しません。古いブラウザをサポートする必要がある場合は、次のことができます。


2
「ネイティブDOM関数を変更」しないでください。
エミールベルジェロン2018年

36

1つの要素を削除する場合:

 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 2014

4
+1クラス名で削除する簡単な例。これは他の回答では十分にカバーされていません
Louise Eggleton 2014

なぜif(list[i] && list[i].parentElement)ラインが必要なのですか?各要素の存在は、getElementsByClassNameメソッドによって返されたという事実によって保証されていませんか?
水熱

残念ながら、私が知る限り、その存在は保証されていませんが、詳細はわかりません。私は奇妙な未定義またはnull値を一度経験しただけで、さらに調査することなくそのチェックをそこに置きました。つまり、これはちょっとしたハックです。
csjpeter 2014年

それはする必要がありますdocument.getElementsByClassName(...
労働者の

21

あなたはただ使うことができます element.remove()


13
element.remove()は有効なJavaScriptではなく、Chromeなどの特定のブラウザでのみ機能します。
Zaz

4
Josh、JavaScriptは有効ですが、FirefoxとChromeのみが実装しています(MDNを参照)
Tim Nguyen

10
私の悪いが、element.remove() ある DOM4と有効なJavaScript、および自然のInternet Explorerの例外を除いて、すべての最新ブラウザで動作します。
Zaz 14

24
FireFoxとChromeで正常に動作しています。IEを気にする人
アルンシャルマ2014年

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、2018年

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();。しかし、私が気づいたように、2つの機能には違いがあり、それらの回答では言及されていません。

を使用する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はそのように機能すると思います。1つの<input type = 'text'>から読み取り、DOM内の相対位置で別の場所に書き込むことができることは、90年代半ばに役立ちました一部の開発者の目。


3

最初に親ノードに移動する必要があるのは少し奇妙に思えますが、JavaScriptがこのように機能する理由はありますか?

私見:この理由は、他の環境で見たのと同じです。何かへの「リンク」に基づいてアクションを実行しています。リンクしている間は削除できません。

木の枝を切るように。切断している間、木に最も近い側に座ってください。そうしないと、結果は...不運になります(面白いですが)。


2

これは実際にはFireFoxからのものです...一度限り、IEはパックの前にいて、要素を直接削除することができました。

これは私の仮定ですが、親から子を削除する必要があるのは、FireFoxが参照を処理する方法に問題があるためだと思います。

オブジェクトを呼び出してhari-kariを直接コミットする場合、オブジェクトが死んだ直後は、そのオブジェクトへの参照を保持しています。これは、いくつかの厄介なバグを作成する可能性があります...削除に失敗したり、削除したが有効であるように見える参照を保持したり、単にメモリリークが発生したりします。

彼らが問題を認識したときの回避策は、要素が親を介して削除されることだったと思います。なぜなら、要素がなくなったとき、あなたは単に親への参照を保持しているだけだからです。これにより、これらすべての不快感がなくなり、(たとえば、ノードをノードごとに閉じると)かなりうまく「ジップアップ」されます。

それは簡単に修正可能なバグでなければなりませんが、Webプログラミングの他の多くのものと同様に、リリースはおそらく急いでこれに至りました...そして次のバージョンが登場するまでに、十分な人々がこれを使用してこれを変更するとコードの束を壊すことへ。

繰り返しますが、これはすべて私の推測です。

しかし、私は、Webプログラミングが最終的に完全な春の大掃除を取得し、これらすべての奇妙な小さな特異性がすべてクリーンアップされ、誰もが同じルールで遊び始める日を楽しみにしています。

おそらく、ロボットの使用人が翌日賃金を訴える次の日です。


10
Firefoxがこれを担当しているとは思えません。removeChildは、DOMレベル1 Nodeインターフェースのメソッドです。
Felix Kling 2011

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)

これは1つの等号ではありません==

要素EIdが存在する場合、関数はそれを削除しますerror。それ以外の場合は、falseではなくを返します。


4
グローバル変数を作成します。
bjb568 2014年

1
これはまた別の回答の最悪のバージョンですが、2年遅れです。
Emile Bergeron、2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.