JavaScript面向对象:面向对象案例

news2025/2/21 23:14:28

 面向对象tab 切换

功能需求:

1.点击 tab,可以切换效果.

2.点击 + , 可以添加 tab 项和内容项.

3.点击 x , 可以删除当前的tab项和内容项.

双击tab项文字或者内容项文字,可以修改里面的文字内容

基本结构

 抽象对象:  Tab 对象

1.该对象具有切换功能

2.对象具有添加功能

3.对象具有删除功能

4.对象具有修改功能

 面向对象tab 栏切换 添加功能

1.点击 + 可以实现添加新的选项卡和内容

2.第一步: 创建新的选项卡li 和 新的 内容 section

3.第二步: 把创建的两个元素追加到对应的父元素中.

4.以前的做法动态创建元素 createElement  , 但是元素里面内容较多, 需要innerHTML赋值,appendChild 追加到父元素里面.

5.现在高级做法:   利用 insertAdjacentHTML() 可以直接把字符串格式元素添加到父元素中

6.appendChild 不支持追加字符串的子元素, insertAdjacentHTML 支持追加字符串的元素

7.insertAdjacentHTML(追加的位置,‘要追加的字符串元素’) 

8.追加的位置有: beforeend  插入元素内部的最后一个子节点之后

9.该方法地址:  https://developer.mozilla.org/zh-CN/docs/Web/API/Element/insertAdjacentHTML 

 

出现这样的原因是因为,我们后面添加的小li是后添加的,而前面的获取元素是页面加载时,获取已经准备好的。解决方案就是把获取放在一个函数中,加载时调用一次,添加完成后在调动一次init()就可以了 

  面向对象tab 栏切换 删除功能

1.点击 × 可以删除当前的li选项卡和当前的section

2.X是没有索引号的, 但是它的父亲li 有索引号, 这个索引号正是我们想要的索引号

3.所以核心思路是: 点击 x 号可以删除这个索引号对应的 li section

4.但是,当我们动态删除新的li和索引号时,也需要重新获取 x 这个元素需要调用init 方法

icon-guanbi是我们要的X号 

删除功能 

面向对象tab 栏切换 编辑功能

1.双击选项li或者 section里面的文字,可以实现修改功能

2.双击事件是ondblclick

3.如果双击文字,会默认选定文字,此时需要双击禁止选中文字

4.window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();

5.核心思路双击文字的时候, 在 里面生成一个文本框, 当失去焦点或者按下回车然后把文本框输入的值给原先元素即可.

 

var that;
class Tab{
    constructor(id){
        // 获取元素
        that=this;
        this.main=document.querySelector(id);
        
        this.add=this.main.querySelector('.tabadd')
        // li 的父元素
        this.ul=this.main.querySelector('.fisrstnav ul:first-child')
        // section的父元素
        this.fsection=this.main.querySelector('.tabscon');
        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.toggleTab;
            this.remove[i].onclick=this.removeTab;
            this.spans[i].ondblclick = this.editTab;
            this.sections[i].ondblclick = this.editTab;

        }
    }
    // 获取所有的小li和section
    updateNode(){
        
        this.lis=this.main.querySelectorAll('li')
        this.sections=this.main.querySelectorAll('section');
        this.remove=this.main.querySelectorAll('.icon-guanbi')
        this.spans = this.main.querySelectorAll('.fisrstnav li span:first-child');
        
    }
    // 1.切换功能
    toggleTab(){
        // console.log(this.index);
        that.clearClass()
        this.className='liactive';
        that.sections[this.index].className='conactive'
    }
    // clearClass this指向的是that 也就是实例化对象
    clearClass(){
        for(var i=0;i<this.lis.length;i++){
        this.lis[i].className='';
        this.sections[i].className='';
        }
    }
    // 2.添加功能
    addTab(){
        that.clearClass()
        //创建li元素和section元素
        var random=Math.random();
        var li='<li class="liactive"><span>新选项卡</span><span class="iconfont icon-guanbi"></span></li>';
        var section='<section class="conactive">测试'+random+'</section>'
        // 追加父元素
        that.ul.insertAdjacentHTML('beforeend',li)
        that.fsection.insertAdjacentHTML('beforeend',section)
        that.init()
    }
    // 3.删除功能
    removeTab(e){
        e.stopPropagation();
        var index=this.parentNode.index;
        console.log(index);
        // remove()方法可以直接删除指定的元素
        that.lis[index].remove();
        that.sections[index].remove();
        that.init();
        // 当我们删除的不是选中状态的li的时候,原本的状态
        if(document.querySelector('.liactive')) return;//return了就是不执行后面的代码
        // 当我们点击了选中状态的这个li的时候,让它前一个li处于选中状态
        index--;
        // 手动调用我们点击事件,不需要鼠标触发
        that.lis[index]&&that.lis[index].click();
        that.sections[index].click();
    }
    // 4.修改功能
    editTab(){
        var str=this.innerHTML;
        // 双击禁止选中文字
        window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
        this.innerHTML='<input tpye="text"/>'
        var input=this.children[0]
        input.value=str
        input.select();//文本框里面的文字处于选定状态
        // 当我们离开文本框就把文本框里面的值给span
        input.onblur=function(){
            input.parentNode.innerHTML=this.value;
        }
         // 按下回车也可以把文本框里面的值给span
         input.onkeyup = function(e) {
            if (e.keyCode === 13) {
                // 手动调用表单失去焦点事件  不需要鼠标离开操作
                this.blur();
            }
        }
    }
}
new Tab('#tab');

 

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

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

相关文章

3、skywalking-安装(Docker-Compose方式)

1、章节简介 上一章节中&#xff0c;skywalking服务已经在vm1上部署完成此章节内容是将我们自己的服务注册到vm1上的sky中 2、集成步骤小计 2.1、上传sky客户端tar包到vm2 2.2、将项目打成jar包 2.3、编写Dockerfile文件 2.4、build镜像 2.5、查看镜像 2.6、运行镜像 2.7、浏览…

代码随想录62——额外题目【数组】:189轮转数组、724寻找数组的中心下标、922按奇偶排序数组II

文章目录1.189轮转数组1.1.题目1.2.解答2.724寻找数组的中心下标2.1.题目2.2.解答3.922按奇偶排序数组II3.1.题目3.2.解答1.189轮转数组 参考&#xff1a;代码随想录&#xff0c;189轮转数组&#xff1b;力扣题目链接 1.1.题目 1.2.解答 这道题目在字符串里其实很常见&#…

2022债市波动分析

2022债市波动分析 – 潘登同学的宏观经济分析框架 文章目录2022债市波动分析 -- 潘登同学的宏观经济分析框架波动事实波动原因人民币贬值压力811汇改前后经济稳中向好债市去杠杆债券市场的未来总结波动事实 2022年11月14日&#xff0c;反映债券价格的“中债总净价指数”单日下…

振弦采集模块使用流程

振弦采集模块使用流程 本章主要内容为 VM 模块基本工作原理以及工作参数、实时数据解释说明。 模块出厂时的默认参数值能够满足大部分振弦传感器的数据读取&#xff0c; 无特殊情况不需要修改参数。若需要修改某些参数时&#xff0c; 务必详细阅读本章内容以便参数含义。 错误…

改进粒子群算法求解电力系统经济调度问题(Matlab实现)

目录 1 相关知识点 2 Matlab完整代码实现 3 结果及可视化 1 相关知识点 这里总结一位博主的目录&#xff1a;梳理如下&#xff1a; 粒子群算法&#xff08;带约束处理&#xff09;——Python&Matlab实现 智能优化算法——粒子群算法&#xff08;Matlab实现&#xff09…

Docker概述及CentOS安装Docker

目录 一、Docker概述 Docker与虚拟机的差异 镜像和容器 Docker和DockerHub Docker架构 二、CentOS安装Docker 安装docker 卸载docker 启动docker 配置镜像加速 一、Docker概述 Docker 是一个用于开发、交付和运行应用程序的开放平台。 Docker 使您能够将应用程序与基…

国产软件厂商如何获得持久的竞争力和可持续增长?

近年来&#xff0c;美国对中国信息技术产业的制裁力度不断加大&#xff0c;华为等数百家中国高科技企业受波及而影响业务。加大自主研发力度&#xff0c;在芯片、操作系统、数据库、软件等卡脖子的关键技术领域&#xff0c;实现自主安全可控&#xff0c;成为中国信息科技产业发…

SpringMVC:拦截器+文件上传下载, 拦截器

一。比较常用&#xff08;理解思路&#xff09; 过滤器 和 拦截器 均体现了AOP的编程思想&#xff0c;都可以实现诸如日志记录、登录鉴权等功能&#xff0c;但二者的不同点也是比较多的&#xff0c;接下来一一说明。 拦截器&#xff1a;看做是多个Controller中公用的功能&…

【Linux】文件描述符

目录&#x1f308;前言&#x1f337;1、文件的概念&#x1f339;2、文件操作&#xff08;C语言&#xff09;&#x1f361;2.1、概念基本打开关闭操作&#x1f362;2.2、文件的打开方式&#x1f363;2.3、文件的读写操作&#x1f364;2.4、对系统调用的封装&#x1f338;3、系统…

python 另一种将内容写入记事本的方式

目录 问题描述&#xff1a; 方案一 &#xff08;常见的写法&#xff09;&#xff1a; 方案二&#xff1a; 问题描述&#xff1a; 如下图所示&#xff0c;欲将下图内容写入一个.txt 方案一 &#xff08;常见的写法&#xff09;&#xff1a; 使用f.write()函数&#xff0c; 如…

如何使用CompletableFuture

目录 一、CompletableFuture是什么 二、CompletableFuture用法 2.1、创建CompletableFuture 2.1.1、直接创建 2.1.2、创建一个使用指定数据作为结果的已结束的CompletableFuture 2.1.3、通过执行异步任务获取CompletableFuture 2.2、获取任务结果 2.3、消费结果 2.3.1、…

云原生技术中台 CNStack2.0 正式发布

作者&#xff1a;奥陌 11 月 5 日&#xff0c;在 2022 杭州 云栖大会上&#xff0c;云原生技术中台 CNStack2.0 正式发布。 阿里巴巴资深技术专家 谢吉宝介绍 CNStack2.0 企业在数字化转型的过程中&#xff0c;一部分问题得到了解决&#xff0c;但随着 IT 水平的不断提升&am…

【Milvus的人脸检索】

0. 介绍 在上一篇文章中&#xff0c;介绍了milvus提供的以图搜图的样例&#xff0c;这篇文章就在以图搜图样例的基础上进行修改&#xff0c;实现人脸检索。 常见的人脸任务&#xff0c;分为人脸检测、人脸识别、人脸对比和人脸检索&#xff0c;其中人脸检索的含义是&#xff…

点成分享 | 蛋白质浓度测定之考马斯亮蓝(Bradford)法

蛋白质是组成生物细胞、组织的重要成分&#xff0c;生物的所有生命活动都离不开蛋白质的参与。蛋白质是生命的物质基础&#xff0c;是构成细胞的基本有机物&#xff0c;是生命活动的主要承担者。生物材料中蛋白质含量的测定是生物学研究中最重要也是最基本的实验操作之一&#…

【微机接口】串行通信基础

计算机通信:CPU与外部的信息交换 并行通信&#xff1a;数据所有位同时被传输 串行通信&#xff1a;数据被逐位顺序传送 串行通信类型&#xff1a; 串行异步通信&#xff1a;一个字符用起始位和停止位来完成收发同步。 串行同步通信&#xff1a;采用同步字符来完成收发双方同…

营丘福稻品牌山东大米 国稻种芯·中国水稻节:淄博高青招牌

营丘福稻品牌山东大米 国稻种芯中国水稻节&#xff1a;淄博高青招牌 淄博市广播电视台新生活 大众网海报新闻记者 董玉歌 淄博报道) 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健…

【电源专题】案例:电源芯片规格书大标题写5A那是能输出5A吗?

这个案例是找到了问题点后再去审查规格书发现规格书里竟然有写明!只是最初始不是我导入的芯片就是了(其实就算是我导入的,以前也没有测试方法和手段能发现异常),而且这个芯片已经用了好久好久了,现在都停产了,买不到了。 从下图所示的规格书大标题中可以看到同步升压芯片…

苹果Mac电脑L2TP连接公司内部网络失败解决方案

苹果Mac电脑L2TP连接公司内部网络 苹果Mac系统在创建VPN连接时&#xff0c;一直提示&#xff1a;L2TP-VPN服务器没有响应。请尝试重新连接。如果仍然有问题&#xff0c;请验证你的设置并与管理员联系。 我们在添加VPN的时候需要填写机器认证中的共享秘钥&#xff0c;我这里填…

详解容灾恢复过程中跨数据中心级的关键故障切换

【摘要】容灾设计过程当中需要考虑的故障切换的场景有很多,数据中心内部的高可用切换不在本次讨论范围之内,我们讨论的是容灾恢复过程中的关键跨数据中心级的故障切换场景,从网络层到存储层都会涉及到。(文中涉及相关技术产品参数请以官网最新发布为准) 1. 容灾设计需要进…

c++异常处理

目录 1.c异常的由来 2.怎么使用异常来解决问题 3.异常安全 4.异常规范 5.异常处理的优缺点 1.c异常的由来 在c语言中&#xff0c;如果程序出现了错误&#xff0c;采用的是返回错误码的方式。最常见的&#xff1a; int main() {return 0; } 这里的return 0的0就是表示返…