2009-09-01 14 views

Odpowiedz

93

Trivial z jQuery

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

Jeśli chcesz to zrobić wielokrotnie, trzeba użyć różnych selektorów ponieważ div zachowa swoje identyfikatory, ponieważ są one przemieszczane.

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

Jest to błąd gdzieś. Wydaje się, że działa tylko dwa razy. http://jsbin.com/evedu –

+13

Spodziewałem się, że zadziała tylko raz. – tvanfosson

+1

@Ionut - chodzi o to, że zależy to od względnego położenia elementów. Po zmianie kolejności nie można już znaleźć pierwszego i trzeciego numeru identyfikacyjnego, który należy opracować w inny sposób. Moja odpowiedź miała na celu zilustrowanie funkcjonalności metod do wykonania żądanego zadania, a nie kompleksowe rozwiązanie do zamiany pierwszego i trzeciego elementu div w zbiorze dowolną liczbę razy. – tvanfosson

9
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żywać go tak:

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

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

121

Nie ma potrzeby, aby korzystać z biblioteki za takie trywialne 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, third 

ta uwzględnia fakt, że getElementsByTagName zwraca żywo NodeList który jest automatycznie aktualizowane w celu odzwierciedlenia kolejność elementów w DOM gdy są zmanipulowani.

Można 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, third 

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

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

na przykład :-)

+12

To prawda, ale trudno dyskutować z elegancją i czytelnością, którą zapewnia coś takiego jak jQuery - nie wspominając o ulepszonych możliwościach po wyjęciu z pudełka. –

+10

To powiedziawszy, +1 dla podejścia bez kodowania. –

+12

Tak, ale kto robi tylko to jedno? – tvanfosson

0

podejście Jquery wymienione na top zadziała. Możesz także użyć JQuery i CSS. Powiedz, że np. Na Div jeden zastosowałeś class1 i div2 zastosowałeś class class2 (powiedzmy np., Że każda klasa css zapewnia określoną pozycję w przeglądarce), teraz możesz zamieniać klasy używając jquery lub JavaScript (który zmieni pozycję)

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

funkcja ta może wydawać się dziwne, ale w dużym stopniu opiera się na standardach, aby funkcjonować poprawnie. W rzeczywistości może wydawać się, że działa lepiej niż the jQuery version that tvanfosson posted, która wydaje się wykonywać zamianę tylko dwa razy.

Na jakich charakterystykach standardów polega?

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

0

Przepraszamy za wpadając ten wątek potknąłem problemu „Swap DOM-elementy” i bawił się trochę

Rezultatem jest jQuery-native „rozwiązanie”, który wydaje się być naprawdę ładna (niestety nie wiem, co dzieje się na wewnętrznych jQuery, gdy robi to)

kodu:

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

dokumentacja jQuery mówi t kapelusz insertAfter()porusza element i nie sklonuj go

2

.Przed i .Po

stosujemy nowoczesne waniliowy JS! Sposób lepiej/czystsze niż wcześniej

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

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

Browser Support - 84% globalnego, 87% USA jako Mar '18

+0

Brak obsługi Internet Explorera. – Norris

+0

Nie powinieneś pisać mniej kodu, który można obsługiwać w przeglądarkach starszych lub niezgodnych z normami. Jeśli nie pracujesz w przedsiębiorstwie, niewielu użytkowników straci dostęp. – Gibolt

+0

Inne metody działają równie dobrze, jeśli chodzi o łatwość konserwacji, zwłaszcza podczas owijania w ładną, czystą funkcję. Jestem za pisaniem współczesnego kodu, ale to jest krwawienie. Wspaniale jest wiedzieć, co przyniesie przyszłość, ale tak bardzo jak nie lubię niczego związanego z 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ć kogokolwiek, kto to zrobił :) – Norris

Powiązane problemy