JS面对对象编程 实现tab栏功能

174 阅读3分钟

两大编程思想

  • 面向过程
  • 面向对象

面向过程编程 POP(Process-oriented programming)

面向过程就是分析出解决问题所需的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。

举个例子:把大象装进冰箱 面向过程的做法

  1. 打开冰箱门
  2. 把大象装进去
  3. 关上冰箱门 面向过程,就是按照我们分析好的步骤,按照步骤解决问题

面向对象编程(Object Oriented Prigramming)

面向对象是把事物分解为一个个对象,然后由对象分工与合作。

举个例子:把大象装进冰箱 面向对象的做法

先找出对象,并写出这些对象的功能

1.大象对象

  • 进去

2.冰箱对象

  • 打开
  • 关闭

3.使用大象和冰箱的功能

面向对象是以对象功能划分问题,而不是步骤。

面向对象的特性

  • 封装性
  • 继承性
  • 多态性

面向过程和面向对象的对比

面向过程

  • 优点:性能比面向对象高,适合跟硬件联系很紧密的东西,例如单片机就采用的面向过程编程
  • 缺点:没有面向对象易维护、易复用、易扩展。

面向对象

  • 优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加灵活、更易于维护
  • 缺点:性能比面向过程低

面向对象版的tab栏切换

功能需求:

  1. 点击tab栏可以切换效果。
  2. 点击+号,可以添加tab项和内容项。
  3. 点击x号,可以删除当前的tab项和内容。
  4. 双击tab项文字或者内容项文字,可以修改里面的文字内容

抽取对象:Tab对象

  1. 该对象具有切换功能
  2. 该对象具有添加功能
  3. 该对象具有删除功能
  4. 改对象具有修改功能

tab栏代码

//tab.js

let that;
class Tab{
	constructor(id){
		that=this
		this.main=document.querySelector(id);
		this.add=this.main.querySelector('.add');
		this.ul=this.main.querySelector('ul:first-child')
		this.fsection=this.main.querySelector('.tabcontent')
		this.init()
	}
	init(){
		this.upDateNode();
		//init 初始化操作让相关的元素绑定事件
		this.add.onclick=this.addTab
		for(let i=0;i<this.lis.length;i++){
			this.lis[i].index=i;
			this.lis[i].onclick=this.toggleTab;
			this.remove[i].onclick=this.removeTab;
			this.spans[i].ondblclick=this.editTab;
			this.sections[i].ondblclick=this.editTab;
			
		}
	}
	//动态添加元素,需要重新获取对应元素
	upDateNode(){
		this.lis=this.main.querySelectorAll("li");
		this.sections=this.main.querySelectorAll("section");
		this.remove=this.main.querySelectorAll('.close');
		this.spans=this.main.querySelectorAll('.firstnav li span:first-child');
	}
	alearClass(){ 
		for(let i=0;i<this.lis.length;i++){
			this.lis[i].className="";
			this.sections[i].className="";
		}
	}
	toggleTab(){
		that.alearClass()
		this.className="li-active";
		that.sections[this.index].className="show";	
	}
	addTab(){
		that.alearClass()
		let random=Math.random()
		let li=`<li class="li-active"><span>新选项</span><span class="close">x</span></li>`;
		let section='<section class="show">内容'+random+'</section>'
		that.ul.insertAdjacentHTML('beforeend',li);
		that.fsection.insertAdjacentHTML('beforeend',section);
		that.init()
	}
	removeTab(e){
		e.stopPropagation()//阻止事件冒泡
		let index=this.parentNode.index;
		//根据元素下标删除对应的li和section
		that.lis[index].remove();
		that.sections[index].remove();
		that.init();
		//当我们删除的不是选中状态的li 的时候 原来的选中状态li保持不变
		if(document.querySelector('.li-active')) return
		//当我们删除了选中状态的这个li的时候,让它前一个li处于选中状态;
		index--;
		//手动调用点击事件 不需要鼠标触发
		that.lis[index]&&that.lis[index].click();
		
	}
	editTab(){
		//禁止双击选中文字
		window.getSelection?window.getSelection().removeAllRanges():document.selection.empty();
		let str=this.innerHTML
		this.innerHTML='<input type="text" />'
		let input=this.childNodes[0];
		input.value=str;
		input.select();//文本框里的文字处于选中状态
		//当input失去焦点把value值赋值给span
		input.onblur=function(){
			this.parentNode.innerHTML=this.value
		}
		//按下回车键
		input.onkeyup=function(e){
			if(e.keyCode===13){
				this.blur()
			}
		}
		
	}
}
new Tab("#tab")
<!--tab.html-->

<!doctype html>
<html lang="en">
	<head>
	<meta charset="UTF-8">
	<title></title>
	<style>
		html,dody,div,ul,li.p,section,input{
			margin:0;
			padding:0
		}
		li{
			list-style:none
		}
		.tab{
			position:relative;
			border:1px solid #000;
			width:500px;
			margin:50px auto 0;
		}
		.tab ul{
			display:flex;
		}
		.tab ul li{
			padding:10px 15px;
			border-bottom:1px solid #000;
			border-right:1px solid #000;
			position:relative;
			cursor:pointer
		}
		.close{
			position:absolute;
			top:0;
			right:0;
			background:#000;
			color:#fff;
			display:inline-block;
			width:18px;
			height:18px;
			line-height:18px;
			text-align:center
		}
		.tab .add{
			position:absolute;
			top:0;
			right:0;
			background:blue;
			color:#fff;
			width:20px;
			text-align:center
		}
		.firstnav ul li input{
			width:50px;
			height:25px;
		}
		.li-active{
			border-bottom:0 !important;
		}
		.show{
			display:block !important;
			
		}
		.tabcontent section{
			display:none;
			height:500px;
			padding:15px
		}
	</style>
	
</head>
	<body>
		<div id="tab" class="tab">
			<nav class="firstnav">
				<ul>
					<li class="li-active">
					<span>选项一</span>
					<span class="close">x</span></li>
					<li><span>选项二</span><span class="close">x</span></li>
					<li><span>选项三</span><span class="close">x</span></li>
				</ul>
				<div class="add">
					<span>+</span>
				</div>
			</nav>
			<div class="tabcontent">
				<section class="show">内容一</section>
				<section>内容二</section>
				<section>内容三</section>
			</div>
			
		</div>
		<script type="text/javascript" src="./tab.js"></script>
	</body>
</html>

因为写的是demo,css样式写的有点简单。主要学习js的编程思想