DOM'daki JavaScript hareketli öğe


99

Diyelim ki <div>bir sayfada üç öğem var . Birinci ve üçüncü pozisyonları nasıl değiştirebilirim <div>? jQuery iyi.

Yanıtlar:


111

JQuery ile önemsiz

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

Tekrar tekrar yapmak istiyorsanız, div'ler hareket ettikçe kimliklerini koruyacağından farklı seçiciler kullanmanız gerekir.

$(function() {
    setInterval( function() {
        $('div:first').insertAfter($('div').eq(2));
        $('div').eq(1).insertBefore('div:first');
    }, 3000 );
});

1
@Ionut - elemanların göreceli konumlandırmasına bağlı olduğu nokta. Sırayı değiştirdikten sonra artık birinci ve üçüncüyü kimliklerine göre bulamazsınız ve başka bir şekilde çalışmanız gerekir. Cevabım, yalnızca istenen görevi yerine getirmek için yöntemlerin işlevselliğini göstermeyi amaçlıyordu, birinci ve üçüncü div'leri bir kümede rasgele sayıda değiştirmeye yönelik kapsamlı bir çözüm değil.
tvanfosson

Merhaba arkadaşlar, hızlı bir soru: Yukarıdaki jquery işlevi tamamlandıktan sonra orijinal Dom durumuna geri dönmenin kolay bir yolu var mı?
Vikita

@Vikita - evet, orijinal HTML'yi kaydedin ve sonra geri yükleyin. Daha yüksek bir öğeye devredilmek yerine doğrudan uygulandıysa herhangi bir işleyiciyi yeniden uygulamanız gerekebilir. Örneğin,var html = $('#container').html(); ...; $('#container').html(html);
tvanfosson

172

Böylesine önemsiz bir görev için kitaplık kullanmaya gerek yok:

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

Bu, getElementsByTagNameDOM'daki öğelerin işlenirken sırasını yansıtmak için otomatik olarak güncellenen canlı bir DüğümListesi döndüren gerçeğini hesaba katar .

Ayrıca şunları da kullanabilirsiniz:

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

ve denemek istiyorsanız, başka olası permütasyonlar da vardır:

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

Örneğin :-)


15
Doğru, ancak jQuery gibi bir şeyin sağladığı zarafet ve okunabilirlik ile tartışmak zor - kutudan çıkan gelişmiş yeteneklerden bahsetmeye gerek yok.
Çılgın Joe Malloy

13
Evet, ama bunu sadece kim yapıyor?
tvanfosson

1
... veya sayfada yalnızca 3 bölümü var
Ryan Florence

38
@everybody: orijinal soru, üç div içeren bir sayfada üçüncü ve birinci div'lerin nasıl değiştirileceğini sordu. Cevapladığım soru buydu. OP'nin daha karmaşık bir sorusu olsaydı, sormaları gerekirdi ve daha karmaşık bir yanıt
alırlardı

27
Bunu 2014 yılında arayan biri varsa, lütfen bu yanıtı değerlendirin. jQuery o zamanlar yararlıydı, ancak artık o kadar kullanışlı değil, çünkü tarayıcılar standartlaştırıldı, bu nedenle sadece bu kadar basit bir görevi yapmak için 80 kb'lik bir kitaplık eklemeye gerek yok. Ayrıca, jQuery olmadan
deneyene kadar DOM'un

31

.önce ve sonra

Modern vanilya JS'yi kullanın! Öncekinden çok daha iyi / daha temiz. Ebeveyne başvurmaya gerek yok.

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

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

Tarayıcı Desteği - Temmuz '20 itibarıyla% 94,23 Global


Henüz Internet Explorer desteği yok.
justnorris

11
İnsanları eski veya standartlara uymayan tarayıcılarda desteklemek için daha az bakım gerektiren kod yazmanız gerekmez. Kurumsal alanda çalışmadığınız sürece, çok az kullanıcı bunu kaçıracak
Gibolt

Diğer yöntemler, özellikle güzel ve temiz bir işleve sarılırken, sürdürülebilirlik açısından da işe yarar. Hep modern kod yazmaktan yanayım, ama bu son derece önemli. Geleceğin neler getireceğini bilmek harika, ancak IE ile ilgili hiçbir şeyden hoşlanmasam da - kararlarınızın etkisinin ne olduğunu bilmek önemlidir . Bu durumda - herhangi bir IE tarayıcısında bozuk bir web uygulaması. Senin için uygunsa - harika! Bu yorumu sadece
Google'da araştıran

1
Yani kullanıcıların% 27'si birkaç kullanıcı mı? Milyonlardan bahsediyoruz!
SandRock

5
Bir yıl içinde bu sayı% 10'a yaklaşacak. Çoğunlukla kurumsal, hükümet ve daha eski mobil cihazlardır. Bu genellikle kişisel olmayan cihazlar veya teknik olarak daha az eğilimli kullanıcılar anlamına gelir. Cevaplar ileriye dönük olmalı, bu yüzden 2009'da geliştirme yapmakta
kalmayalım

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

ve şu şekilde kullanın:

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

jQuery kullanmak istemiyorsanız, işlevi kolayca uyarlayabilirsiniz.


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

Bu işlev tuhaf görünebilir, ancak düzgün çalışması için büyük ölçüde standartlara dayanır. Aslında, takas işlemini yalnızca iki kez yapıyor gibi görünen tvanfosson'un yayınladığı jQuery sürümünden daha iyi çalışıyor gibi görünebilir .

Hangi standartlara güveniyor?

insertBefore Varolan refChild alt düğümünden önce newChild düğümünü ekler. RefChild null ise, alt öğe listesinin sonuna newChild ekleyin. NewChild bir DocumentFragment nesnesiyse, tüm alt öğeleri refChild'den önce aynı sırayla eklenir. NewChild zaten ağaçtaysa, önce kaldırılır.


0

Üstte bahsedilen jquery yaklaşımı işe yarayacaktır. Ayrıca JQuery ve CSS'yi de kullanabilirsiniz. Örneğin Div one'a class1 ve div2'yi uyguladığınızı söyleyin class2'yi uyguladınız (örneğin, her css sınıfı tarayıcıda belirli bir konum sağlar), şimdi sınıfları jquery veya javascript (konumu değiştirecek)


0

Bu ileti dizisini çarptığım için özür dilerim, "DOM öğelerini takas etme" sorunuyla karşılaştım ve biraz oynadım

Sonuç, gerçekten güzel görünen bir jQuery-native "çözümdür" (maalesef, bunu yaparken jQuery dahililerinde ne olduğunu bilmiyorum)

Kod:

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

JQuery belgeleri , öğeyi insertAfter() hareket ettirdiğini ve klonlamadığını söylüyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.