• js学习总结----选项卡封装


    这个插件对应的html的结构如下 

    <div class='box' id='tabFir'>
            <ul id='tabOptions'>
                <li class='select'>页卡一</li>
                <li>页卡二</li>
                <li>页卡三</li>
            </ul>
            <div class='select'>
                <div>1</div>
                <div>2</div>
                <div>3</div>
                <div>4</div>
            </div>
            <div>内容二</div>
            <div>内容三</div>
        </div>

    版本1

    //实现一个选项卡封装:我们可以分析出,只要多个选项卡的主体结构一样,那么每个实现的思想都是一样的,唯一不一样的就是最外层的盒子不一样
    
    ~function(){
        /*
            tabChange:封装一个选项卡的插件,只要大结构保持统一,以后实现选项卡的功能,只需要调取这个方法执行即可实现
            param:container当前要实现选项卡的这个容器
                   defaultIndex:默认选中项的索引
        */
        function tabChange(container,defaultIndex){
            var tabFirst = utils.firstChild(container),oLis = utils.children(tabFirst);
            var divList = utils.children(container,"div");
            //让defaultIndex对应的页卡有选中的样式
            defaultIndex = defaultIndex || 0;
            utils.addClass(oLis[defaultIndex],"select");
            utils.addClass(divList[defaultIndex],"select");
            //具体的切换功能
            for(var i = 0;i<oLis.length;i++){
                oLis[i].onclick = function(){
                    utils.addClass(this,"select");
                    var curSiblings = utils.siblings(this);
                    for(var i = 0;i<curSiblings.length;i++){
                        utils.removeClass(curSiblings[i],"select")
                    }
                    var index = utils.index(this);
                    for(var i = 0;i<divList.length;i++){
                        i===index ? utils.addClass(divList[i],"select") : utils.removeClass(divList[i],"select")
                    }
                }    
            }
            
        }
        window.fTab = tabChange
        
    }()

    版本2(将for循环改为使用事件委托的方式)

    //实现一个选项卡封装:我们可以分析出,只要多个选项卡的主体结构一样,那么每个实现的思想都是一样的,唯一不一样的就是最外层的盒子不一样
    
    ~function(){
        /*
            tabChange:封装一个选项卡的插件,只要大结构保持统一,以后实现选项卡的功能,只需要调取这个方法执行即可实现
            param:container当前要实现选项卡的这个容器
                   defaultIndex:默认选中项的索引
        */
        function tabChange(container,defaultIndex){
            var tabFirst = utils.firstChild(container),oLis = utils.children(tabFirst);
            var divList = utils.children(container,"div");
            //让defaultIndex对应的页卡有选中的样式
            defaultIndex = defaultIndex || 0;
            utils.addClass(oLis[defaultIndex],"select");
            utils.addClass(divList[defaultIndex],"select");
            //具体的切换功能
            
            //使用事件委托优化
            tabFirst.onclick = function(e){
                e = e || window.event;
                e.target = e.target || e.srcElement;
                if(e.target.tagName.toLowercase()==="li"){//说明当前点击的是li标签
                    detailFn.call(e.target,oLis,divList);
    
                }
            }
        }
        function detailFn(oLis,divList){
            var index = utils.index(this);
            utils.addClass(this,"select");
            for(var i = 0;i<oLis.length;i++){
                i!==index?utils.removeClass(oLis[i],"select"):null;
                i===index ? utils.addClass(divList[i],"select") : utils.removeClass(divList[i],"select");
            }
        }
        window.fTab = tabChange
        
    }()

    版本3:面向对象的方式,使用构造函数

    //实现一个选项卡封装:我们可以分析出,只要多个选项卡的主体结构一样,那么每个实现的思想都是一样的,唯一不一样的就是最外层的盒子不一样
    
    ~function(){
        /*
            tabChange:封装一个选项卡的插件,只要大结构保持统一,以后实现选项卡的功能,只需要调取这个方法执行即可实现
            param:container当前要实现选项卡的这个容器
                   defaultIndex:默认选中项的索引
        */
    
    
        function TabChange(container,defaultIndex){
            this.init(container,defaultIndex);
    
        }
        TabChange.prototype = {
            constructor:TabChange,//注意重写原型方法,需要重新指定构造器
            //初始化 ,也是当前插件的唯一入口
            init:function(container,defaultIndex){
                this.container = container || null;
                this.defaultIndex = defaultIndex || 0;
                this.tabFirst = utils.firstChild(this.container);
                this.oLis = utils.children(this.tabFirst);
                this.divList = utils.children(this.container,"div");
    
                this.defaultIndexEven();
                this.liveClick();
                return this;
            },
            //事件委托实现绑定切换
            liveClick:function(){
                var _this = this;
                this.tabFirst.onclick = function(e){
                    e = e || window.event;
                    e.target = e.target || e.srcElement;
                    if(e.target.tagName.toLowercase()==="li"){//说明当前点击的是li标签
                        _this.detailFn(e.target);
    
                    }
                }
            },
            detailFn:function(curEle){
                var index = utils.index(curEle);
                utils.addClass(curEle,"select");
                for(var i = 0;i<this.oLis.length;i++){
                    i!==index?utils.removeClass(this.oLis[i],"select"):null;
                    i===index ? utils.addClass(this.divList[i],"select") : utils.removeClass(this.divList[i],"select");
                }
            },
            //按照索引来设置默认选中的页卡
            defaultIndexEven:function(){
                utils.addClass(this.oLis[this.defaultIndex],"select");
                utils.addClass(this.divList[this.defaultIndex],"select");
            }
    
        }
        window.fTab = TabChange
        
    }()
    
    //使用
    var box1 = new fTab(boxList[0],0)
  • 相关阅读:
    linux rcu
    linux下的进程、网络、性能监控命令
    使用optimizely做A/B测试
    使用logstash收集日志的可靠性验证
    LAMP-HTTPD的安装全步骤
    Iptables Save
    linux-ftp
    远程桌面验证问题,函数错误-windows
    ESXIroot密码重置
    centos or windows 双系统
  • 原文地址:https://www.cnblogs.com/diasa-fly/p/7154461.html
Copyright © 2020-2023  润新知