Hapus elemen dengan id


1129

Saat menghapus elemen dengan JavaScript standar, Anda harus pergi ke induknya terlebih dahulu:

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

Harus pergi ke simpul orangtua tampaknya agak aneh bagi saya, apakah ada alasan JavaScript berfungsi seperti ini?


534
Seperti kata James, DOM tidak mendukung menghapus objek secara langsung. Anda harus pergi ke induknya dan menghapusnya dari sana. Javascript tidak akan membiarkan sebuah elemen bunuh diri, tetapi ia mengizinkan pembunuhan bayi ...
Mark Henderson

21
Apakah ada alasan? Richard Feynman mengatakan tidak . (Nah justifikasi teknis mudah untuk melihat apakah Anda telah menulis program struktur pohon. Anak harus menginformasikan orang tua pula sebaliknya struktur pohon mungkin rusak. Karena harus melakukannya secara internal pula, jika disediakan Anda fungsi satu baris , itu hanya fungsi yang mudah bagi Anda sehingga Anda dapat mendefinisikan diri Anda sendiri.)
kizzx2

6
Satu-satunya alasan yang saya lihat adalah harus selalu ada elemen root dalam dokumen xml / xhtml, jadi Anda tidak akan dapat menghapusnya karena tidak memiliki orang tua
Alex K

5
Saya sangat suka solusi Johan , dan saya tidak yakin mengapa fungsi-fungsi itu tidak disediakan secara asli. Seperti dibuktikan oleh jumlah pemirsa, ini adalah operasi yang sangat umum.
Zaz

12
Anda dapat menggunakan element.remove()langsung pada ES5. Anda tidak membutuhkan orang tua!
Gibolt

Jawaban:


659

Saya tahu bahwa menambah fungsi DOM asli tidak selalu merupakan solusi terbaik atau paling populer, tetapi ini berfungsi dengan baik untuk peramban modern.

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

Dan kemudian Anda dapat menghapus elemen seperti ini

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

atau

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

Catatan: solusi ini tidak berfungsi untuk IE 7 dan di bawahnya. Untuk info lebih lanjut tentang memperpanjang DOM, baca artikel ini .

EDIT : Meninjau jawaban saya pada tahun 2019, node.remove()telah datang untuk menyelamatkan dan dapat digunakan sebagai berikut (tanpa polyfill di atas):

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

atau

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

Fungsi-fungsi ini tersedia di semua browser modern (bukan IE). Baca lebih lanjut tentang MDN .


3
Bukankah seharusnya [document.getElementsByClassName ("my-elements") [0] .remove (); ] Saya pikir fungsi remove () tidak diimplementasikan oleh array. Untuk menghapus semua elemen kelas atau pemilih yang mengembalikan array, Anda harus mengulangi semua elemen dan memanggil remove () pada masing-masing.
Sedat Kilinc

1
@ SedatKilinc, apakah Anda mencoba cuplikan yang sebenarnya? Tidak ada array yang terlibat, melainkan NodeListatau HTMLCollectionyang array seperti set elemen. Definisi metode kedua memungkinkan "set elemen" ini untuk dihapus.
Johan Dettmar

1
Menjalankan ini di konsol chrome sepertinya hanya menghapus satu elemen pada saat menggunakan document.getElementsByClassName("my-elements").remove();. Sunting: sebenarnya itu menghapus banyak tetapi membutuhkan menjalankan kembali untuk menyelesaikan. Cobalah di halaman ini dengan kelas "comment-copy".
DanielST

2
@slicedtoad kau benar, salahku. Saya memodifikasi fungsi untuk mengulang elemen. Tampaknya bekerja dengan baik. Perilaku yang Anda bicarakan kemungkinan besar disebabkan oleh indeks yang diperbarui.
Johan Dettmar

1
Jangan lakukan ini. Cukup hapus item seperti yang diinginkan bahasa. Siapa pun yang terbiasa dengan parsing XML akan mengenali kebutuhan untuk mendapatkan orang tua untuk menghapus anak-anak. HTML adalah superset dari XML (semacam).
Hal50000

283

Crossbrowser dan IE> = 11:

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

3
Ini tampaknya solusi paling sederhana, paling dapat diandalkan, dan tercepat. Saya tidak perlu menghapus elemen, jadi saya melewati baris terakhir, tetapi itu seharusnya tidak menambahkan overhead baik cara .. Catatan : Saya menemukan ini ketika mencoba untuk menemukan lebih cepat daripada $.readyalternatif js untuk noscripttag. Untuk menggunakannya sesuai keinginan saya, saya harus membungkusnya dalam setTimeoutfungsi 1ms . Ini menyelesaikan semua masalah saya sekaligus. Gracias.
Lakukan

Perlu diingat outerHTMLmasih tambahan baru untuk standar. Jika Anda mencari dukungan pada perangkat lunak apa pun> 6 pada saat penulisan, Anda akan memerlukan solusi lain. The removeFungsi disebutkan oleh orang lain adalah kasus serupa. Seperti biasa, aman untuk menerapkan polyfill.
Super Cat

delete elementtidak melakukan apa-apa karena Anda tidak dapat menghapus variabel dalam JS, hanya kunci;) Periksa sendiri itu tidak bekerja console.log(element)setelah delete element...
Ivan Kleshnin

2
Ini sedikit lebih lambat daripada removeChild(sekitar 6-7% pada sistem saya). Lihat jsperf.com/clear-outerhtml-v-removechild/2
Alejandro García Iglesias

1
Ini mungkin meninggalkan ruang di mana iframe dulu jika itu yang ingin Anda hapus.
lacostenycoder

164

Anda dapat membuat suatu removefungsi sehingga Anda tidak perlu memikirkannya setiap saat:

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

12
Jika Anda menginginkan one-liner tanpa mengglobal, Anda dapat mengubahnya elemmenjadi remove.elem. Dengan begitu fungsi referensi itu sendiri, sehingga Anda tidak perlu membuat variabel global lain. :-)
twiz

4
jadi, mengapa kamu harus mengembalikan elem? Mengapa tidakfunction remove(id) { document.getElementById(id).parentNote.removeChild(document.getElementById(id)); }
Zach Lysobey

4
@ ZachL: Sementara solusi Anda mungkin tampak lebih jelas, ia melakukan dua pencarian DOM yang lebih lambat dan sesuatu yang tampaknya ingin dihindari oleh solusi lain.
Wk_of_Angmar

3
Tidak bekerja. Terlalu banyak kesalahan. Ini berfungsi: var elem = document.getElementById ('id'); elem.parentNode.removeChild (elem);
Pertandingan Mitch

2
Wow, kenapa rumit sekali. Cukup lewati elemen itu sendiri ke fungsi alih-alih string id. Dengan cara ini elemen dapat diakses di seluruh fungsi plus tetap satu liner
David Fariña

97

Itu yang DOM dukung . Cari halaman itu untuk "hapus" atau "hapus" dan removeChild adalah satu-satunya yang menghilangkan simpul.


13
Itu menjawab pertanyaan awal saya, tetapi mengapa JavaScript berfungsi seperti ini?
Zaz

5
Saya hanya menebak-nebak di sini, Tapi saya akan menganggap itu ada hubungannya dengan manajemen memori. Node induk kemungkinan besar menyimpan daftar pointer ke node anak. Jika Anda baru saja menghapus simpul (tanpa menggunakan orang tua), orang tua akan tetap memegang pointer dan menyebabkan kebocoran memori. Jadi api memaksa Anda untuk memanggil fungsi pada orang tua untuk menghapus anak. ini juga bagus karena dapat berjalan turun pohon melalui node anak memanggil hapus pada masing-masing, dan tidak bocor memori.
Chadams

2
hai teman-teman, meskipun referensi itu tidak memiliki ini, saya menemukannya secara tidak sengaja. menulis element.remove();akan berhasil. Mungkin itu sesuatu yang baru. Tetapi pertama kali bagi saya dan itu berhasil. Saya pikir itu harus selalu bekerja karena itu sangat mendasar harus punya barang.
Muhammad Umer

1
Tetapi tidak berfungsi di IE7 dan di bawah. Dari IE7 dan di bawah, hapus () tidak berfungsi
fanfan1609

1
Jika saya harus menebak, alasan kerjanya seperti ini adalah bahwa elemen DOM tidak dapat menghapus diri mereka sendiri. Anda menghapus karpet pepatah dari bawah kakinya. Anda harus menghapusnya dari wadah. Setidaknya itulah yang saya coba pikirkan.
PhilT

82

DOM diatur dalam pohon node, di mana setiap node memiliki nilai, bersama dengan daftar referensi ke node anaknya. Jadi, element.parentNode.removeChild(element)meniru persis apa yang terjadi secara internal: Pertama, Anda pergi ke simpul induk, kemudian hapus referensi ke simpul anak.

Pada DOM4, fungsi pembantu disediakan untuk melakukan hal yang sama: element.remove(). Ini berfungsi di 87% browser (per 2016), tetapi tidak untuk IE 11. Jika Anda perlu mendukung browser yang lebih lama, Anda dapat:


2
Tolong jangan "memodifikasi fungsi DOM asli" .
Emile Bergeron

36

Untuk menghapus satu elemen:

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

Untuk menghapus semua elemen dengan misalnya nama kelas tertentu:

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

Ini tercakup dengan baik oleh jawaban yang ada.
KyleMit

4
+1 Untuk contoh sederhana menghapus berdasarkan nama kelas. Ini tidak tercakup dengan baik oleh jawaban lain
Louise Eggleton

Mengapa if(list[i] && list[i].parentElement)garis itu perlu? Bukankah keberadaan setiap elemen dijamin oleh fakta bahwa ia dikembalikan oleh getElementsByClassNamemetode?
Hydrothermal

Sayangnya keberadaannya tidak benar-benar dijamin sejauh yang saya tahu, tapi saya tidak tahu detailnya. Saya baru saja mengalami beberapa nilai tidak terdefinisi atau nol yang aneh, dan saya meletakkan cek itu di sana tanpa penyelidikan lebih lanjut. Jadi ini sedikit hack.
csjpeter

Seharusnyadocument.getElementsByClassName(...
Pekerja

21

Anda bisa menggunakannya element.remove()


13
element.remove()bukan JavaScript yang valid dan hanya berfungsi di browser tertentu seperti Chrome .
Zaz

4
Josh, ini adalah javascript yang valid, kecuali hanya Firefox dan Chrome yang menerapkannya (Lihat MDN)
Tim Nguyen

10
Buruk saya, element.remove() adalah JavaScript yang valid dengan DOM4 , dan bekerja di semua browser modern, tentu saja dengan pengecualian Internet Explorer.
Zaz

24
Bekerja dengan baik di FireFox dan Chrome. siapa yang peduli dengan IE
Arun Sharma

13
orang dengan pekerjaan peduli tentang IE!
sqram

18

The ChildNode.remove()Metode menghapus objek dari pohon itu milik.

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

Ini biola yang menunjukkan bagaimana Anda bisa menelepon document.getElementById('my-id').remove()

https://jsfiddle.net/52kp584L/

**

Tidak perlu memperpanjang NodeList. Sudah diterapkan.

**


2
Catatan, ini tidak didukung di versi IE mana pun!
MacroMan

1
Jika Anda masih mengembangkan untuk IE saya merasa sangat menyesal untuk Anda.
Alex Fallenstedt

Anda tidak mengembangkan untuk IE? Saya merasa sangat menyesal untuk klien atau pelanggan Anda.
MacroMan

13

Anda dapat langsung menghapus elemen itu dengan menggunakan remove()metode DOM.

ini sebuah contoh:

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


7

Harus pergi ke simpul orangtua tampaknya agak aneh bagi saya, apakah ada alasan JavaScript berfungsi seperti ini?

Nama fungsinya adalah removeChild(), dan bagaimana mungkin menghapus anak ketika tidak ada orang tua? :)

Di sisi lain, Anda tidak harus selalu menyebutnya seperti yang Anda tunjukkan. element.parentNodehanya penolong untuk mendapatkan simpul induk dari simpul yang diberikan. Jika Anda sudah tahu simpul induk, Anda bisa menggunakannya seperti ini:

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

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

Untuk menambahkan sesuatu yang lebih:

Beberapa jawaban menunjukkan bahwa alih-alih menggunakan parentNode.removeChild(child);, Anda dapat menggunakan elem.remove();. Tapi seperti yang saya perhatikan, ada perbedaan antara dua fungsi, dan tidak disebutkan dalam jawaban itu.

Jika Anda menggunakan removeChild(), itu akan mengembalikan referensi ke node yang dihapus.

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

Tetapi jika Anda menggunakan elem.remove();, itu tidak akan mengembalikan Anda referensi.

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

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

Perilaku ini dapat diamati di Chrome dan FF. Saya percaya ini layak diperhatikan :)

Semoga jawaban saya menambah nilai pada pertanyaan dan akan sangat membantu !!


6

Fungsi yang menggunakan ele.parentNode.removeChild (ele) tidak akan berfungsi untuk elemen yang Anda buat tetapi belum dimasukkan ke dalam HTML. Perpustakaan seperti jQuery dan Prototype dengan bijak menggunakan metode seperti berikut untuk menghindari batasan itu.

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

Saya pikir JavaScript berfungsi seperti itu karena desainer asli DOM mengadakan navigasi induk / anak dan sebelumnya / berikutnya sebagai prioritas yang lebih tinggi daripada modifikasi DHTML yang sangat populer saat ini. Mampu membaca dari satu <input type = 'text'> dan menulis ke yang lain dengan lokasi relatif di DOM berguna pada pertengahan 90-an, masa ketika generasi dinamis dari seluruh bentuk HTML atau elemen GUI interaktif nyaris tidak ada dalam binar mata beberapa pengembang.


3

Harus pergi ke simpul orangtua tampaknya agak aneh bagi saya, apakah ada alasan JavaScript berfungsi seperti ini?

IMHO: Alasannya sama dengan yang saya lihat di lingkungan lain: Anda melakukan tindakan berdasarkan "tautan" Anda ke sesuatu. Anda tidak dapat menghapusnya saat Anda ditautkan ke dalamnya.

Seperti memotong dahan pohon. Duduklah di sisi terdekat dengan pohon sambil memotong atau hasilnya akan ... disayangkan (walaupun lucu).


2

Yang ini sebenarnya berasal dari FireFox ... untuk sekali, IE berada di depan paket dan memungkinkan penghapusan elemen secara langsung.

Ini hanya asumsi saya, tapi saya percaya alasan Anda harus menghapus anak melalui orang tua adalah karena masalah dengan cara FireFox menangani referensi.

Jika Anda memanggil objek untuk melakukan hari-kari secara langsung, maka segera setelah itu mati, Anda masih memegang referensi itu untuk itu. Ini memiliki potensi untuk membuat beberapa bug jahat ... seperti gagal menghapusnya, menghapusnya tetapi menyimpan referensi untuknya yang tampak valid, atau sekadar kebocoran memori.

Saya percaya bahwa ketika mereka menyadari masalah ini, pekerjaan di sekitar adalah menghapus elemen melalui induknya karena ketika elemen tersebut hilang, Anda sekarang hanya memegang referensi ke induknya. Ini akan menghentikan semua ketidaknyamanan itu, dan (jika menutup simpul pohon dengan simpul, misalnya) akan 'zip-up' dengan lebih baik.

Itu seharusnya bug yang mudah diperbaiki, tetapi seperti banyak hal lain dalam pemrograman web, rilisnya mungkin tergesa-gesa, mengarah ke ini ... dan pada saat versi berikutnya muncul, cukup banyak orang yang menggunakannya untuk mengubah ini akan menyebabkan untuk memecahkan banyak kode.

Sekali lagi, semua ini hanyalah dugaan saya.

Namun, saya menantikan hari ketika pemrograman web akhirnya mendapatkan pembersihan penuh musim semi, semua keanehan kecil aneh ini dibersihkan, dan semua orang mulai bermain dengan aturan yang sama.

Mungkin sehari setelah pelayan robot saya menuntut saya untuk upah kembali.


10
Saya ragu bahwa Firefox bertanggung jawab untuk ini. removeChildadalah metode antarmuka DOM Level 1Node .
Felix Kling


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

Ini adalah fungsi terbaik untuk menghapus elemen tanpa kesalahan skrip:

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

Catatan untuk EObj=document.getElementById(EId).

Ini adalah SATU tanda sama dengan tidak ==.

jika elemen EIdada maka fungsi menghapusnya, jika tidak mengembalikan false, bukan error.


4
Menciptakan variabel global.
bjb568

1
Ini juga versi terburuk dari jawaban lain , tetapi terlambat 2 tahun.
Emile Bergeron
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.