ES6 - 切换选项卡并实现添加、删除、修改功能

  1. 功能需求:

    • 点击 tab栏,可以切换效果
    1. 点击 + 号,可以添加 tab项和内容
    2. 点击 x 号,可以删除当前的 tab项和内容
    3. 双击 tab项文字或内容项文字,可以修改里面的文字内容
  2. 抽取对象:Tab对象

    1. 该对象具有切换功能
    2. 该对象具有添加功能
    3. 该对象具有删除功能
    4. 该对象具有修改功能
  3. 效果图:
    在这里插入图片描述

  4. 代码

  • es6
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();
        // 初始化操作,一页一加载,相关元素就绑定事件
        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;   //toggleTab 不加括号是为了实现点击标签才加载函数
                                                    //加了括号,页面一加载就会调用这个函数
            this.remove[i].onclick = this.deleteTab;
            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(){
        that.clearClass();
        this.className = 'liactive';    //这个 `this` 指向的是 lis[i]
        that.sections[this.index].className = 'conactive';
    }
    //清除样式
    clearClass(){
        for(var i = 0; i < this.lis.length; i++){
            this.lis[i].className = '';
            this.sections[i].className = '';
        }
    }
    // 2. 添加功能
    addTab(){
        that.clearClass();
        // 1. 创建 li 和 section 元素
        var li = '<li class="liactive"><span>新选项卡</span><span class="iconfont icon-guanbi"></span></li>';
        var section = '<section class="conactive">新内容区</section>'
        // 2. 把这两个元素追加到对应的父元素里面
        that.ul.insertAdjacentHTML('beforeend', li);
        that.fsection.insertAdjacentHTML('beforeend', section);
        that.init();
    }
    // 3. 删除功能
    deleteTab(e){
        //阻止冒泡事件
        e.stopPropagation();
        var index = this.parentNode.index;
        // 通过 remove() 可以直接删除指定元素
        that.lis[index].remove();
        that.sections[index].remove();
        that.init();
        // 如果我们删除的不是选定状态的 li,原来的li保持不变
        if(document.querySelector('.liactive')) return;
        //当删除选项卡后,让他前一个选项卡处于被选中状态
        index--;
        //a && b
        //如果 a 为真,则调用b
        that.lis[index] && that.lis[index].click();
    }
    // 4. 修改功能
    editTab(){
        var str = this.innerHTML;
        // 双击禁止选中文字
        window.getSelection ? window.getSelection().removeAllRanges() : document.getSelection.empty();
        this.innerHTML = '<input type="text" />' 
        var input = this.children[0];
        console.log(input);
        input.value = str;
        input.select(); //使文本框的文字处于选定状态
        // onblur事件 会在对象失去焦点的时候发生
        input.onblur = function(){
            // 失去焦点后,给父节点 span 赋值
            this.parentNode.innerHTML = this.value;
        }
        // 按下回车键也可以给父节点 span 赋值
        input.onkeyup = function(e){
            if(e.keyCode === 13){
                this.blur();    //调用失去焦点事件
            }
        }
    }
}

// 实例化一个对象,获取到最外层div元素,通过他来对其他元素执行操作
new Tab('#tab');

  • html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>面向对象 Tab</title>
    <link rel="stylesheet" href="./styles/tab.css">
    <link rel="stylesheet" href="./styles/style.css">
</head>
<body>
    <main>
        <h4>JS 面向对象 动态添加标签页</h4>
        <div class="tabsbox" id="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>
            <div class="tabscon">
                <section class="conactive">测试1</section>
                <section>测试2</section>
                <section>测试3</section>
            </div>
        </div>
    </main>
    <script src="js/tab.js"></script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值