[JavaScript][JQuery]設計自己的JavaScript元件(TabControl)

  • 3122
  • 0

摘要:[JavaScript][JQuery]設計自己的JavaScript元件(TabControl)

前一陣子主管要求我寫MVC的View時,讓我做一些畫面的設計;我也不知道為什麼就自己寫了一個簡單的UI,寫了這個元件之後
讓我對於JQuery的lib有更深刻的體會,了解到那些部份為何要如此設計,如何讓使用者更方便直覺,所以把這份體會寫成一個小
小筆記,莫忘初衷XD...

P.S其實還有很多地方可以寫更便捷,等那天有空再來調整或是那位大哥跟我指點一二 XD...

 
目標程式
tabcontrol.js  ==>js元件
tabcontrol.css ==>css樣式
XXX.html ==>要鑲嵌的Code
 

// tabcontrol.js --------------------------------------------------------------------------------

//按鈕事件
var localButtonFireListener = new Object();
//現在tab名稱
var currentpage = "";
// 預設顯示第一個 Tab
var _showTab = 0;
//切換tab的Url
var _clickTab = "";
//切換權限字串
var ls_changeSeq = new Array();
//現在tab的index
var currentpageIndex = 0;
var pages = new Array();
//訊息
var showMsg = "尚有其它步驟尚未完成,請先完成其它步驟內容!";
//$(function ()
function TabControl()
{
        var $defaultLi = $('ul.tabs li').eq(_showTab).addClass('active');
        $($defaultLi.find('a').attr('href')).siblings().hide();
        
        //init 將頁面順序寫入陣列
        init();
        
        // 當 li 頁籤被點擊時...
        // 若要改成滑鼠移到 li 頁籤就切換時, 把 click 改成 mouseover
        $('ul.tabs li').click(function () {
            // 找出 li 中的超連結 href(#id)
            var $this = $(this),
            _clickTab = $this.find('a').attr('href');
            // 把目前點擊到的 li 頁籤加上 .active
            // 並把兄弟元素中有 .active 的都移除 class
 
            var value = localButtonFireListener.whatButtonFireEvent(_clickTab);
            if (!value) {
                return false;
            }
 
            //檢查是否可以切換頁面
            var IsChangeOK = IsChangeAble(currentpage, _clickTab);
            if (!IsChangeOK) {
                alert(showMsg);
                return false;
            }
 
            currentpage = _clickTab;
            $this.addClass('active').siblings('.active').removeClass('active');
            // 淡入相對應的內容並隱藏兄弟元素
            $(_clickTab).stop(false, true).fadeIn().siblings().hide();
 
            return false;
        }).find('a').focus(function () {
            this.blur();
        });
}
 
function init() {
    pages = new Array();
    var $defaultLi = $('ul.tabs li');
    try
    {
        for (i = 0; i < $defaultLi.length; i++) {
            var str = $($defaultLi[i].innerHTML.toString()).attr('href');
            pages.push(str);
        }
    }
    catch (e) {
        var x = e.toString();
    }
}
 
function getCurrentPage() {
    return currentpage.toString();
}
 
//頁面切換順序放入陣列
function changeSeq(Seq) {
    ls_changeSeq = Seq.toString().split(';');
    var x = 1;
}
 
//取得目前頁面index
function getPageIndex(pagename) {
    var index=0; 
    for (i = 0; i < pages.length; i++)
        if (pages[i] == pagename)
            index = i;
    return index;
}
 
//回傳陣列
function NextEnablePageIndex(NowPageIndex) {
    return ls_changeSeq[NowPageIndex].split(',');
}
 
function IsChangeAble(NowPageName, NextPageName) {
    if (pages.length == 0 | ls_changeSeq.length==0) //沒設定順序就全部都可以隨意切換
        return true;
    
    var NowPageIndex = getPageIndex(NowPageName);
    var NextPageIndex=getPageIndex(NextPageName);
    var ls_NextPageEnable = NextEnablePageIndex(NowPageIndex);
    for (i = 0; i < ls_NextPageEnable.length; i++)
        if (ls_NextPageEnable[i].toString() == NextPageIndex)
            return true;
    return false;
}
 
localButtonFireListener.whatButtonFireEvent = function (buttonName) {
   // do nothing,for override.
}
 
localButtonFireListener.init = function () {
   // do nothing,for override.
};
 
//強制切換頁面
function switchpage(page) {
    var link = $('ul.tabs li');
    for (i = 0; i < link.length; i++) {
        var href = link[i].textContent;
        if (page==href)
            link[i].click();
    }
}
 

//tabcontrol.css---------------------- 設定tab的css有興趣可以自己加美工

<style>
    div.tab_container
    {
        width: 1000px;
    }
</style>
 
 

// 使用方法如下----------------------------------------

// 其中只有  TabControl() 一定要下,其他的不一定要下,依需求設定

//Step1: include tabcontrol.js 和 tabcontrol.css

//Step2: 在$(document).ready裡initial下面的設定

 
  _showTab = 0;
  currentpage = "#tab1";
  //設定頁面切換權限 ex '1;0,2;0' ==> tab[0] 可以開tab[1] ;tab[1] 可以開tab[0]和 tab[2];tab[2] 可以開tab[0]
  var Seq='1;0,2;0';
  changeSeq(Seq);
  showMsg = "尚有其它步驟尚未完成,請先完成其它步驟內容!";
  //載入TabControl原件
   TabControl();
 
         <div id="Jtab" class="abgne_tab">
            <ul class="tabs">
                    <li><a href="#tab1">tab1</a></li>
                    <li><a href="#tab2">tab2</a></li>
                    <li><a href="#tab3">tab3</a></li>
            </ul>
           <div class="tab_container">
                 <div id="tab1" class="tab_content">
                        <h1>tab1</h1>
                        <div>
                         
                        </div>
                 </div>
           </div> 
        </div> 
 
P.S 目前是以JQuery Selector做選取所以class不可以隨意設定,有空再改成跟JQuery UI一樣類似 $("tabs").TabControl(),
目前html一定要這樣設定,哈哈!一個小小的簡單範例跟大家分享!