交换两个元素的位置,将元素上移或下移

项目中需要的一个功能,简化成两个小的demo,每个都有js和jq两个版本

1.交换两个元素的所在位置

点击转换更换两个元素的位置,html略过,直接上js版代码

 var btn = document.querySelector('.btn')
        function insertEle(ele,targetEle){//将某元素插到targetEle元素前
            targetEle.insertAdjacentElement('beforeBegin',ele)
        }
        function changePos(id1,id2){//交换两个元素的位置必须为相邻元素,id分别为要交换元素的id
            var ele1 = document.querySelector('#'+id1);
            var ele2 = document.querySelector('#'+id2);
            var medium = document.createElement('a');  //中间元素   参考交换两个变量的值的方法引入中间元素
            insertEle(medium,ele2);            // 将中介元素插到元素2前
            insertEle(ele2,ele1);             // 将元素2插到元素1前
            insertEle(ele1,medium);            // 将元素1插到中介元素前 
            document.body.removeChild(medium)         //删除中介元素
        }
        btn.onclick = function(){                   //点击调用 函数
            changePos('a','b')
        }

jq版会简洁很多

 function change(id1,id2){
            var medium = document.createElement('a');   //思路一样引入中间元素
            $('#'+id2).after(medium)
            $('#'+id1).after($('#'+id2))
            $(medium).after($('#'+id1))
            $(medium).remove()
        }
        $('.btn').click(function(){
            change('a','b')
        })

先点击要移动的元素,然后在点击上移或者下移

js版代码

 var id
        var box = document.querySelector('.box').children
        console.log(box)
        for(let  i =0;i<box.length;i++){
                // box[i].onclick = ()=>{                //给每个元素添加点击事件,点击切换id,也就是要移动的元素,但这种写法有一个bug我简单描述一下
                //     id = box[i];                      //这样循环后box[0] click后 id = box[0],看似没问题,但box内的元素顺序在元素移动后会改变,而循环只执行这一次
                //     console.log(id);                  //也就是说  最初的第一个元素点击后 id总等于最新的box[0]
                //     console.log(i);
                // }
                box[i].onclick = function(){
                    id = this
                }
        }
        var up = document.querySelector('.up')
        var down = document.querySelector('.down')
        up.onclick = ()=>{
            console.log(id)
            console.log(id.previousElementSibling,'前兄弟元素')  //上移就找对应元素之前的兄弟元素,把他插到兄弟元素之前
            try{
                var preEle = id.previousElementSibling
                insertEle(id,preEle)                           //这个还是最上面使用的将元素插到对应元素前的函数
            }
            catch(err){
                console.log(err)
            }
        }
        down.onclick = ()=>{
            console.log(id.nextElementSibling,'后兄弟元素')       //下移就找对应元素后面的兄弟元素,把后面元素前提
            try{
                var nextEle = id.nextElementSibling               
                insertEle(nextEle,id)                           
            }                                                      
            catch(err){
                console.log(err)
            }
        }

Jq版本也比较简单   思路和js版一样

 var id
        $('.box>div').click(function(){   
            id = this
        })
        $('.up').click(()=>{
            try{
                $(id).prev().before($(id))
            }
            catch(err){
                console.log(err)
            }
        })
        $('.down').click(()=>{
            try{
                $(id).next().after($(id))
            }
            catch(err){
                console.log(err)
            }
        })

 

posted @ 2020-05-14 10:37  忽闻河东狮子吼  阅读(1984)  评论(0编辑  收藏  举报