Ada insertBefore()
dalam JavaScript, tetapi bagaimana saya bisa memasukkan elemen setelah elemen lain tanpa menggunakan jQuery atau perpustakaan lain?
javascript
dom
insert
append
Xah Lee
sumber
sumber
Jawaban:
Di mana
referenceNode
simpul yang ingin Anda letakkannewNode
setelah. JikareferenceNode
anak terakhir dalam elemen induknya, tidak apa-apa, karenareferenceNode.nextSibling
akannull
daninsertBefore
menangani kasus itu dengan menambahkan ke akhir daftar.Begitu:
Anda dapat mengujinya menggunakan cuplikan berikut:
sumber
insertBefore()
bekerja dengan node teks. Mengapa Anda ingininsertAfter()
tampil beda? Anda harus membuat pasangan fungsi terpisah yang dinamaiinsertBeforeElement()
daninsertAfterElement()
untuk itu.JavaScript Mudah Akan Menjadi Berikut:
Tambahkan sebelum:
Tambahkan setelah:
Tapi, Aduk Beberapa Prototipe Di Sana Untuk Kemudahan Penggunaan
Dengan membangun prototipe berikut, Anda akan dapat memanggil fungsi ini langsung dari elemen yang baru dibuat.
newElement.appendBefore(element);
newElement.appendAfter(element);
.appendBefore (elemen) Prototype
.appendAfter (elemen) Prototipe
Dan, Untuk Melihat Semuanya Beraksi, Jalankan Cuplikan Kode Berikut
Tampilkan cuplikan kode
Jalankan di JSFiddle
sumber
existingElement.appendAfter(newElement);
. Lihat apa yang saya maksud di jsfiddle yang diperbarui ini .insertAdjacentHTML
+outerHTML
Kelemahan:
insertBefore
(impas jika nama variabel node yang ada adalah 3 karakter)Kerugian:
outerHTML
mengubah elemen menjadi string. Kami membutuhkannya karenainsertAdjacentHTML
menambahkan konten dari string daripada elemen.sumber
.insertAdjacentElement()
Pencarian Google cepat mengungkapkan skrip ini
sumber
targetElement.nextSibling
akan kembalinull
. Ketikanode.insertBefore
dipanggil dengannull
argumen kedua, maka akan menambahkan simpul di akhir koleksi. Dengan kata lain,if(parent.lastchild == targetElement) {
cabang itu berlebihan, karenaparent.insertBefore(newElement, targetElement.nextSibling);
akan menangani semua kasus dengan benar, meskipun mungkin terlihat sebaliknya pada awalnya. Banyak yang sudah menunjukkan hal itu dalam komentar lain.Padahal
insertBefore()
(lihat MDN ) hebat dan direferensikan oleh sebagian besar jawaban di sini. Untuk menambah fleksibilitas, dan agar lebih eksplisit, Anda dapat menggunakan:insertAdjacentElement()
(lihat MDN ) Ini memungkinkan Anda mereferensikan elemen apa pun, dan menyisipkan elemen yang akan dipindahkan tepat di tempat yang Anda inginkan:Orang lain untuk dipertimbangkan untuk kasus penggunaan serupa:
insertAdjacentHTML()
daninsertAdjacentText()
Referensi:
https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentElement https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML https: // developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentText
sumber
Metode
node.after
( doc ) menyisipkan simpul setelah simpul lain.Untuk dua simpul DOM
node1
dannode2
,node1.after(node2)
sisipannode2
setelahnode1
.Metode ini tidak tersedia di browser lama, jadi biasanya diperlukan polyfill.
sumber
Solusi 2018 (Praktek Buruk, lanjut ke 2020)
Saya tahu pertanyaan ini adalah Kuno, tetapi untuk setiap pengguna di masa depan, ini adalah prototipe yang dimodifikasi Ini hanya polyfill mikro untuk .insert. Setelah fungsi yang tidak ada, prototipe ini secara langsung menambahkan fungsi baru
baseElement.insertAfter(element);
ke prototipe Elemen:Setelah Anda meletakkan polyfill di perpustakaan, intisari, atau hanya di kode Anda (atau di mana pun tempat itu dapat direferensikan) Cukup tulis
document.getElementById('foo').insertAfter(document.createElement('bar'));
Solusi 2019 (Jelek, pergi ke 2020)
Suntingan Baru: Anda TIDAK HARUS MENGGUNAKAN PROTOTIPE. Mereka menimpa basis kode default dan tidak sangat efisien atau aman dan dapat menyebabkan kesalahan kompatibilitas, tetapi jika itu untuk proyek-proyek non-komersial, itu tidak masalah. jika Anda ingin fungsi yang aman untuk penggunaan komersial, cukup gunakan fungsi default. itu tidak cantik tetapi berfungsi:
Solusi 2020
Standar Web Saat Ini untuk ChildNode: https://developer.mozilla.org/en-US/docs/Web/API/ChildNode
Saat ini dalam Standar Hidup dan AMAN.
Untuk Peramban yang Tidak Didukung, gunakan Polyfill ini: https://github.com/seznam/JAK/blob/master/lib/polyfills/childNode.js
Seseorang menyebutkan bahwa Polyfill menggunakan Protos, ketika saya katakan itu praktik yang buruk. Mereka, terutama ketika mereka digunakan secara tidak benar, seperti solusi saya untuk 2018. Namun, polyfill itu ada di Dokumentasi MDN dan menggunakan semacam inisialisasi dan eksekusi yang lebih aman. Ditambah lagi IS untuk dukungan browser yang lebih lama, di zaman dan di mana Prototype Overwriting tidak terlalu buruk.
Cara menggunakan Solusi 2020:
sumber
Atau Anda bisa melakukannya:
sumber
sumber
Metode insertBefore () digunakan seperti
parentNode.insertBefore()
. Jadi untuk meniru ini dan membuat metodeparentNode.insertAfter()
kita dapat menulis kode berikut.JavaScript
HTML
Perhatikan, bahwa memperpanjang DOM mungkin bukan solusi yang tepat untuk Anda seperti yang dinyatakan dalam artikel ini .
Namun, artikel ini ditulis pada tahun 2010 dan segalanya mungkin berbeda sekarang. Jadi putuskan sendiri.
JavaScript DOM insertAfter () metode @ jsfiddle.net
sumber
Idealnya
insertAfter
harus bekerja mirip dengan insertBefore . Kode di bawah ini akan melakukan hal berikut:Node
ditambahkanNode
, yang baruNode
ditambahkanNode
setelah referensiNode
, yang baruNode
ditambahkanNode
memiliki saudara kandung, maka yang baruNode
dimasukkan sebelum saudara tersebutNode
Memperluas
Node
Salah satu contoh umum
Lihat kode yang berjalan
Tampilkan cuplikan kode
sumber
Saya tahu pertanyaan ini sudah memiliki terlalu banyak jawaban, tetapi tidak satu pun dari mereka memenuhi persyaratan yang tepat.
Saya menginginkan fungsi yang memiliki perilaku sebaliknya
parentNode.insertBefore
- yaitu, ia harus menerima nolreferenceNode
(yang tidak diterima jawaban yang diterima ) dan di manainsertBefore
memasukkan di akhir anak-anak yang ini harus disisipkan di awal , karena kalau tidak ada ' d tidak ada cara untuk menyisipkan di lokasi awal dengan fungsi ini sama sekali; alasan yang samainsertBefore
menyisipkan di akhir.Karena null
referenceNode
mengharuskan Anda untuk menemukan induknya, kami perlu mengetahui induknya -insertBefore
adalah metode dariparentNode
, jadi ia memiliki akses ke induknya seperti itu; fungsi kami tidak, jadi kami harus meneruskan induk sebagai parameter.Fungsi yang dihasilkan terlihat seperti ini:
Atau (jika Anda harus, saya tidak merekomendasikannya) Anda tentu saja dapat meningkatkan
Node
prototipe:sumber
Kode ini berfungsi untuk menyisipkan item tautan tepat setelah anak terakhir yang ada untuk menggarisbawahi file css kecil
sumber
Anda dapat menggunakan
appendChild
fungsi untuk menyisipkan setelah elemen.Referensi: http://www.w3schools.com/jsref/met_node_appendchild.asp
sumber
implementasi insertAfter yang kuat.
};
sumber
Mari kita tangani semua skenario
sumber
sumber
Anda sebenarnya bisa menggunakan metode yang disebut
after()
dalam versi Chrome, Firefox dan Opera yang lebih baru. Kelemahan dari metode ini adalah bahwa Internet Explorer belum mendukungnya.Contoh:
Kode HTML sederhana untuk mengujinya adalah:
Seperti yang diharapkan, itu memindahkan elemen ke atas setelah elemen ke bawah
sumber