• JavaScript面向对象tab栏增删改查操作


     

     上面是我的代码

    下面是我模仿的实例,可以自己加css变漂亮

    面向对象--tab栏切换

    功能需求:

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

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

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

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

    抽取对象:Tab对象

    1.该对象具有切换功能

    2.该对象具有添加功能

    3.该对象具有删除功能

    4.该对象具有修改功能

     增删改查

    添加功能

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

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

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

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

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

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

    删除功能

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

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

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

    编辑功能

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

    2. 双击事件是: ondblclick

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

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

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

    留意+号,和×号

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <style type="text/css">
                section{
                    display: none;
                }
                section.conactive{
                    display: block;
                }
            </style>
        </head>
        <body>
            
            <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>
            
            
            
            <script type="text/javascript">
                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');
                        this.fsection=this.main.querySelector('.tabscon');
                        this.init();
                    }
                    init(){
                        this.updateNode();
                        this.add.onclick=this.addTab;
                        // init初始化操作让相关元素绑定事件
                        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);
                        // 因为是init调用toggleTag,init在constructor中,this指向问题,所以用that;
                        that.clearClass();
                        this.className='liactive';
                        that.sections[this.index].className='conactive';
                        
                    }
                    
                    //清除所有的li和section类
                    clearClass(){
                        for(var i =0;i<this.lis.length;i++){
                            this.lis[i].className='';
                            this.sections[i].className='';
                        }
                    }
                    //2.添加功能
                    addTab(){
                        that.clearClass();
                        var random=Math.random();
                        // 创建li元素和section元素
                        var li='<li class="liactive"><span>测试3</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);  
                        
                        that.lis[index].remove();
                        that.sections[index].remove();
                        that.init();
                        
                        //如果我们删除的不是选中状态的,让li保持不变
                        if(document.querySelector('.liactive')) return;
                        
                        
                        //当我删除了选中状态的li的时候,让它的前一个li处于选定状态
                        index--;
                        //手动调用我们的点击事件
                        // &&是如果有这个实例就调用
                        that.lis[index] && that.lis[index].click();
                    }
                    //4.修改功能
                    editTab(){
                        var str=this.innerHTML;
                        //双击禁止选定文字
                        window.getSelection ? window.getSelection().removeAllRanges():document.selection.empty();
                        // alert(11)
                        this.innerHTML='<input type="text"/>'
                        var input=this.children[0];
                        input.value=str;
                        input.select();//文本框文字处于选定状态
                        //当我们离开文本框就把文本框里面的值给span
                        input.onblur=function(){
                            this.parentNode.innerHTML=this.value;
                        }
                        
                        //按下回车也可以把文本框里面的值给<span id="">
                            input.onkeyup=function(e){
                                if(e.keyCode===13){
                                    //手动调用表单失去焦点事件,不需要鼠标离开操作
                                    this.blur();
                                }
                            }
                        
                    }
                }
                
                new Tab('#tab');
            </script>
        </body>
    </html>
  • 相关阅读:
    vue init webpack projectName命令运行报错 解决方法
    DIV实际高度小于设置高度的问题
    openlayers 地图要素的多种高亮方式 Demo(可直接运行)
    加载wkt到地图 Demo (可直接运行)
    openlayers 框选地图得到选框范围(坐标)Demo(可直接运行)
    element+vue可远程搜索可懒加载的下拉框组件
    Android-使用约束布局(ConstraintLayout)构建灵活的UI【译】
    Mysql explain 执行计划详解(转)
    Managing Hierarchical Data in MySQL(邻接表模型)[转载]
    无限极分类原理与实现(转)
  • 原文地址:https://www.cnblogs.com/hechunfeng/p/15579593.html
Copyright © 2020-2023  润新知