JavaScript高手之路:选项卡的封装

Posted 「已注销」

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript高手之路:选项卡的封装相关的知识,希望对你有一定的参考价值。

选项卡我相信开发过前端的同学都不陌生,有时候我们也把它叫做页签,在网站开发中我们经常把它作为导航栏来使用。Bootstrap和EasyUI都已经封装好了选项卡组件,但是今天我们还是想自己动手来实现自己的选项卡,它的大致效果如图:

本页面中有4个按钮和4个div,当用户选中按钮时,被选中的按钮背景色变黄,对应的红色背景div内容则显示出来,其他3个div则被隐藏,那么我们的页面代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>选项卡</title>
    <style>
        #box div 
            height: 300px;
            width: 300px;
            display: none;
            background-color: red;
        

        .active 
            background-color: yellow;
        
    </style>
</head>
<body>
    <div id="box">
        <input type="button" value="按钮1" />
        <input type="button" value="按钮2" />
        <input type="button" value="按钮3" />
        <input type="button" value="按钮4" />

        <div style="display: block">内容1</div>
        <div>内容2</div>
        <div>内容3</div>
        <div>内容4</div>
    </div>
</body>
</html>

该页面定义了一个div作为容器,里面套有4个input和4个div,这4个div由css的属性display:none控制为隐藏状态,然后在第1个div的style属性设置其display:block,明确指定第1个div为显示状态,接下来我们用上一节中学到的构造函数来封装这个选项卡。

构造函数封装选项卡

我们直接开门见山,我先直接给出代码,然后再说一下封装该的要点,代码如下:

        var Tab = function(id) 
            var oTab = document.getElementById(id);
            this.aBtn = oTab.getElementsByTagName("input");
            this.aDiv = oTab.getElementsByTagName("div");

            this.switchTab = function () 
                that = this;
                //这一层for循环给4个button注册单击事件
                for(var i = 0; i < this.aBtn.length; i++) 
                    this.aBtn[i].index = i;//并且记录当前按钮所在的数组中的下标
                    this.aBtn[i].onclick = function () 
                        //这一层for清空所有的按钮样式和div样式
                        for(var j = 0; j < that.aDiv.length; j++) 
                            that.aDiv[j].style.display = ""; //清空每一个div的style
                            that.aBtn[j].className = "";     //清空每一个button的背景颜色
                        

                        //this.index 表示当前用户选中的按钮
                        //给选中的button对应的div附加样式
                        that.aDiv[this.index].style.display = "block";
                        //给选中的button加背景颜色
                        that.aBtn[this.index].className = "active";
                    
                
            
        

该类具有2个成员变量aBtn和aDiv,分别记录页面存在的4个button按钮和4个div,同时该类具有一个switchTab(),用于操作选项卡的切换功能,简单的UML类图如下:


值得一题的是在switchTab函数的代码中,第1层for循环的作用是给这4个按钮注册单击事件。在循环遍历这4个按钮的时候,每个按钮的下标将被记录在this.aBtn[i].index中,这是的this指的是Tab类,也就是包含4个按钮和4这4个div。然而当用户选中某一个按钮时,这时候的this指向当前选中的按钮,所以需要将指向Tab对象的this变量赋值给that,便于用this.index当作下标来取值。

上面是Tab选项卡的封装,下面是驱动代码,调用上面封装的Tab类。

        window.onload = function () 
            var tab = new Tab('box');
            tab.switchTab();
        

字面量封装选项卡

上面是通过构造函数方式来封装的选项卡,现在我们将选项卡功能改为字面量方式来封装该类。

        var Tab = 
            aBtn : null, //定义btn按钮数组
            aDiv : null, //定义div数组

            init : function(id) 
                var oTab = document.getElementById(id);
                this.aBtn = oTab.getElementsByTagName("input");
                this.aDiv = oTab.getElementsByTagName("div");
            ,
            switchTab : function() 
                //循环遍历给button注册单击事件
                for(var i = 0; i < this.aBtn.length; i++) 
                    that = this;
                    this.aBtn[i].index = i;
                    this.aBtn[i].onclick = function () 
                        //循环清空每一个div和button的样式
                        for(var j = 0; j < that.aBtn.length; j++) 
                            that.aBtn[j].className = "";
                            that.aDiv[j].style.display = "none";
                        
                        //给当前选中的button和div赋值
                        that.aBtn[this.index].className = "active";
                        that.aDiv[this.index].style.display = "block";
                    
                
            
        ;

代码思路第1章节一样,只是字面量封装的对象在调用的时候不需要new来创建对象,所以这里给出了init方法,然后调用代码如下:

        window.onload = function () 
            Tab.init('box');  //不需要new出一个对象
            Tab.switchTab();  //直接调用switchTab方法
        

以上是关于JavaScript高手之路:选项卡的封装的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript高手之路:封装抽奖效果

JavaScript高手之路:封装抽奖效果

JavaScript高手之路:构造函数方式封装对象

JavaScript高手之路:全选不选反选效果

JavaScript高手之路:全选不选反选效果

JavaScript高手之路:封装css方法和Table表格