前两篇文章主要介绍了类和对象、类的继承,如果想了解更多理论请查阅《ES6学习笔记(一):轻松搞懂面向对象编程、类和对象》、《ES6学习笔记(二):教你玩转类的继承和类的对象》,今天主要来分享关于如何用js面向对象的思维来实现tab栏的一些相关的功能。

要实现的功能分析

  1. 点击tab栏可以切换效果
  2. 点击+号,可以添加tab项和内容项
  3. 点击X号,可以删除当前的tab项和内容项
  4. 点击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')

切换功能

  1. 点击上面的tab标题实现切换功能,下面对应的section也显示,其他的隐藏
  2. 实现思路,先去掉已有的选中class,
  3. 根据li的索引值,找到要显示的section,添加对应的class,使其显示

实现的主要代码是:

that.clearClass()
this.className='liactive'
that.sections[this.index].className='conactive'

添加功能实现

  1. 点击+ 可以实现添加新的选项卡和内容
  2. 第一步:创建新的选项卡li和新的内容section
  3. 第二步: 把创建的两个元素追加到对应的父元素中
  4. 以前的做法:动态创建元素createElement,但是元素里面内容较多,需要innerHTML赋值在appendChild追加到父元素里面
  5. 现在高级做法,利用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()

删除功能

  1. 点击X可以删除当前的选项卡和当前的section
  2. X是没有索引号的,但是它的父元素li有索引号,这个索引号正是我们想要的索引号
  3. 所以核心思路就是:点击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()

编辑功能

  1. 双击选项卡li或者section里面的文字,可以实现修改功能
  2. 双击事件是:ondblclick
  3. 如果双击文字,会默认选定文字,此时需要双击禁止选中文字
  4. window.getSelection?window.getSelection().removeAllRanges():document.selection.empty()
  5. 核心思路:双击文字的时候,在里面生成一个文本框,当失去焦点或者按下回车然后把文本输入的值给原先元素即可

实现功能的主要代码是:

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栏增删改查功能的更多相关文章

  1. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  2. django学习-12.访问不同url/接口地址实现对指定数据的增删改查功能

    1.前言 通过前面博客[django学习-10.django连接mysql数据库和创建数据表]里的操作,我们已经成功在数据库[hongjingsheng_project]里创建了一张数据表[hello ...

  3. JQuery Easyui/TopJUI 用JS创建数据表格并实现增删改查功能

    JQuery Easyui/TopJUI 用JS创建数据表格并实现增删改查功能 html <table id="productDg"></table> &l ...

  4. jQuery EasyUI/TopJUI实现数据表格的增删改查功能(不写js,纯HTML实现!!!)

    jQuery EasyUI/TopJUI实现数据表格的增删改查功能(不写js,纯HTML实现!!!) 废话不多说,直接贴上代码 <table id="configEdatagrid&q ...

  5. (转)Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解

    原文:http://blog.csdn.net/lidew521/article/details/8655229 1.SQLite介绍:最大特点是,无数据类型;除了可以使用文件或SharedPrefe ...

  6. Mock.js简易教程,脱离后端独立开发,实现增删改查功能(转)

    在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢, ...

  7. mock.js 的用法 -- 脱离后端独立开发,实现增删改查功能

    在我们的生产实际中,后端的接口往往是较晚才会出来,并且还要写接口文档,于是我们的前端的许多开发都要等到接口给我们才能进行,这样对于我们前端来说显得十分的被动,于是有没有可以制造假数据来模拟后端接口呢, ...

  8. ES6学习笔记三

    1.Symbol ES5 的对象属性名都是字符串,这容易造成属性名的冲突.如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突.这就是 ES6 引入Symbol的原因 ...

  9. ES6学习笔记(三)——数值的扩展

    看到这条条目录有没有感觉很枯燥,觉得自己的工作中还用不到它所以实在没有耐心看下去,我也是最近得闲,逼自己静下心来去学习去总结,只有在别人浮躁的时候你能静下心来去学去看去总结,你才能进步.毕竟作为前端不 ...

随机推荐

  1. 吴裕雄--天生自然 pythonTensorFlow图形数据处理:TensorFlow图像处理函数

    import numpy as np import tensorflow as tf import matplotlib.pyplot as plt #读取图片 image_raw_data = tf ...

  2. JavaScript可以做嵌入式开发了

    JS怎么可能搞嵌入式开发? TESSEL这个工具可直接在设备上运行JS,无需服务端支持. 百闻不如一见,请查看官网介绍吧:http://technical.io/ 网页内还有一个示例,点击会看到LED ...

  3. 01 语言基础+高级:1-4 接口与多态_day10【接口、多态】&&day11【final、匿名内部类】

    day10[接口.多态] 接口三大特征——多态引用类型转换 教学目标写出定义接口的格式写出实现接口的格式说出接口中成员的特点能够说出使用多态的前提条件理解多态的向上转型理解多态的向下转型 day10_ ...

  4. 服务端向客户端推送消息技术之websocket的介绍

    websocket的介绍 在讲解WebSocket前,我们先来看看下面这种场景,在HTTP协议下,怎么实现. 需求: 在网站中,要实现简单的聊天,这种情况怎么实现呢?如下图: 当发送私信的时候,如果要 ...

  5. 项目引入nacos 日志不显示问题

    禁用nacos的日志即可解决 idea当中 添加vm options参数即可 -Dnacos.logging.default.config.enabled=false 打包后的启动命令  java - ...

  6. 01-信贷路由项目架构和 rose 框架的搭建

    1.信贷路由项目架构 2.工程搭建及测试 搭建tyrRouter-parent,tyrRouter-log-web,工程采用 maven 构建 配置 pom.xml 文件,父项目管理 jar 包的版本 ...

  7. BucketSort(桶排序)原理及C++代码实现

    桶排序假设输入数据服从均匀分布,平均情况下它的时间复杂度为O(n). 桶排序将输入数据的区间均匀分成若干份,每一份称作“桶”.分别对每一个桶的内容进行排序,再按桶的顺序输出则完成排序. 通常使用链表来 ...

  8. android多框架实现短视频应用、3D手势旋转、banner控件、指南针、智能管家等应用源码

    Android精选源码 android智能管家app源码 Android高仿拼多多分类列表 Android百度地图实例详解之仿摩拜单车APP RecyclerView的LayoutManager搭建流 ...

  9. css样式表----------样式属性(背景与前景、边界和边框、列表与方块、格式与布局)

    一.背景与前景 (1).背景 line-height: 1.5 !important;">90; /*背景色(以样式表为主,样式表优先.)*/ background-image:url ...

  10. 标题艺术与技术的完美结合,LG画廊OLED电视正式发布!

      由LG电子举办的"旷世巨作---面向未来的电视"主题沙龙于3月10号在王府井亚洲首家数字化奥迪展厅拉开帷幕.此次活动宣布了LG画廊OLED电视在国内市场上市.而我有幸参加了此次 ...