Ruchomy element JavaScript w DOM

97

Powiedzmy, że mam trzy <div>elementy na stronie. Jak mogę zamienić miejscami pierwszą i trzecią <div>? jQuery jest w porządku.

rdzeń
źródło

Odpowiedzi:

110

Trivial z jQuery

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

Jeśli chcesz to robić wielokrotnie, musisz użyć różnych selektorów, ponieważ elementy div zachowają swoje identyfikatory podczas przenoszenia.

$(function() {
    setInterval( function() {
        $('div:first').insertAfter($('div').eq(2));
        $('div').eq(1).insertBefore('div:first');
    }, 3000 );
});
tvanfosson
źródło
1
@Ionut - chodzi o to, że zależy to od względnego położenia elementów. Po zmianie kolejności nie możesz już znaleźć pierwszego i trzeciego na podstawie ich identyfikatorów i musisz wypracować inny sposób. Moja odpowiedź miała tylko zilustrować funkcjonalność metod do wykonania żądanego zadania, a nie być kompleksowym rozwiązaniem polegającym na zamianie pierwszego i trzeciego elementu div w zestawie dowolną liczbę razy.
tvanfosson
Cześć wszystkim, krótkie pytanie: czy istnieje łatwy sposób na przywrócenie pierwotnego stanu Dom po zakończeniu powyższej funkcji jquery?
Vikita,
@Vikita - tak, zapisz oryginalny HTML, a następnie przywróć go. Może być konieczne ponowne zastosowanie wszystkich programów obsługi, jeśli zostały one bezpośrednio zastosowane zamiast delegowane do wyższego elementu. Na przykładvar html = $('#container').html(); ...; $('#container').html(html);
tvanfosson
171

Nie ma potrzeby używania biblioteki do tak banalnego zadania:

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

Uwzględnia to fakt, że getElementsByTagNamezwraca aktywną listę NodeList, która jest automatycznie aktualizowana w celu odzwierciedlenia kolejności elementów w DOM, gdy są one manipulowane.

Możesz również użyć:

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

i istnieje wiele innych możliwych permutacji, jeśli masz ochotę poeksperymentować:

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

na przykład :-)

NickFitz
źródło
15
To prawda, ale trudno dyskutować z elegancją i czytelnością, które zapewnia coś takiego jak jQuery - nie wspominając o rozszerzonych możliwościach po wyjęciu z pudełka.
Crazy Joe Malloy
13
Tak, ale kto robi tylko jedną rzecz?
tvanfosson
1
... lub ma tylko 3 elementy div na stronie
Ryan Florence
38
@everybody: pierwotne pytanie dotyczyło zamiany trzeciego i pierwszego elementu div na stronie, która ma trzy elementy div. To było pytanie, na które odpowiedziałem. Gdyby OP miał bardziej złożone pytanie, powinien je zadać, a otrzymaliby bardziej złożoną odpowiedź ;-)
NickFitz
26
Jeśli ktoś szuka tego w 2014 roku, proszę rozważyć tę odpowiedź. jQuery BYŁO przydatne wtedy, ale teraz nie jest już tak przydatne, ponieważ przeglądarki są ustandaryzowane, więc nie ma potrzeby dodawania biblioteki 80 kb tylko po to, aby wykonać tak proste zadanie. Poza tym nie dowiesz się, czym tak naprawdę jest DOM, dopóki nie spróbujesz go bez jQuery :)
gustavohenke
29

.przed i po

Użyj nowoczesnego waniliowego JS! O wiele lepszy / czystszy niż poprzednio. Nie ma potrzeby odwoływania się do rodzica.

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

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

Obsługa przeglądarek - 94,23% globalnie, stan na lipiec 20

Gibolt
źródło
Brak obsługi przeglądarki Internet Explorer.
justnorris
11
Nie powinieneś pisać kodu, który jest trudniejszy w utrzymaniu, aby wspierać ludzi korzystających ze starych przeglądarek lub niezgodnych ze standardami. Jeśli nie pracujesz w przedsiębiorstwie, niewielu użytkowników przegapi
Gibolt
Inne metody działają równie dobrze, jeśli chodzi o łatwość konserwacji, szczególnie podczas pakowania w ładną, czystą funkcję. Jestem za pisaniem nowoczesnego kodu, ale to krwawa przewaga. Wspaniale jest wiedzieć, co przyniesie przyszłość, ale chociaż nie podoba mi się wszystko, co dotyczy IE - ważne jest, aby wiedzieć, jaki jest wpływ Twoich decyzji. W tym przypadku - zepsuta aplikacja internetowa w dowolnej przeglądarce IE. Jeśli ci to nie przeszkadza - świetnie! Dodałem komentarz tylko po to, aby poinformować każdego, kto go
szuka w Google
1
Czyli 27% użytkowników to kilku użytkowników ? Mówimy o milionach!
SandRock,
5
Za rok ta liczba zbliży się do 10%. Są to głównie urządzenia korporacyjne, rządowe i starsze urządzenia mobilne. Zwykle oznacza to urządzenia nieosobowe lub użytkowników mniej skłonnych technicznie. Odpowiedzi powinny patrzeć w przyszłość, więc nie utknęliśmy w rozwoju w 2009 roku.
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; 
};

i użyj go w ten sposób:

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

jeśli nie chcesz używać jQuery, możesz łatwo dostosować tę funkcję.

Darin Dimitrov
źródło
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);
};

Ta funkcja może wydawać się dziwna, ale w celu prawidłowego działania w dużym stopniu opiera się na standardach. W rzeczywistości może się wydawać, że działa lepiej niż wersja jQuery opublikowana przez tvanfosson, która wydaje się wykonywać wymianę tylko dwa razy.

Na jakich szczególnych normach się opiera?

insertBefore Wstawia węzeł newChild przed istniejącym węzłem podrzędnym refChild. Jeśli refChild ma wartość null, wstaw newChild na końcu listy dzieci. Jeśli newChild jest obiektem DocumentFragment, wszystkie jego elementy podrzędne są wstawiane w tej samej kolejności przed refChild. Jeśli noweDziecko jest już w drzewie, jest najpierw usuwane.

Ionuț G. Stan
źródło
0

Podejście jquery wymienione na górze zadziała. Możesz również użyć JQuery i CSS. Powiedzmy, że np. W Div 1 zastosowałeś class1 i div2 zastosowałeś klasę class2 (powiedzmy, że każda klasa css zapewnia określoną pozycję w przeglądarce), teraz możesz zamienić klasy, używając jquery lub javascript (który zmieni pozycję)

Rajat
źródło
0

Przepraszam za trafienie w ten wątek, natknąłem się na problem "zamiany elementów DOM" i trochę się pobawiłem

Rezultatem jest "rozwiązanie" natywne dla jQuery, które wydaje się być naprawdę ładne (niestety nie wiem, co się dzieje z wewnętrznymi elementami jQuery podczas robienia tego)

Kod:

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

Dokumentacja jQuery mówi, że insertAfter() przenosi element i nie klonuje go

storrm
źródło