• 简单模拟穿梭框


    穿梭框相信很多人接触过,在写后台管理系统的项目时有很大可能性会用到这个功能。

    其实这个组件在element ui里面有,但是因为兼容性ie的问题(万恶的ie啊),我现在必须手写一个类似的功能供项目使用

    乞丐样式上图

    原汁原味基本没有经过任何修饰的html,有一种朴素的美。。。还是以功能为主啊,只写了的简单的样式。。。

    主要功能就是左侧某一个checkbox选中后点击‘选中过’按钮,此选项就出现在右侧的框中,同时左侧的框中此选项消失  “1区”这个按钮其实就是一个全选的按钮

    右侧框中新选项默认为非选中状态,但已选中的状态不能改变,并且顺序和之前保持一致

    也就是先选第二过去之后,在选第一个过去之后第一个要在第二个之上,点击“全部过”按钮就是将左侧剩余的所有选项移入右侧,后面两个按钮是从右向左的反向操作

    上码

    <div class="father">
            <ul>
                <li>
                    <input type="checkbox" class="all">
                    <label for="">1区</label>
                    <ul>
                        <li value="0">    //value值是排序使用的标识
                            <input type="checkbox" class="box">
                            <label for="">第一</label>
                        </li>
                        <li value="1">
                            <input type="checkbox" class="box">
                            <label for="">第二</label>
                        </li>
                        <li value="2">
                            <input type="checkbox" class="box">
                            <label for="">第三</label>
                        </li>
                        <li value="3">
                            <input type="checkbox" class="box">
                            <label for="">第四</label>
                        </li>
                    </ul>
                </li>
            </ul>
    
        </div>
        <div class="btn">
            <span class="cl_cho">选中过</span>
            <span class="cl_all">全部过</span>
            <span class="del_cho">选中删</span>
            <span class="del_all">全删</span>
        </div>
        <div class="son">
            <ul></ul>
        </div>
        <script src="../../lib/jquery-1.11.3.min.js"></script>

    li标签的value值是排序的标识,同时引用了jq

     function getEle(str){  //获取摸个dom元素中的所有li,放入数组中,供排序使用
            var newEle = $(str).children('li')
            arrEle = new Array()
            newEle.each(function(){
                arrEle.push($(this)[0])
            })
            return arrEle
        }
        下面是点~选中过~按钮时触发的函数 $(
    '.cl_cho').click(function(){ if($('.all').is(':checked')){ 如果全选按钮选中了直接调~全部过~按钮的函数 $('.cl_all').click() }else{ $('.father input[type="checkbox"]').each(function(){ if($(this).prop('checked')===true){ //找到左侧栏中的CheckBox如果被选中了,则将其选中去掉然后追加到右侧框中
                 $(this).prop('checked',false).parent().appendTo($('.son ul'))
                         getEle('.son ul')
                    }
                });
                function sortFun(a,b){  //同过value从小到大排序
                    return a.value-b.value
                }
                arrEle.sort(sortFun)   //通过sort函数将数组中的li重新排序在放回右侧框中
                $('.son ul').append(arrEle)
             arrEle=[] //清空数组否则避免点击其他按钮有影响
            }
        })
       ~全部过~按钮触发的函数 $(
    '.cl_all').click(function(){ $('.all').siblings('ul').find('.box').each(function(){ //找到左侧所有的checkbox将其至为未选中状态然后通过end()方法返回到上一级在在找到li追加到右侧框中,不用end()方法找parent()也是可以的 $(this).prop('checked',false) }).end().find('li').each(function(){ $(this).appendTo($('.son ul')) })
           getEle('.son ul')
         function sortFun(a,b){
                    return a.value-b.value
                }
            arrEle.sort(sortFun)
            $('.son ul').append(arrEle)
    arrEle=[] //清空数组否则避免点击其他按钮有影响
    })   //后面两个函数思想类,只不过是反向操作 $('.del_cho').click(function(){ $('.son input[type="checkbox"]').each(function(){ if($(this).prop('checked')===true){ $(this).prop('checked',false).parent().appendTo($('.father ul ul')); getEle('.father ul ul') } }) function sortFun(a,b){ return a.value-b.value } arrEle.sort(sortFun) $('.father ul ul').append(arrEle)
    arrEle=[] //清空数组否则避免点击其他按钮有影响 }) $(
    '.del_all').click(function(){ $('.son>ul').find('.box').each(function(){ $(this).prop('checked',false) }).end().find('li').each(function(){ $(this).appendTo($('.father ul ul')) }) getEle('.father ul ul') function sortFun(a,b){ return a.value-b.value } arrEle.sort(sortFun) $('.father ul ul').append(arrEle)
         arrEle=[] //清空数组否则避免点击其他按钮有影响 })

    下面还有一个全选的方法,其实此处全选不是必须的,已经有按钮可以实现全选的功能了

    $('.all').change(function(){
            if($(this).is(':checked')){
                $(this).siblings('ul').find('.box').each(function(){
                    $(this).prop('checked',true)
                })
            }else{
                $('.father .box').prop('checked',false)
            }
        })
        $('.father .box').click(function(){  //有一个子框没被选中全选就不会选中,相反所有子框都选中全选自动选中
            if(!$(this).is(':checked')){
                $('.all').prop('checked',false)
            }
            var allbox = $('.box').length;
            var b = true; 
            for(let i =0;i<allbox;i++){
                if(!$($('.box')[i]).is(':checked')){
                   b =false
                }
            }
            if(b){
                $('.all').prop('checked',true)
            }
        })

    写在最后:此case中涉及多处选取dom元素的操作,选取方法多种多样,可灵活使用

  • 相关阅读:
    DataTable Clone()方法和Copy()方法的区别
    element-ui的使用
    解决VS Code 软件PowerShell执行策略问题
    Vue-Router
    Vue的生命周期
    vue-cli脚手架和webpack
    Vue组件
    Vue基本用法和指令
    ES6常用语法
    前端-Bootstrap框架
  • 原文地址:https://www.cnblogs.com/ybhome/p/12222674.html
Copyright © 2020-2023  润新知