ES6学习笔记(三):教你用js面向对象思维来实现 tab栏增删改查功能
前两篇文章主要介绍了类和对象、类的继承,如果想了解更多理论请查阅《ES6学习笔记(一):轻松搞懂面向对象编程、类和对象》、《ES6学习笔记(二):教你玩转类的继承和类的对象》,今天主要来分享关于如何用js面向对象的思维来实现tab栏的一些相关的功能。
要实现的功能分析
- 点击tab栏可以切换效果
- 点击+号,可以添加tab项和内容项
- 点击X号,可以删除当前的tab项和内容项
- 点击tab文字或者内容项文字,可以修改里面的字体内容
抽像对象: Tab对象 (增删改查功能)
实现功能效果如下图:
首先建立一个class 类Tab:
let that
class Tab {
constructor(id) {
that=this
// 获取元素
this.main = document.getElementById('tab')
//获取li的父元素
this.ul = this.main.querySelector('.firstnav ul:first-child')
// 获取section的父元素
this.fSection = this.main.querySelector('.tabscon')
this.add = this.main.querySelector('.tabadd')
this.remove = this.main.querySelectorAll('i')
this.init()
}
//初始化
init() {
this.updateNode()
// init 初始化操作让相关的元素绑定事件
this.add.onclick = this.addTab
for(var i = 0; i<this.lis.length; i++) {
this.lis[i].index = i
this.lis[i].onclick = this.togggleTab
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('i')
this.spans = this.main.querySelectorAll('span')
}
//切换功能
togggleTab() {}
//清除li和section的class,主要实现切换功能用
clearClass() {
for(var i = 0; i< this.lis.length; i++) {
this.lis[i].className = ''
this.sections[i].className = ''
}
}
//添加功能
addTab() {}
//删除功能
removeTab(e) {}
// 修改功能
editTab() {}
}
let tab = new Tab('#tab')
切换功能
- 点击上面的tab标题实现切换功能,下面对应的section也显示,其他的隐藏
- 实现思路,先去掉已有的选中class,
- 根据li的索引值,找到要显示的section,添加对应的class,使其显示
实现的主要代码是:
that.clearClass()
this.className='liactive'
that.sections[this.index].className='conactive'
添加功能实现
- 点击+ 可以实现添加新的选项卡和内容
- 第一步:创建新的选项卡li和新的内容section
- 第二步: 把创建的两个元素追加到对应的父元素中
- 以前的做法:动态创建元素createElement,但是元素里面内容较多,需要innerHTML赋值在appendChild追加到父元素里面
- 现在高级做法,利用insertAdjacentHTML()可以直接把字符串格式元素添加到父元素中,appendChild不支持追加字符串的子元素,insertAdjacentHTML支持追加字符串的元素
实现功能的主要代码是:
//创建li元素和section元素
that.clearClass()
let li = ' <li class="liactive" ><span>新选项卡</span><i>X</i></li>'
let section = '<section class="conactive">新内容区</setion>'
that.ul.insertAdjacentHTML('beforeend', li)
that.fSection.insertAdjacentHTML('beforeend',section)
that.init()
删除功能
- 点击X可以删除当前的选项卡和当前的section
- X是没有索引号的,但是它的父元素li有索引号,这个索引号正是我们想要的索引号
- 所以核心思路就是:点击x号可以删除这个索引号对应的li和section
实现功能的主要代码是:
e.stopPropagation();//阻止冒泡,
let index = this.parentNode.index
//根据索引号删除对应的li 和section
that.lis[index].remove()
that.sections[index].remove()
that.init()
//当我们删除的不是选中状态的元素时,原来的选中状态保持不变
if(document.querySelector('.liactive')) return
//当我们删除 了选中状态的生活,让它前一个li处于选中状态
index--
//手动调用click事件,不需要鼠标触发
that.li[index] && that.lis[index].click()
编辑功能
- 双击选项卡li或者section里面的文字,可以实现修改功能
- 双击事件是:ondblclick
- 如果双击文字,会默认选定文字,此时需要双击禁止选中文字
- window.getSelection?window.getSelection().removeAllRanges():document.selection.empty()
- 核心思路:双击文字的时候,在里面生成一个文本框,当失去焦点或者按下回车然后把文本输入的值给原先元素即可
实现功能的主要代码是:
let str = this.innerHTML
//双击禁止选定文字
window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty()
this.innerHTML ='<input type="text" value="'+ str +'"/>'
let input = this.children[0]
//文本框里面的文字处于选中状态
input.select()
//当鼠标离开文本框就把文本框的值给span
input.onblur = function() {
this.parentNode.innerHTML=input.value
}
// 按回车键也饿可以把文本框里的值给span
input.onkeyup = function(e) {
if(e.keyCode === 13) {
this.blur()
}
}
总结
这篇文章主要是通过我学习的技术总结后来分享了如何用面向对象的思路方法来实现tab栏的切换、编辑、增加、删除功能。用到了很多ES6的一些语法。
案例源码地址:https://github.com/qiuqiulanfeng/tab
ES6学习笔记(三):教你用js面向对象思维来实现 tab栏增删改查功能的更多相关文章
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- django学习-12.访问不同url/接口地址实现对指定数据的增删改查功能
1.前言 通过前面博客[django学习-10.django连接mysql数据库和创建数据表]里的操作,我们已经成功在数据库[hongjingsheng_project]里创建了一张数据表[hello ...
- JQuery Easyui/TopJUI 用JS创建数据表格并实现增删改查功能
JQuery Easyui/TopJUI 用JS创建数据表格并实现增删改查功能 html <table id="productDg"></table> &l ...
- jQuery EasyUI/TopJUI实现数据表格的增删改查功能(不写js,纯HTML实现!!!)
jQuery EasyUI/TopJUI实现数据表格的增删改查功能(不写js,纯HTML实现!!!) 废话不多说,直接贴上代码 <table id="configEdatagrid&q ...
- (转)Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解
原文:http://blog.csdn.net/lidew521/article/details/8655229 1.SQLite介绍:最大特点是,无数据类型;除了可以使用文件或SharedPrefe ...
- Mock.js简易教程,脱离后端独立开发,实现增删改查功能(转)
在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢, ...
- mock.js 的用法 -- 脱离后端独立开发,实现增删改查功能
在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢, ...
- ES6学习笔记三
1.Symbol ES5 的对象属性名都是字符串,这容易造成属性名的冲突.如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突.这就是 ES6 引入Symbol的原因 ...
- ES6学习笔记(三)——数值的扩展
看到这条条目录有没有感觉很枯燥,觉得自己的工作中还用不到它所以实在没有耐心看下去,我也是最近得闲,逼自己静下心来去学习去总结,只有在别人浮躁的时候你能静下心来去学去看去总结,你才能进步.毕竟作为前端不 ...
随机推荐
- mysql数据库死锁的解决方案
1. 查询锁表信息 show OPEN TABLES where In_use > 0;2. 查看当前数据库锁表的情况 SELECT * FROM information_schem ...
- Hibernate相关概念及序列化和持久化的区别
hibernate是一种ORM(object relation mapping,对象关系映射)框架,所谓的对象关系映射,通俗的说,就是把JAVA对象保存到关系型数据库中. hibernate要做的事, ...
- BeagleboneBlack上u-boot的MLO文件是哪里来的
在玩BeagleboneBlack一段时间之后不可避免地接触到了u-boot,之前的玩耍过程大致上是这样的: 在MATLAB下耍,因为MATLAB提供了它的硬件支持,可以直接在命令行与之交互,也可在s ...
- G - KiKi's K-Number(树状数组求区间第k大)
For the k-th number, we all should be very familiar with it. Of course,to kiki it is also simple. No ...
- PAT甲级——1042 Shuffling Machine
1042 Shuffling Machine Shuffling is a procedure used to randomize a deck of playing cards. Because s ...
- The file named error_log is too large
The file named errorlog is too large */--> The file named errorlog is too large 1 Problem One day ...
- Qt QThread必须要了解的几个函数
概述 如果想对Qt中的QThread有个更加深刻的了解,必须要知道这几个重要的函数,现在就一一介绍下. 函数介绍 属性 返回值 函数体 功能 static QThread * QThread::cur ...
- 使printf打印信息带有颜色
#define NONE "\033[m"#define RED "\033[0;32;31m"#define LIGHT_RED "\033[1;3 ...
- file,path,uri互相转换
uri 转 file :File file = new File(new URI(uri.toString())); uri 转 path: Path path = Files.get(uri); f ...
- SpringCloud快速搭建
1.SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.负载均衡.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运行环境简单,可以在开发 ...