本教程通過js物件導向的方法來封裝一個選項卡的例項,在例項中講解js的物件導向如何實現功能。
一般封裝好的選項卡程式,只需要一個div元素即可。其它元素都是通過json資料來生成,所以封裝好的選項卡例項,呼叫非常方便。先建立一個div元素,如下所示:
<div class="tab_box" class="tabContainer"></div>
本教程不過多解釋物件導向的前世今生,直接通過例項說明具體的做法。先準備好需要的json資料,等下就可以直接在例項中生成選項卡。資料程式碼如下所示:
var oData = [ { label:'html', content:'HTML稱為超文字標記語言,是一種標識性的語言。它包括一系列標籤.通過這些標籤可以將網路上的文件格式統一,使分散的Internet資源連線為一個邏輯整體。HTML文字是由HTML命令組成的描述性文字,HTML命令可以說明文字,圖形、動畫、聲音、表格、連結等。' }, { label:'css', content:'層疊樣式表(英文全稱:Cascading Style Sheets)是一種用來表現HTML(標準通用標記語言的一個應用)或XML(標準通用標記語言的一個子集)等檔案樣式的計算機語言。CSS不僅可以靜態地修飾網頁,還可以配合各種指令碼語言動態地對網頁各元素進行格式化。' }, { label:'javascript', content:'JavaScript(簡稱“JS”) 是一種具有函式優先的輕量級,解釋型或即時編譯型的程式語言。雖然它是作為開發Web頁面的指令碼語言而出名的,但是它也被用到了很多非瀏覽器環境中,JavaScript 基於原型程式設計、多正規化的動態指令碼語言,並且支援物件導向、命令式和宣告式(如函數語言程式設計)風格。' }, ];
現在可以按照慣例來分析功能,按步驟來編寫具體程式碼。
1. 建立建構函式
原生javascript例項物件,一般都是通過建構函式建立的。所以生成一個選項卡的例項物件之前,先建立一個建構函式,如下所示:
//建立選項卡建構函式,elem:DOM元素;data:生成選項卡的資料;option:選項卡物件相關選項屬性 function TabClass(elem,data){ }
2. 在建構函式中設定屬性、建立標籤和內容元素,如下所示:
function TabClass(elem,data,option){ //設定資料 this.data = data; //設定選項卡包裹 this.wrap = elem; //建立標籤包裹 this.labelBox = document.createElement('ul'); //設定標籤包裹class this.labelBox.className = 'label_box'; //建立內容包裹 this.contentBox = document.createElement('div'); //設定內容包裹class this.contentBox.className = 'content_box'; }
3. 在建構函式中設定預設選項屬性,如切換標籤的事件,預設顯示第幾個標籤等。如下所示:
function TabClass(elem,data,option=null){ /*...*/ //設定預設屬性 this.options = { //預設切換標籤是點選事件 event:'click', //預設當前標籤顯示第一個 index:0 } //修改選項屬性 if(option instanceof Object){ for(let k in option){ this.options[k] = option[k]; } } }
4. 在建構函式的原型上建立creatDataElem方法。
在creatDataElem方法中,通過json資料生成標籤和內容元素,並把所有元素放到包裹元素中。如下所示:
TabClass.prototype.creatDataElem = function(){ //宣告標籤html程式碼字串變數 var sLabel = ''; //宣告內容html程式碼字串變數 var sContent = ''; //通過迴圈資料,生成標籤和內容元素 this.data.forEach((e,i)=>{ //判斷選項中預設當前標籤和顯示內容 if(i==this.options.index){ sLabel += '<li class="active" data-index="' + i + '">' + e.label + '</li>'; sContent += '<div class="content" style="display:block">' + e.content + '</div>'; }else{ //通過資料中的label屬性生成標籤,data-index屬性是當前標籤的索引,用於切換標籤 sLabel += '<li data-index="' + i + '">' + e.label + '</li>'; //通過資料中的content屬性生成內容 sContent += '<div class="content">' + e.content + '</div>'; } }); //把標籤和內容分別放到包裹元素中 this.labelBox.innerHTML = sLabel; this.contentBox.innerHTML = sContent; //把標籤和內容放到外包元素中 this.wrap.appendChild(this.labelBox); this.wrap.appendChild(this.contentBox); }
5. 在建構函式的原型上建立init方法,用於初始化選項卡例項物件。
在init方法中,呼叫creatDataElem方法生成DOM元素;給標籤包裹元素繫結事件,用於切換標籤等。如下所示:
TabClass.prototype.init = function(){ //宣告_self變數,用於在事件函式中指向例項物件 var _self = this; //呼叫creatDataElem方法生成DOM元素 this.creatDataElem(); //在標籤上繫結事件 this.labelBox.addEventListener(this.options.event,function(event){ //獲取點選的DOM元素 var eTarget = event.target; //判斷當前點選的不是當前標籤 if(eTarget.nodeName.toLowerCase() == 'li' && eTarget.className != 'active'){ //修改當前標籤 _self.options.index = eTarget.dataset.index; //重新生成DOM元素 _self.creatDataElem(); } }); }
6. 在TabClass建構函式中呼叫this.init進行初始化,如下所示:
function TabClass(elem,data,option){ /* ... */ /* ... */ //初始化例項物件 this.init(); }
現在可以獲取外包元素,並生成選項卡例項,程式碼如下:
var eContainer = document.getElementById('tabContainer'); new TabClass(eContainer,oData);
可以根據個人喜好編寫樣式實現選項卡布局,具體效果如下所示:
封裝成物件之後,使用起來就非常方便,如果想要預設顯示第二個標籤,並繫結mouseover事件,可以新增選項,如下呼叫:
var eContainer = document.getElementById('tabContainer'); new TabClass(eContainer,oData,{index:1,event:'mouseover'});