前面的话

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

图示说明

  由图示结果看到,这是一个非常简单的选项卡。三个控制按钮利用点击事件分别控制三张不同的选项卡。选项卡用文字背景颜色区分,控制按钮用轮廓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权威指南》中的面向对象部分写得过于生涩和追求完整,很多例子都过于庞大,实在是难以消化,故借鉴较少。也由于我才疏学浅,看不懂其中奥妙,可能再经过一段时间学习才能品出其中味道

  最难的部分终于啃完

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

  1. javascript面向对象系列第四篇——OOP中的常见概念

    前面的话 面向对象描述了一种代码的组织结构形式——一种在软件中对真实世界中问题领域的建模方法.本文将从理论层面,介绍javascript面向对象程序程序(OOP)中一些常见的概念 对象 所谓对象,本质 ...

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

    × 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...

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

    × 目录 [1]let [2]const [3]try 前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用 ...

  4. 深入理解javascript作用域系列第四篇

    前面的话 尽管函数作用域是最常见的作用域单元,也是现行大多数javascript最普遍的设计方法,但其他类型的作用域单元也是存在的,并且通过使用其他类型的作用域单元甚至可以实现维护起来更加优秀.简洁的 ...

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

    × 目录 [1]public [2]protected [3]private[4]final[5]static[6]const[7]this[8]self[9]parent 前面的话 php实现面向对 ...

  6. javascript运动系列第四篇——抖动

    × 目录 [1]原理介绍 [2]代码实现 [3]实例应用 前面的话 在运动系列中,前面分别介绍了匀速运动.变速运动和曲线运动.下面介绍一种特殊的运动形式——抖动 原理介绍 抖动其实是往复运动的一种特殊 ...

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

    × 目录 [1]参数默认值 [2]rest参数 [3]扩展运算符[4]箭头函数 前面的话 ES6标准关于函数扩展部分,主要涉及以下四个方面:参数默认值.rest参数.扩展运算符和箭头函数 参数默认值 ...

  8. javascript面向对象系列第五篇——拖拽的实现

    前面的话 在之前的博客中,拖拽的实现使用了面向过程的写法.本文将以面向对象的写法来实现拖拽 写法 <style> .test{height: 50px;width: 50px;backgr ...

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

    × 目录 [1]原理简介 [2]范围圈定 [3]大小改变[4]代码优化 前面的话 拖拽可以让元素移动,也可以改变元素大小.本文将详细介绍拖拽改变元素大小的效果实现 原理简介 拖拽让元素移动,是改变定位 ...

随机推荐

  1. 洛谷 P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers Label:ExWater

    题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人.然而,在任何一群朋友中 ...

  2. 网络流dinic实现总结

    太羞耻了,搞了半天居然没发现自己写的不是dinic,直到被一道时限紧的题目卡掉才发现 int dfs(int now,int flow,int sum) { if(now==n) return flo ...

  3. PHP 随手记

    这篇文章用来记录自己学习PHP过程中遇到的问题以及解决方法,随时遇到新的问题都会更新,方便以后查阅. 环境:ubuntu 14.10,php5,apache2 1.如何打开PHP报错信息? 解决方法: ...

  4. SectionIndexer示例

    This small tutorial will show you how to create a ListView, enable fast scrolling, and create a alph ...

  5. Odoo 二次开发教程(四)-只读、唯一性验证和ORM方法介绍

    一.只读和唯一性验证 只读的设置有两种方法,一种是实在字段定义时设置为只读,第二种是在页面视图中进行设置. 接前例,我们将学生(tech.student)的名字name字段设置成只读. 方法一:字段定 ...

  6. Python之路第一课Day9--随堂笔记之二(进程、线程、协程篇)

    本节内容 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queu ...

  7. Kafka设计解析(四)- Kafka Consumer设计解析

    本文转发自Jason’s Blog,原文链接 http://www.jasongj.com/2015/08/09/KafkaColumn4 摘要 本文主要介绍了Kafka High Level Con ...

  8. Unity_UGUI知识点思维导图

    转自 http://blog.csdn.net/qq_34134078/article/details/51772568 个人总结的UGUI学习知识要点思维导图,四张部分图及最后一张整体图 1.UI基 ...

  9. C ReadProcessMemory

    ReadProcessMemory函数用于读取其他进程的数据. BOOL STDCALL ReadProcessMemory ( HANDLE hProcess, LPCVOID lpBaseAddr ...

  10. RazorEngine 3.3 在Mono 3.2上正常运行

    RazorEngine 是一个简化的模板引擎基于微软新的Razor 解析引擎, Razor是在 ASP.NET MVC3 和 Web Pages中引入的.RazorEngine 提供了一个外包装和额外 ...