1. 程式人生 > >ES6學習筆記(三):教你用js面向物件思維來實現 tab欄增刪改查功能

ES6學習筆記(三):教你用js面向物件思維來實現 tab欄增刪改查功能

前兩篇文章主要介紹了類和物件、類的繼承,如果想了解更多理論請查閱《ES6學習筆記(一):輕鬆搞懂面向物件程式設計、類和物件》、《ES6學習筆記(二):教你玩轉類的繼承和類的物件》,今天主要來分享關於如何用js面向物件的思維來實現tab欄的一些相關的功能。

要實現的功能分析

  1. 點選tab欄可以切換效果
  2. 點選+號,可以新增tab項和內容項
  3. 點選X號,可以刪除當前的tab項和內容項
  4. 點選tab文字或者內容項文字,可以修改裡面的字型內容

抽像物件: Tab物件 (增刪改查功能)
實現功能效果如下圖:

首先建立一個class 類Tab:

let that
class Tab {
  constructor(id) {
    that=this
    // 獲取元素
    this.main = document.getElementById('tab')
    //獲取li的父元素
    this.ul = this.main.querySelector('.firstnav ul:first-child')
    // 獲取section的父元素
    this.fSection = this.main.querySelector('.tabscon')
    this.add = this.main.querySelector('.tabadd')
    this.remove = this.main.querySelectorAll('i')
    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.togggleTab
      this.remove[i].onclick = this.removeTab
      this.spans[i].ondblclick = this.editTab
      this.sections[i].ondblclick = this.editTab
    }

  }
  //我們動態新增元素,刪除元素時,需要從新獲取對應的元素
  updateNode() {
    this.lis = this.main.querySelectorAll('li')
    this.sections = this.main.querySelectorAll('section')
    this.remove = this.main.querySelectorAll('i') 
    this.spans = this.main.querySelectorAll('span')
  }
  //切換功能
  togggleTab() {}
  //清除li和section的class,主要實現切換功能用
  clearClass() {
    for(var i = 0; i< this.lis.length; i++) {
      this.lis[i].className = ''
      this.sections[i].className = ''
    }
  }
  //新增功能
  addTab() {}
  //刪除功能
  removeTab(e) {}
  // 修改功能
  editTab() {}
}
let tab = new Tab('#tab')

切換功能

  1. 點選上面的tab標題實現切換功能,下面對應的section也顯示,其他的隱藏
  2. 實現思路,先去掉已有的選中class,
  3. 根據li的索引值,找到要顯示的section,新增對應的class,使其顯示

實現的主要程式碼是:

that.clearClass()
this.className='liactive'
that.sections[this.index].className='conactive'

新增功能實現

  1. 點選+ 可以實現新增新的選項卡和內容
  2. 第一步:建立新的選項卡li和新的內容section
  3. 第二步: 把建立的兩個元素追加到對應的父元素中
  4. 以前的做法:動態建立元素createElement,但是元素裡面內容較多,需要innerHTML賦值在appendChild追加到父元素裡面
  5. 現在高階做法,利用insertAdjacentHTML()可以直接把字串格式元素新增到父元素中,appendChild不支援追加字串的子元素,insertAdjacentHTML支援追加字串的元素

實現功能的主要程式碼是:

    //建立li元素和section元素
    that.clearClass()
    let li = ' <li class="liactive" ><span>新選項卡</span><i>X</i></li>'
    let section = '<section class="conactive">新內容區</setion>'
    that.ul.insertAdjacentHTML('beforeend', li)
    that.fSection.insertAdjacentHTML('beforeend',section)
    that.init()

刪除功能

  1. 點選X可以刪除當前的選項卡和當前的section
  2. X是沒有索引號的,但是它的父元素li有索引號,這個索引號正是我們想要的索引號
  3. 所以核心思路就是:點選x號可以刪除這個索引號對應的li和section

實現功能的主要程式碼是:

 e.stopPropagation();//阻止冒泡,
    let index = this.parentNode.index
    //根據索引號刪除對應的li 和section
    that.lis[index].remove()
    that.sections[index].remove()
    that.init()
    //當我們刪除的不是選中狀態的元素時,原來的選中狀態保持不變
    if(document.querySelector('.liactive')) return
    //當我們刪除 了選中狀態的生活,讓它前一個li處於選中狀態
    index--
    //手動呼叫click事件,不需要滑鼠觸發
    that.li[index] && that.lis[index].click()

編輯功能

  1. 雙擊選項卡li或者section裡面的文字,可以實現修改功能
  2. 雙擊事件是:ondblclick
  3. 如果雙擊文字,會預設選定文字,此時需要雙擊禁止選中文字
  4. window.getSelection?window.getSelection().removeAllRanges():document.selection.empty()
  5. 核心思路:雙擊文字的時候,在裡面生成一個文字框,當失去焦點或者按下回車然後把文字輸入的值給原先元素即可

實現功能的主要程式碼是:

let str = this.innerHTML
    //雙擊禁止選定文字
    window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty()
    this.innerHTML ='<input type="text" value="'+ str +'"/>'
    let input = this.children[0]
    //文字框裡面的文字處於選中狀態
    input.select() 
    //當滑鼠離開文字框就把文字框的值給span
    input.onblur = function() {
      this.parentNode.innerHTML=input.value

    }
    // 按回車鍵也餓可以把文字框裡的值給span
    input.onkeyup = function(e) {
      if(e.keyCode === 13) {
        this.blur()
      }
    }

總結

這篇文章主要是通過我學習的技術總結後來分享瞭如何用面向物件的思路方法來實現tab欄的切換、編輯、增加、刪除功能。用到了很多ES6的一些語法。
案例原始碼地址:https://github.com/qiuqiulanfeng/