美文网首页
2020-12-18面向对象思维tab栏切换

2020-12-18面向对象思维tab栏切换

作者: 大佬教我写程序 | 来源:发表于2020-12-18 21:20 被阅读0次

    实现效果

    SDGIF_Rusult_1.gif

    功能介绍

    1.上面tab部分双击可以输入内容,失去焦点或者回车都能将输入框里的内容添加上去
    2.点击叉号,可以删除当前小框,删除的如果是被选中的,那就自动选中被删除的前面的那一个,

    易忘知识点:

    1.解决文字禁止双击选中

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

    2.添加节点(element.insertAdjacentHTML(position, text)可以添加字符串,且可以解析字符串)
    position:

    • 'beforebegin':元素本身的前面。
    • 'afterbegin':插入元素内部的第一个子例程之前。
    • 'beforeend':插入元素内部的最后一个子例程之后。
    • 'afterend':元素本身的后面。
    var li = ' <li class="liactive"><span>测试1</span><span class="iconfont icon-guanbi"></span></li>';
                var section = '<section class="conactive">测试' + random + '</section>';
                that.ul.insertAdjacentHTML('beforeend', li);
                that.tabscon.insertAdjacentHTML('beforeend', section);
    

    3.双击事件

    element.ondblclick = function () {}
    

    4.this和that指向问题要细心

    代码部分

    HTML

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <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">
                <!-- 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 src="js/text.js"></script>
        <!-- <script src="js/tab.js"></script> -->
    
    </body>
    
    </html>
    

    javaScript部分

    var that;
    class Tab {
        //接受传过来的参数
        constructor(id) {
            that = this;
            this.main = document.querySelector(id);
            this.lis = this.main.querySelectorAll('li');
            this.sections = this.main.querySelectorAll('section');
            this.add = this.main.querySelector('.tabadd');
            this.tabscon = this.main.querySelector('.tabscon');
            this.ul = this.main.querySelector('ul');
            this.init();
        }
    
        init() {
            this.updateNode();
            this.add.onclick = this.addTab;
    
            //初始化绑定页面中原有的元素
            for (var i = 0; i < this.lis.length; i++) {
                //给每一个小li自定义一个序号index
                this.lis[i].index = i;
                this.lis[i].onclick = this.toggleTab;
                this.remove[i].onclick = this.removeTab;
                this.spans[i].ondblclick = this.edit;
                this.sections[i].ondblclick = this.edit;
    
            }
    
        }
        updateNode() {
                this.spans = this.main.querySelectorAll('.fisrstnav li span:first-child');
                this.remove = this.main.querySelectorAll('.icon-guanbi');
                this.lis = this.main.querySelectorAll('li');
                this.sections = this.main.querySelectorAll('section');
            }
            //切换
        toggleTab() {
            that.clearClass(); //此处是tab中的所有小li清除类
            //当前小li点击之后会添加一个类名liactive,取消下边框
            this.className = 'liactive';
            //下面内容部分也要对应显示
            that.sections[this.index].className = 'conactive';
        }
        clearClass() {
                for (var i = 0; i < this.lis.length; i++) {
                    this.lis[i].className = '';
                    this.sections[i].className = '';
                }
            }
            //添加
        addTab() {
                var random = Math.random();
                that.clearClass();
                var li = ' <li class="liactive"><span>测试1</span><span class="iconfont icon-guanbi"></span></li>';
                var section = '<section class="conactive">测试' + random + '</section>';
    
                //添加
                that.ul.insertAdjacentHTML('beforeend', li);
                that.tabscon.insertAdjacentHTML('beforeend', section);
                that.init(); //让刚添加的也有功能
            }
            //删除
        removeTab(e) {
                e.stopPropagation();
                var index = this.parentNode.index;
                that.lis[index].remove();
                that.sections[index].remove();
                that.updateNode();
                //不初始化一下会出问题
                that.init();
                //如果我们选删除的不是选定状态下的li,那就就不让前一个点击了
                if (document.querySelector('.liactive')) {
                    return 0;
                } else {
                    index--;
                    that.lis[index] && that.lis[index].click();
                }
                //让前一个li添加点击事件
    
            }
            //修改
        edit() {
            //双击禁止选中文字
            var str = this.innerHTML;
            window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
    
            this.innerHTML = '<input type="text">';
            var input = this.children[0];
            input.value = str;
            input.select(); //文本框里的内容处于选中状态
            //当鼠标离开文本框那就把文本框里的内容给span
            input.onblur = function() {
                    this.parentNode.innerHTML = input.value;
                }
                //利用键盘弹起事件,如果是回车键 keycode=13,那就做失去焦点通洋的操作
            input.onkeyup = function(e) {
                if (e.keyCode === 13) {
                    this.blur();
                }
            }
    
        }
    }
    new Tab('#tab');
    

    相关文章

      网友评论

          本文标题:2020-12-18面向对象思维tab栏切换

          本文链接:https://www.haomeiwen.com/subject/mlvfnktx.html