javascript面向对象系列第四篇——选项卡的实现

前面的话

  面向对象的应用并非只是读几本书那么容易,需要有大量的工程实践做基础才能真正理解并学会使用它。本文将用面向对象的技术来制作一个简单的选项卡

图示说明

  由图示结果看到,这是一个非常简单的选项卡。三个控制按钮利用点击事件分别控制三张不同的选项卡。选项卡用文字背景颜色区分,控制按钮用轮廓outline区分

HTML代码

  【1】使用行间样式引入CSS的扩展性不高,需要根据实际情况谨慎使用

  【2】在a标签中使用javascript:;来阻止默认的页面跳转行为

  【3】给最外层div元素设置id属性便于外层元素获取,为选项卡和控制按钮使用不同的标签ulnav,便于内层元素获取

<div class="box" id="box">
    <ul class="list">
        <li class="in_active" style="background-color: lightgreen">第一张选项卡</li>
        <li class="in" style="background-color: lightblue">第二张选项卡</li>
        <li class="in" style="background-color: pink">第三张选项卡</li>
    </ul>
    <nav class="conList">
        <a class="con_active" href="javascript:;">第一个控制按钮</a>
        <a class="con" href="javascript:;">第二个控制按钮</a>
        <a class="con" href="javascript:;">第三个控制按钮</a>
    </nav>
</div>

CSS代码

  【1】为body、ula标签进行默认样式重置

  【2】为当前选项卡设置in_active类名,设置display:block

  【3】为当前控制按钮设置con_active类名,设置outline: 1px solid black

body{margin: 0;}
ul{
    margin:0;
    padding: 0;
    list-style: none;
}
a{
    color: inherit;
    text-decoration: none;
}
.box{
    width: 500px;
    text-align: center;
}
/*in为选项卡普通状态,默认不显示*/
.in,.in_active{
    display: none;
    height: 100px;
    font-size: 50px;
    line-height: 100px;
}
/*in_active为选项卡选中状态,选中后显示*/
.in_active{
    display: block;
}
.conList{
    text-align: center;
    line-height: 30px;
}
/*con为按钮普通状态,默认无轮廓*/
.con,.con_active{
    outline:0;
}
/*con_active为按钮选中状态,选中后有1px的黑色轮廓*/
.con_active{
    outline: 1px solid black;
}        

javascript代码

  使用最常用的组合模式创建对象,构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性,并且向构造函数传递选项卡对象参数

  【1】关于元素获取、变量设置和事件绑定都在构造函数中实现,作为实例属性

  【2】定义一个切换方法switch,进行选项卡和控制按钮的同时切换,作为原型方法

  【3】把获取到的选项卡对象oBox作为参数传递到构造函数中

//构造函数
function Tab(obj){
    /*元素获取*/
    //获取选项卡展示部分
    this.oList = obj.getElementsByTagName(‘ul‘)[0];
    this.aIn = this.oList.getElementsByTagName(‘li‘);
    //获取选项卡控制部分
    this.oConList = obj.getElementsByTagName(‘nav‘)[0];
    this.aCon = this.oConList.getElementsByTagName(‘a‘);
    /*变量设置*/
    //选项卡张数
    this.count = this.aIn.length;
    //当前第几张
    this.cur = 0;
    var _this = this;
    for(var i = 0; i < this.count; i++){
        //设置索引
        this.aCon[i].index = i;
        //给按钮添加事件
        this.aCon[i].onclick = function(){
            _this.cur = this.index;
            _this.switch();
        }
    }
}
//原型方法
Tab.prototype.switch = function(){
    //去掉所有
    for(var i = 0; i < this.count; i++){
        this.aIn[i].className = ‘in‘;
        this.aCon[i].className = ‘con‘;
    }
    //显示当前
    this.aIn[this.cur].className = ‘in_active‘;
    this.aCon[this.cur].className = ‘con_active‘;
}
//获取选项卡元素
var oBox = document.getElementById(‘box‘);
//构造选项卡对象
var tab1 = new Tab(oBox);

最后

  这是面向对象系列的最后一篇了,本系列的博文主要参照《javascript高级程序设计》和《javascript面向对象精要》。个人感觉《javascript权威指南》中的面向对象部分写得过于生涩和追求完整,很多例子都过于庞大,实在是难以消化,故借鉴较少。也由于我才疏学浅,看不懂其中奥妙,可能再经过一段时间学习才能品出其中味道

  最难的部分终于啃完

时间: 2024-10-05 06:14:36

javascript面向对象系列第四篇——选项卡的实现的相关文章

深入理解javascript作用域系列第四篇——块作用域

× 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用其他类型的作用域单元甚至可以实现维护起来更加优秀.简洁的代码,比如块作用域.随着ES6的推广,块作用域也将用得越来越广泛.本文是深入理解javascript作用域系列第四篇——块作用域 let for (var i= 0; i<10; i++) { console.log(i); } 上面这段是很熟

javascript面向对象系列第三篇——实现继承的3种形式

前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.开宗明义,继承是指在原有对象的基础上,略作修改,得到一个新的对象.javascript主要包括类式继承.原型继承和拷贝继承这三种继承方式.本文是javascript面向对象系列第三篇——实现继承的3种形式 类式继承 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,如new和instanceof.不过在后来的ES6中新增了一些元素,比如class关键字,但这并不

javascript面向对象系列4——实例篇(最简单的面向对象选项卡)

[功能说明] 点击三个按钮分别显示对应的选项卡 [html代码说明] <div class="box" id="box"> <ul class="list"> <li class="in_active">第一张选项卡</li> <li class="in">第二张选项卡</li> <li class="in"&

深入理解javascript函数系列第四篇——ES6函数扩展

× 目录 [1]参数默认值 [2]rest参数 [3]扩展运算符[4]箭头函数 前面的话 ES6标准关于函数扩展部分,主要涉及以下四个方面:参数默认值.rest参数.扩展运算符和箭头函数 参数默认值 一般地,为参数设置默认值需进行如下设置 function log(x, y) { y = y || 'World'; console.log(x, y); } 但这样设置实际上是有问题的,如果y的值本身是假值(包括false.undefined.null.''.0.-0.NaN),则无法取得本身值

前端学PHP之面向对象系列第四篇-----关键字

public public表示公有,它具有最大的访问权限,被定义为公有的类成员可以在任何地方被访问 如果属性用 var 定义,则被视为公有,如果方法没有设置关键字,则该方法默认为公有 <?php class demo{ public $public = 1; function test($var){ echo "{$var}000"; } } $d1 = new demo; $d1->test($d1->public);//1000 ?> protected p

javascript动画系列第四篇——拖拽改变元素大小

× 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位元素的left和top值实现的.而拖拽改变元素大小,则还需要改变元素的宽高 范围圈定 我们把改变元素大小的范围圈定在距离相应边10px的范围内 左侧边界L = obj.offsetLeft + 10 右侧边界R = obj.offsetLeft + obj.offsetWidth - 10 上侧边界

javascript面向对象系列5——知识点(原型和原型链)

基本概念 [原型链]每个构造函数都有一个对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针.那么,如果原型对象等于另一个原型的实例,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针.如果另一个原型又是另一个原型的实例,那么上述关系依然成立.如此层层递进,就构成了实例与原型的链条. [原型对象]这个对象包含可以由特定类型的所有实例共享的属性和方法.所有引用类型默认都继承了Object,而这个继承也是通过原型链实现

深入理解javascript函数系列第三篇

前面的话 函数是javascript中特殊的对象,可以拥有属性和方法,就像普通的对象拥有属性和方法一样.甚至可以用Function()构造函数来创建新的函数对象.本文是深入理解javascript函数系列第三篇--属性和方法 属性 [length属性] 函数系列第二篇中介绍过,arguments对象的length属性表示实参个数,而函数的length属性则表示形参个数 function add(x,y){ console.log(arguments.length)//3 console.log(

深入理解javascript作用域系列第三篇

前面的话 一般认为,javascript代码在执行时是由上到下一行一行执行的.但实际上这并不完全正确,主要是因为声明提升的存在.本文是深入理解javascript作用域系列第三篇--声明提升(hoisting) 变量声明提升 a = 2 ; var a; console.log( a ); 直觉上,会认为是undefined,因为var a声明在a = 2;之后,可能变量被重新赋值了,因为会被赋予默认值undefined.但是,真正的输出结果是2 console.log( a ) ; var a