Это ответ, основанный на логике ответов @lotif , но немного более обобщенный
Если вы добавляете / добавляете после / до того, как элементы фактически перемещаются
=> клонирование не требуется
=> события сохраняются
Есть два случая, которые могут произойти
- Одна цель имеет что-то «
.prev()
ious» => мы можем поставить другую цель, .after()
что.
- Одна цель - это первый дочерний элемент для этого
.parent()
=> мы можем .prepend()
направить другую цель к родителю.
Код
Этот код можно сделать еще короче, но я сохранил его для удобства чтения. Обратите внимание, что предварительное сохранение родителей (при необходимости) и предыдущих элементов обязательно.
$(function(){
var $one = $("#one");
var $two = $("#two");
var $onePrev = $one.prev();
if( $onePrev.length < 1 ) var $oneParent = $one.parent();
var $twoPrev = $two.prev();
if( $twoPrev.length < 1 ) var $twoParent = $two.parent();
if( $onePrev.length > 0 ) $onePrev.after( $two );
else $oneParent.prepend( $two );
if( $twoPrev.length > 0 ) $twoPrev.after( $one );
else $twoParent.prepend( $one );
});
... не стесняйтесь обернуть внутренний код в функцию :)
Пример fiddle имеет дополнительные события click, прикрепленные для демонстрации сохранения событий ...
Пример fiddle: https://jsfiddle.net/ewroodqa/
... будет работать для разных случаев, даже таких как:
<div>
<div id="one">ONE</div>
</div>
<div>Something in the middle</div>
<div>
<div></div>
<div id="two">TWO</div>
</div>