Elemen pemindahan JavaScript di DOM

97

Katakanlah saya memiliki tiga <div>elemen pada satu halaman. Bagaimana saya bisa menukar posisi pertama dan ketiga <div>? jQuery baik-baik saja.

inti
sumber

Jawaban:

110

Sepele dengan jQuery

$('#div1').insertAfter('#div3');
$('#div3').insertBefore('#div2');

Jika Anda ingin melakukannya berulang kali, Anda harus menggunakan selektor yang berbeda karena div akan mempertahankan id mereka saat dipindahkan.

$(function() {
    setInterval( function() {
        $('div:first').insertAfter($('div').eq(2));
        $('div').eq(1).insertBefore('div:first');
    }, 3000 );
});
tvanfosson.dll
sumber
1
@Ionut - intinya itu tergantung pada posisi relatif elemen. Setelah Anda mengubah urutan, Anda tidak dapat lagi menemukan yang pertama dan ketiga dengan id mereka dan perlu mencari cara lain. Jawaban saya hanya dimaksudkan untuk mengilustrasikan fungsionalitas metode untuk menyelesaikan tugas yang diminta, bukan solusi komprehensif untuk menukar div pertama dan ketiga dalam satu set beberapa kali.
tvanfosson
Hai teman-teman, pertanyaan singkat: Adakah cara mudah untuk mereset kembali ke status Dom asli setelah fungsi jquery di atas selesai?
Vikita
@Vikita - ya, simpan HTML aslinya lalu pulihkan. Anda mungkin harus menerapkan kembali penangan apa pun jika telah diterapkan secara langsung, bukan didelegasikan ke elemen yang lebih tinggi. Misalnya,var html = $('#container').html(); ...; $('#container').html(html);
tvanfosson
171

Tidak perlu menggunakan perpustakaan untuk tugas sepele seperti itu:

var divs = document.getElementsByTagName("div");   // order: first, second, third
divs[2].parentNode.insertBefore(divs[2], divs[0]); // order: third, first, second
divs[2].parentNode.insertBefore(divs[2], divs[1]); // order: third, second, first

Ini memperhitungkan fakta yang getElementsByTagNamemengembalikan NodeList langsung yang diperbarui secara otomatis untuk mencerminkan urutan elemen di DOM saat mereka dimanipulasi.

Anda juga bisa menggunakan:

var divs = document.getElementsByTagName("div");   // order: first, second, third
divs[0].parentNode.appendChild(divs[0]);           // order: second, third, first
divs[1].parentNode.insertBefore(divs[0], divs[1]); // order: third, second, first

dan ada berbagai kemungkinan permutasi lainnya, jika Anda ingin bereksperimen:

divs[0].parentNode.appendChild(divs[0].parentNode.replaceChild(divs[2], divs[0]));

sebagai contoh :-)

NickFitz
sumber
15
Benar, tetapi sulit untuk membantah keanggunan dan keterbacaan yang disediakan sesuatu seperti jQuery - belum lagi kemampuan yang ditingkatkan di luar kotak.
Crazy Joe Malloy
13
Ya, tapi siapa yang hanya melakukan satu hal ini?
tvanfosson
1
... atau hanya memiliki 3 div di laman
Ryan Florence
38
@everybody: pertanyaan asli menanyakan cara menukar div ketiga dan pertama pada halaman yang memiliki tiga div. Itulah pertanyaan yang saya jawab. Jika OP memiliki pertanyaan yang lebih kompleks, mereka seharusnya menanyakannya, dan mereka akan mendapatkan jawaban yang lebih kompleks ;-)
NickFitz
26
Jika ada yang mencari ini di tahun 2014, mohon pertimbangkan jawaban ini. jQuery Dulu berguna, tapi sekarang sudah tidak berguna lagi, karena browser sudah terstandarisasi, jadi tidak perlu menambahkan pustaka 80 kb hanya untuk melakukan tugas sederhana seperti itu. Selain itu, Anda tidak akan mengetahui apa sebenarnya DOM sampai Anda mencobanya tanpa jQuery :)
gustavohenke
29

.sebelum dan sesudah

Gunakan vanilla JS modern! Jauh lebih baik / lebih bersih dari sebelumnya. Tidak perlu merujuk orang tua.

const div1 = document.getElementById("div1");
const div2 = document.getElementById("div2");
const div3 = document.getElementById("div3");

div2.after(div1);
div2.before(div3);

Dukungan Browser - 94.23% Global per Juli '20

Gibolt
sumber
Belum ada dukungan Internet Explorer.
justnorris
11
Anda tidak perlu menulis kode yang kurang dapat dipelihara untuk mendukung orang-orang di browser yang lama atau tidak sesuai dengan standar. Kecuali Anda bekerja di perusahaan, hanya sedikit pengguna yang akan ketinggalan
Gibolt
Metode lain bekerja dengan baik dalam hal pemeliharaan, terutama saat membungkus dalam fungsi bersih yang bagus. Saya semua untuk menulis kode modern, tetapi ini adalah ujung yang berdarah. Sangat menyenangkan mengetahui apa yang akan terjadi di masa depan, tetapi saya juga tidak menyukai apa pun yang terkait dengan IE - penting untuk mengetahui apa dampak dari keputusan Anda. Dalam hal ini - aplikasi web rusak di browser IE apa pun. Jika Anda tidak keberatan - bagus! Saya menambahkan komentar hanya untuk memberi tahu siapa pun yang mencari di Google :)
justnorris
1
Jadi, 27% pengguna adalah beberapa pengguna ? Kita berbicara jutaan!
SandRock
5
Dalam setahun, angka itu akan mendekati 10%. Ini sebagian besar adalah perusahaan, pemerintah, dan perangkat seluler lama. Ini biasanya berarti perangkat non-pribadi atau pengguna yang kurang condong secara teknis. Jawaban harus melihat ke depan sehingga kami tidak terjebak dalam pengembangan pada tahun 2009.
Gibolt
11
jQuery.fn.swap = function(b){ 
    b = jQuery(b)[0]; 
    var a = this[0]; 
    var t = a.parentNode.insertBefore(document.createTextNode(''), a); 
    b.parentNode.insertBefore(a, b); 
    t.parentNode.insertBefore(b, t); 
    t.parentNode.removeChild(t); 
    return this; 
};

dan gunakan seperti ini:

$('#div1').swap('#div2');

jika Anda tidak ingin menggunakan jQuery, Anda dapat dengan mudah menyesuaikan fungsinya.

Darin Dimitrov
sumber
5
var swap = function () {
    var divs = document.getElementsByTagName('div');
    var div1 = divs[0];
    var div2 = divs[1];
    var div3 = divs[2];

    div3.parentNode.insertBefore(div1, div3);
    div1.parentNode.insertBefore(div3, div2);
};

Fungsi ini mungkin tampak aneh, tetapi sangat bergantung pada standar agar dapat berfungsi dengan baik. Nyatanya, ini mungkin berfungsi lebih baik daripada versi jQuery yang diposting tvanfosson yang tampaknya hanya melakukan swap dua kali.

Keanehan standar apa yang diandalkannya?

insertBefore Menyisipkan node newChild sebelum node anak refChild yang ada. Jika refChild adalah null, masukkan newChild di akhir daftar anak. Jika newChild adalah objek DocumentFragment, semua anaknya akan dimasukkan, dalam urutan yang sama, sebelum refChild. Jika newChild sudah ada di pohon, pertama kali dihapus.

Ionuț G. Stan
sumber
0

Pendekatan Jquery yang disebutkan di atas akan berhasil. Anda juga dapat menggunakan JQuery dan CSS. Katakan misalnya pada Div Anda telah menerapkan class1 dan div2 Anda telah menerapkan class class2 (katakanlah misalnya setiap kelas css menyediakan posisi tertentu di browser), sekarang Anda dapat menukar kelas menggunakan jquery atau javascript (yang akan mengubah posisi)

Rajat
sumber
0

Maaf karena menabrak utas ini, saya tersandung masalah "tukar elemen DOM" dan bermain-main sedikit

Hasilnya adalah "solusi" jQuery-native yang tampaknya sangat cantik (sayangnya saya tidak tahu apa yang terjadi di internal jQuery saat melakukan ini)

Kode:

$('#element1').insertAfter($('#element2'));

Dokumentasi jQuery mengatakan bahwa insertAfter() memindahkan elemen dan tidak mengkloningnya

penyimpanan
sumber