js高级—tab栏切换(面向对象做法)

    <main><h4>Js 面向对象 动态添加标签页</h4><div class="tabsbox" id="tab"><!-- tab 标签 --><nav class="fisrstnav"><ul><li class="liactive"><span>测试1</span><span class="iconfont icon-guanbi"></span></li><li><span>测试2</span><span class="iconfont icon-guanbi"></span></li><li><span>测试3</span><span class="iconfont icon-guanbi"></span></li></ul><div class="tabadd"><span>+</span></div></nav><!-- tab 内容 --><div class="tabscon"><section class="conactive">测试1</section><section>测试2</section><section>测试3</section></div></div></main>
        * {margin: 0;padding: 0;
}ul li {list-style: none;
}main {width: 960px;height: 500px;border-radius: 10px;margin: 50px auto;
}main h4 {height: 100px;line-height: 100px;text-align: center;
}.tabsbox {width: 900px;margin: 0 auto;height: 400px;border: 1px solid lightsalmon;position: relative;
}nav ul {overflow: hidden;
}nav ul li {float: left;width: 100px;height: 50px;line-height: 50px;text-align: center;border-right: 1px solid #ccc;position: relative;
}nav ul li.liactive {border-bottom: 2px solid #fff;z-index: 9;
}#tab input {width: 80%;height: 60%;
}nav ul li span:last-child {position: absolute;user-select: none;font-size: 12px;top: 0px;right: 0;display: inline-block;width: 20px;height: 20px;background-color: red;cursor: pointer;
}.tabadd {position: absolute;/* width: 100px; */top: 0;right: 0;
}.tabadd span {display: block;width: 20px;height: 20px;line-height: 20px;text-align: center;border: 1px solid #ccc;float: right;margin: 10px;user-select: none;cursor: pointer;
}.tabscon {width: 100%;height: 300px;position: absolute;padding: 30px;top: 50px;left: 0px;box-sizing: border-box;border-top: 1px solid #ccc;
}.tabscon section,
.tabscon section.conactive {display: none;width: 100%;height: 100%;
}.tabscon section.conactive {display: block;
}
<script type="text/javascript">//定义一个that变量,让实例对象中的this进行赋值var that;class Tab{constructor(id){//将实力对象中的this赋值到that中that = this;//首先获取最大父盒子的元素 , 此处的this指向实力对象//获取需要操作的标签this.main = document.querySelector(id);// //获取最大父盒子中的所有li// this.lis = this.main.querySelectorAll('li');// // 获取最大父盒子中的所有section// this.sections = this.main.querySelectorAll('section');/*动态创建li和section 可以将选择器更换为*/// //获取最大父盒子中的所有li// this.lis = this.main.getElementsByTagName('li');// // 获取最大父盒子中的所有section// this.sections = this.main.getElementsByTagName('section');// 因为getElementsByTagName具有隐式遍历的作用//获取最大父盒子中的tabaddthis.add = this.main.querySelector('.tabadd');//获取最大父盒子中的fisrstnav下的第一个元素标签 (li的父元素)this.ul = this.main.querySelector('.fisrstnav ul:first-child');//获取最大父盒子中的tabscon的元素标签 (tabscon父元素)this.fsection = this.main.querySelector('.tabscon');// //获取最大盒子中的icon-guanbi// this.remove = this.main.querySelectorAll('.icon-guanbi')this.init();}//设置一个初始化的函数,让相关元素绑定事件(主要就是添加相关的绑定事件)init(){//一初始化的时候就调用新的li和section(重新调用切记写在最前面,要不然添加时,最后一个li没有效果)this.updateNode();//循环li,进行添加绑定事件,此处的长度设置为实例对象中的写法//this.lis.lengthfor (var i = 0; i < this.lis.length; i++) {// 此处为了后期与section进行绑定,利用实力对象形式设置一个变量保存每次遍历的索引this.lis[i].index = i;//会给每个li设置点击事件//此处测试li是否已经可以点击,拿到索引号// this.lis[i].onclick = function(){//     console.log(this.index);// }//每个li设置点击事件,触发toggleTab的函数效果this.lis[i].onclick = this.toggleTab;//给每个icon-guanbi按钮进行绑定事件this.remove[i].onclick = this.removeTab;//给每个span设置鼠标双击事件this.spans[i].ondblclick = this.editTab;//给每个sections绑定一个双击事件(此处因为所需要用到的方法跟span设置的事件方法一样,所以此处直接调用span的双击方法)this.sections[i].ondblclick = this.editTab;}//添加事件不需要进行遍历this.add.onclick = this.addTab;}//重新获取所有的小li和sectionupdateNode(){//获取最大父盒子中的所有lithis.lis = this.main.querySelectorAll('li');// 获取最大父盒子中的所有sectionthis.sections = this.main.querySelectorAll('section');//获取最大盒子中的icon-guanbithis.remove = this.main.querySelectorAll('.icon-guanbi')//获取所有的li下的第一个spanthis.spans = this.main.querySelectorAll('.fisrstnav li span:first-child')}/*****************************************************************************************************/ //1.切换功能toggleTab(){//在此处调用清楚样式的函数,此处的this修改为that,因为this的话只能理解为li调用了此方法//其中还有sections的存在,因此用that进行包含that.clearClass();//测试li是否已经可以点击,拿到索引号// console.log(this.index);//此处的this指向的是li这个标签(谁调用了我,我就指向谁)this.className = 'liactive';//因为this指向的是li,li中没有conactive这个类名属性,所以this.sections[thsi.index] = 'conactive';// 不管用,因此可以得到此conactive为constructor(实例对象)中的元素// this.sections[thsi.index] = 'conactive';//设置一个全局变量taht,对实例对象中的this进行赋值,进行调用//因此此处的this,修改为thatthat.sections[this.index].className = 'conactive';  }//设置一个清楚样式的函数(清除所有li和section中的类)clearClass(){for (let i = 0; i < this.lis.length; i++) {//清除li和sections下的所有类(此处用到排他思想处理)this.lis[i].className = '';//此处sections可以用that或者this,在调用方法时用that就可以了that.sections[i].className = '';  }}
/*****************************************************************************************************/ //2.添加功能addTab(){//进行排他思想,让创建的标签类达到比较好的效果that.clearClass();//绑定测试// alert(123)//为了生成的效果好看,添加个生成随机数var random = Math.random();//(1) 创建li元素和section元素var li = '<li class="liactive"><span>新选项卡</span><span class="iconfont icon-guanbi"></span></li>'var section = ' <section class="conactive">新内容'+ random +'</section>';//(2) 将以下的两个元素添加到父元素中(利用insertAdjacentHTML方法进行子元素的添加,因为insertAdjacentHTML不局限于文字添加,方法中的beforeend,是将标签等信息放在盒子里面的最后一个)//因为addTab指向的实例对对象,因此此处用thatthat.ul.insertAdjacentHTML('beforeend',li);that.fsection.insertAdjacentHTML('beforeend',section);//此处在重新调用一次init方法;that.init();}// 已经设置了 updateNode() 函数重新调用li和section的个数/*****************************************************************************************************/ //3.删除功能//给当前函数添加事件对象(事件参数),阻止事件冒泡行为removeTab(e){e.stopPropagation(); //利用事件参数阻止冒泡,防止出发li的点击事件//此时会出现新增li中的删除按钮跟当前索引取不到一起,因此将获取关闭按钮的元素放到 updateNode()方法中重新获取即可//引用父元素的索引号var index = this.parentNode.index;// 测试console.log(index);// remove() 方法则可以直接删除指定的元素that.lis[index].remove();that.sections[index].remove();//此处调用init方法,为了让init方法执行 updateNode() 方法,即可拿到新的元素进行遍历使用that.init();//当我们删除的不是选中状态的li的时候,原来的选中状态li保持不变//如果当前的标签存折liactive这个标签状态,就直接返回值,不必执行下面的代码if(document.querySelector('.liactive'))return;//当我们删除了选中状态的这个li的时候,让它的前一个li处于选定状态//让index--;从而让前一个li为选中状态index--;//index--;于此同时自动调用lis的点击事件,让sections也属于选中状态// that.lis[index].click();//利用 && 对前后的效果进行判断 (&& 与)that.lis[index] && that.lis[index].click();}/*****************************************************************************************************/ //4.修改功能editTab(){//先获取原来的文本文字var str = this.innerHTML;//双击禁止选定文字;window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty()//测试// alert(123)//使鼠标双击到的标签设置为文本标签this.innerHTML = '<input type="text" />';//获取input标签,将原来的文本文字赋值给inputvar input = this.children[0];input.value = str;//让文本框内的文字处于选定状态input.select();//当我们离开文本框,将文本框内的值设置给spaninput.onblur = function(){this.parentNode.innerHTML = this.value;};input.onkeyup = function(e){if(e.keyCode === 13){//手动调用表单失去焦点事件 不需要鼠标离开操作this.blur();}   }}}//创建的实力对象必须存在实例函数的下面,不然执行结果为undeiful//首先过去最大的父盒子元素/*var a =  */ new Tab('#tab');// a.init();</script>

实现效果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win10卸载python总是提示error2503失败各种解决办法

最近win10的电脑装了python的3.4&#xff0c;然后想卸载&#xff0c;就总是提示error 2053&#xff0c;类似于这种&#xff1a; 下面是我的坎坷解决之路&#xff1a; 1、网上说&#xff0c;任务管理器 --> 详细信息 --> explorer.exe结束任务&#xff0c;结束资源管理器&…

js高级—查询商品案例

<div class"search">按照价格查询&#xff1a;<input type"text" class"start"> - <input type"text" class"end"><button class"search-price">搜索</button> 按照商品名称查询&a…

js高级第二天

构造函数和原型 构造函数和原型 在典型的OOP 的语言中&#xff08;如Java&#xff09;&#xff0c;都存在类的概念&#xff0c;类就是对象的模板&#xff0c;对象就是类的实例&#xff0c;但在ES6之前&#xff0c;JS 中并没用引入类的概念。ES6&#xff0c;全称ECMAScript6.0…

操作系统原理之文件系统(第五章)

一、文件 1、⽂件系统的⽤户接⼝包括⽂件的命名、类型、属性和对⽂件的操作 2、⽂件命名&#xff1a;所有操作系统都允许⽤1&#xff5e;8个字⺟组成的字符串 3、⽂件扩展名&#xff1a;多数操作系统都⽀持⽂件名⽤圆点隔开分为两部分&#xff0c;圆点后⾯的部分称为⽂件扩展名…

js高级第三天

原型链 作用&#xff1a;提供一个成员的查找机制&#xff0c;或者查找规则含义&#xff1a;由原型所串联起来的链装结构JavaScript 的成员查找机制(规则) 当访问一个对象的属性&#xff08;包括方法&#xff09;时&#xff0c;首先查找这个对象自身有没有该属性。如果没有就查…

为什么大学的计算机老师技术那么厉害,却不愿意当程序员?

不知道大家有多少是从事跟计算机有关的工作的&#xff0c;每次想到大学时的计算机考试&#xff0c;都能令小小编心惊胆战呀&#xff0c;各式代码和计算机语言&#xff0c;真的是很令人头痛了。不过呢&#xff0c;也有很多大神&#xff0c;大学学着其他的专业&#xff0c;却在毕…

DDG全家桶之3022

本篇文章主要根据360Netlab新出的DDG分析文档来复现新变种3022&#xff0c;会涉及部分分析和清除的方法&#xff0c;本篇文章只用于学习交流&#xff0c;为广大受害者提供清除思路 &#xff0c;请勿用于非法用途&#xff0c;产生一切后果与作者无关 详情请参考文档&#xff1a;…

js高级第四天

课程回顾&#xff1a; ​ 原型链&#xff1a;由原型构成链状结构&#xff0c;提供成员查找机制 ​ 继承&#xff1a;组合继承&#xff1a;构造函数和原型对象 ​ 属性&#xff1a;调用父构造函数的时候用call改变this指向 ​ 方法&#xff1a;父实例对象赋值给子原型对象&a…

d3.js 制作简单的俄罗斯方块

d3.js是一个不错的可视化框架&#xff0c;同时对于操作dom也是十分方便的。今天我们使用d3.js配合es6的类来制作一个童年小游戏--俄罗斯方块。话不多说先上图片。 1. js tetris类 由于方法拆分的比较细所以加上了一些备注&#xff08;这不是我的风格&#xff01;&#xff09; c…

Flask中路由系统以及蓝图的使用

一、Flask的路由系统 1.app.route()装饰器中的参数 methods:当前URL地址&#xff0c;允许访问的请求方式 app.route("/info", methods["GET", "POST"]) def student_info():stu_id int(request.args["id"])return f"Hello Old b…

js高级第五天

课程回顾&#xff1a; ​ 原型链&#xff1a;由原型构成链状结构&#xff0c;提供成员查找机制 ​ 继承&#xff1a;组合继承&#xff1a;构造函数和原型对象 ​ 属性&#xff1a;调用父构造函数的时候用call改变this指向 ​ 方法&#xff1a;父实例对象赋值给子原型对象&a…

d3.js 制作简单的贪吃蛇

d3.js是一个不错的可视化框架&#xff0c;同时对于操作dom也是十分方便的。今天我们使用d3.js配合es6的类来制作一个童年小游戏–贪吃蛇。话不多说先上图片。 1. js snaker类 class Snaker {constructor() {this._size 30;this._len 3;this._width 900;this._height 690;th…

js高级第六天

Q课程回顾&#xff1a; ​ 闭包&#xff1a;有权访问另外一个函数的局部变量的函数&#xff0c;作用&#xff1a;延伸变量使用范围 ​ mdn&#xff0c;w3c function fn1 () {var n 3;return function () {console.log(n);} }​ 递归&#xff1a;函数调用其本身 function f…

Chrome 75 lazy-loading

Chrome 75 & lazy-loading https://addyosmani.com/blog/lazy-loading/ https://chromestatus.com/feature/5645767347798016 Chrome 75 将默认启用延迟加载功能 自 Chrome 75 起&#xff0c;将原生支持图片的延迟加载&#xff0c;在代码中编写 <img loading"lazy&…

d3.js 实现烟花鲜果

今天在d3.js官网上看到了一个烟花的DEMO&#xff0c;是canvas制作的&#xff0c;于是我想用d3.js来实现它&#xff0c;js代码只有几行。好了废话不多说&#xff0c;先上图。 1 js 类 因为烟花要有下落的效果&#xff0c;所以里面用到了一些简单的数学和物理知识来模拟重力&…

阿里Sentinel控制台源码修改-对接Apollo规则持久化

改造背景 前面我们讲解了如何对接Apollo来持久化限流的规则&#xff0c;对接后可以直接通过Apollo的后台进行规则的修改&#xff0c;推送到各个客户端实时生效。 但还有一个问题就是Sentinel控制台没有对接Apollo&#xff0c;Sentinel控制台本来就可以修改限流的规则&#xff0…

Python学习(一)

一、版本&#xff1a; Python2.X /Python3.x 官方宣布2020 年 1 月 1 日&#xff0c; 停止 Python 2 的更新。 Python3.x不兼容Python2.x  二、安装&#xff08;以mac 为例&#xff09; MAC 系统一般都自带有 Python2.x版本 的环境&#xff0c;你也可以在链接 https://www.py…

jQuery—淘宝精品服饰案例

<body><div class"wrapper"><ul id"left"><li><a href"#">女靴</a></li><li><a href"#">雪地靴</a></li><li><a href"#">冬裙</a>&l…

Python机器学习实践:决策树判别汽车金融违约用户

文章发布于公号【数智物语】 &#xff08;ID&#xff1a;decision_engine&#xff09;&#xff0c;关注公号不错过每一篇干货。 转自 | 法纳斯特&#xff08;公众号ID:walker398&#xff09; 作者 | 小F 决策树呈树形结构&#xff0c;是一种基本的回归和分类方法。 决策树模型的…

jQuery—tab栏切换

<div class"tab"><div class"tab_list"><ul><li class"current">商品介绍</li><li>规格与包装</li><li>售后保障</li><li>商品评价&#xff08;50000&#xff09;</li><l…