jquery: switch Elements in DOM

后端 未结 2 1121
余生分开走
余生分开走 2020-12-09 05:13

What the best way to switch two elements in DOM with jquery?

some other elements in here....
相关标签:
2条回答
  • 2020-12-09 05:40

    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.

    0 讨论(0)
  • 2020-12-09 06:00

    See this stack overflow question.

    Basically says:

    jQuery("#element1").before(jQuery("#element2"));
    

    or

    jQuery("#element1").after(jQuery("#element2"));
    

    Beautiful eh? - Credit to lotif.

    0 讨论(0)
提交回复
热议问题