What the best way to switch two elements in DOM with jquery?
<div id="switchme2">some other elements in here....</div>
<div class="some other elements"></div>
<div id="switchme1">some other elements in here....</div>
should end in:
<div id="switchme1">some other elements in here....</div>
<div class="some other elements"></div>
<div id="switchme2">some other elements in here....</div>
To replace a DOM element with the specified HTML or DOM elements using jQuery, use the replaceWith() method.
You'll get people telling you to use jQuery's before
, after
, and such, but beware, that can mess things up if there are text nodes on either side of either element (more on that below).
Because of that (and for people not using jQuery), you can just use the DOM directly:
function swapElements(elm1, elm2) {
var parent1, next1,
parent2, next2;
parent1 = elm1.parentNode;
next1 = elm1.nextSibling;
parent2 = elm2.parentNode;
next2 = elm2.nextSibling;
parent1.insertBefore(elm2, next1);
parent2.insertBefore(elm1, next2);
}
Note that it's fine if the reference element (next1
or next2
above) is null
; insertBefore
handles that correctly (by adding at the end of the parent, like appendChild
would).
Usage combined with jQuery:
swapElements($("#switchme1")[0], $("#switchme2")[0]);
Live example:
jQuery(function($) {
function swapElements(elm1, elm2, elm3, elm4, elm5) {
var parent1, next1,
parent2, next2,
parent3, next3,
parent4, next4,
parent5, next5;
parent1 = elm1.parentNode;
next1 = elm1.nextSibling;
parent2 = elm2.parentNode;
next2 = elm2.nextSibling;
parent3 = elm3.parentNode;
next3 = elm3.nextSibling;
parent4 = elm4.parentNode;
next4 = elm4.nextSibling;
parent5 = elm5.parentNode;
next5 = elm5.nextSibling;
parent1.insertBefore(elm2, next1);
parent2.insertBefore(elm3, next2);
parent3.insertBefore(elm4, next3);
parent4.insertBefore(elm5, next4);
parent5.insertBefore(elm1, next5);
}
$("#btnSwitch").click(function() {
swapElements($("#switchme1")[0], $("#switchme2")[0], $("#switchme3")[0], $("#switchme4")[0], $("#switchme5")[0]);
});
});
first text node
<div id="switchme1">this is <strong>switchme1</strong> with <strong>some other elements</strong> <em>in here<div>test</div></em></div>
second text node
<div id="switchme2">this is <strong>switchme2</strong> with <strong>some other elements</strong> <em>in here</em></div>
<div id="switchme3">this is <strong>switchme3</strong> with <strong>some other elements</strong> <em>in here</em></div>
<div id="switchme4">this is <strong>switchme4</strong> with <strong>some other elements</strong> <em>in here</em></div>
<div id="switchme5">this is <strong>switchme5</strong> with <strong>some other elements</strong> <em>in here</em></div>
third text node
<input type="button" id="btnSwitch" value="Switch Em!">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
More about jQuery's before
, after
, and such: Because jQuery tends to give you access mostly to elements (which is what you want 95% of the time!), if the elements you want to swap have text nodes around them, using those methods will mess things up. (You also have to either remember which one goes in front or figure it out.) In contrast, the swapElements
method above above works regardless of whether the elements are surrounded by other elements or text nodes, and you don't have to remember or figure out which should go in front.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With