基于面向对象的选项卡和面向过程的选项卡有很大的不同,可以任意的去调用。基于面向对象有可扩展性
面向过程实现选项卡:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<style>
body {
background: coral;
}
* {
margin: 0;
padding: 0;
}
#wrap {
width: 300px;
height: 300px;
margin: 100px auto;
border: #00FFFF solid 1px;
}
a {
text-decoration: none;
display: inline-block;
width: 100%;
height: 100%;
color: #262626;
font-size: 18px;
}
ul {
width: 300px;
height: 40px;
list-style: none;
overflow: hidden;
border: 1px solid aqua;
}
ul li {
float: left;
width: 100px;
text-align: center;
line-height: 40px;
}
.content {
display: none;
}
.active {
background: #3081BF;
font-weight: bold;
}
</style>
<body>
<div id="wrap">
<ul>
<li class="active"><a href="javascript:void(0)">推荐</a></li>
<li><a href="javascript:void(0)">小说</a></li>
<li><a href="javascript:void(0)">导航</a></li>
</ul>
<div class="content" style="display: block;">推荐</div>
<div class="content">小说</div>
<div class="content">导航</div>
</div>
<script type="application/javascript">
window.onload = function() {
var wrap = document.getElementById("wrap"); //获取整个div
var tabLis = wrap.children[0].getElementsByTagName("li"); //获取div下面的li标签
var contentDivs = wrap.getElementsByTagName("div"); //获取wrap里面所有的div
// 循环li标签
for (var i = 0; i < tabLis.length; i++) { //循环每一个li标签
tabLis[i].index=i; //把i绑定到每一个li标签上
tabLis[i].onclick = function() {
for (var j = 0; j < tabLis.length; j++) { //去掉初始化样式
tabLis[j].className =" ";
contentDivs[j].style.display='none'
}
this.className = "active"; //添加样式
contentDivs[this.index].style.display='block'
}
}
}
</script>
</body>
</html>
使用闭包函数实现
window.onload = function() {
var wrap = document.getElementById("wrap"); //获取整个div
var tabLis = wrap.children[0].getElementsByTagName("li"); //获取div下面的li标签
var contentDivs = wrap.getElementsByTagName("div"); //获取wrap里面所有的div
// 循环li标签
for (var i = 0; i < tabLis.length; i++) {
tabLis[i].onclick = (function(n){ //此处用n去接收储存的i
return function() {
for (var j = 0; j < tabLis.length; j++) {
tabLis[j].className =" ";
contentDivs[j].style.display='none'
}
this.className = "active";
contentDivs[n].style.display='block'
}
})(i) //这个i储存起来
}
}
上述是一个面向过程的选项卡,如果想要使用这个选项卡,那么我只有按照文中的逻辑代码来实现才行,并未实现封装代码
面向对象实现选项卡
在面向对象中讲到对象有自己的属性和方法,属性和方法尽量分离开。属性通常都是实例属性,方法一般都是共享的方法。 HTML部分
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<style>
body {
background: coral;
}
* {
margin: 0;
padding: 0;
}
#wrap {
width: 300px;
height: 300px;
margin: 100px auto;
border: #00FFFF solid 1px;
}
a {
text-decoration: none;
display: inline-block;
width: 100%;
height: 100%;
color: #262626;
font-size: 18px;
}
ul {
width: 300px;
height: 40px;
list-style: none;
overflow: hidden;
border: 1px solid aqua;
}
ul li {
float: left;
width: 100px;
text-align: center;
line-height: 40px;
}
.content {
display: none;
}
.active {
background: #3081BF;
font-weight: bold;
}
</style>
<body>
<div id="wrap">
<ul>
<li class="active"><a href="javascript:void(0)">推荐</a></li>
<li><a href="javascript:void(0)">小说</a></li>
<li><a href="javascript:void(0)">导航</a></li>
</ul>
<div class="content" style="display: block;">推荐</div>
<div class="content">小说</div>
<div class="content">导航</div>
</div>
<script src="./TabSwitch.js"></script>
<script type="application/javascript">
window.onload = function() {
var wrap = document.getElementById("wrap"); //获取整个div
var tab= new TabSwitch(wrap);
}
</script>
</body>
</html>
JS封装部分
//构造选项卡函数
function TabSwitch(fatherObj){
// 保存this指向
var _this=this;
// 绑定实例属性
this.tabLis = fatherObj.children[0].getElementsByTagName("li"); //获取div下面的li标签
this.contentDivs = fatherObj.getElementsByTagName("div"); //获取wrap里面所有的div
// 遍历每一个li标签
for(var i=0;i<this.tabLis.length;i++){
this.tabLis[i].index=i; //绑定i的索引
this.tabLis[i].onclick=function(){
// 当前的this指向了我们每一个li标签,每一个li标签上面保存了i
_this.clickFun(this.index); //调用方法的时候把index传进来
}
}
}
// 绑定共享的方法
TabSwitch.prototype.clickFun=function(index){ //这里就可以用index接收
for (var j = 0; j < this.tabLis.length; j++) {
this.tabLis[j].className =" ";
this.contentDivs[j].style.display='none'
}
this.tabLis[index].className = "active";
this.contentDivs[index].style.display='block'
}