DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> jQuery入門知識 >> JQuery特效代碼 >> DIY jquery plugin - tabs標簽切換實現代碼
DIY jquery plugin - tabs標簽切換實現代碼
編輯:JQuery特效代碼     
Why DIY jquery tab
接觸jquery 2,3個月了,一直都未動手寫過插件。正好最近比較閒,就打算把一直看不順眼的項目中現有的tab改造一番(現有的tab未能做成一個控件,copy,past的代碼太多)。
想著jQuery這麼強大的庫不可能沒有tabs插件吧,趕緊搜了一下,哈,果然!jQuery tabs!心裡一陣竊喜,趕緊load下來用用吧。可查看了一下它的用法,才發現不太適用現有的項目耶,我們的tab每一個都對應著一個完整的頁面,是用iframe嵌入的。而jQuery tabs似乎並沒有支持iframe哦。那就改造一下吧?得從頭到尾研究它的代碼吧,頭疼!還不如自己寫一個得了,正好練練手,哈哈。說干就干,由此便誕生了我的第一個jQuery插件。

Code
代碼如下:
/*
* jquery.tab
* Author: 冬日小草
* Date: 2010/12/07
*/
jQuery.fn.tab = function(options) {
var settings =
{
activeTabClass: "tab-selected",
defaultTabClass: "tab-default",
tabContainerClass: "tabContainer",
tabPanelCls: "tabPanel",
mouseoverTabClass: null,
hiddenTabClass: 'tab-hide',
tabPanel: null,
selectHandler: null,
iframeIdPrex: 'iframe_'
};

if (options) {
jQuery.extend(settings, options);
}
//#region public events
$.fn.setActiveTab = function(tabIndex) {
if (tabIndex) {
return this.each(function() {
this.setActiveTab(tabIndex);
})
}
};
$.fn.getFrameByTabId = function(tabId) {
if (tabId) {
var iframeId = settings.iframeIdPrex + tabId;
return frames[iframeId];
}
return null;
};
//#endregion public events
return this.each(function() {
var ts = this;
var $tabContainer = $(ts);
ts.activeTab = null;
ts.tabPanelId = null;
ts.selectedTab = null;
ts.selectedIndex = 0;
ts.iframeId = null;

//#region 'private' methods
this.setActiveTab = function(tabIndex) {
if (typeof (tabIndex) != "number") {
return;
}

var selectedTab = $('li:visible', $tabContainer).eq(tabIndex);
if (selectedTab.length == 0) {
return;
}
//click the active tab
if (ts.iframeId == settings.iframeIdPrex + selectedTab.attr('id')) {
return;
}
else {
if (ts.iframeId != null) {
//$(frames[activeTabId]).hide();
$("iframe").hide();
}
}
$('.' + settings.activeTabClass, $tabContainer).removeClass(settings.activeTabClass);
ts.activeTab = selectedTab;
ts.activeTab.addClass(settings.activeTabClass);
var target = ts.activeTab.attr('target');
if (typeof (target) != 'string') {
return;
}
ts.iframeId = settings.iframeIdPrex + selectedTab.attr('id');
if ($('#' + ts.iframeId).length == 0) {
var iframe = $('<iframe></iframe>');
iframe.attr('id', ts.iframeId)
.attr('src', target)
.css({ width: '100%', height: '100%' });
iframe.appendTo(settings.tabPanel);
}
else {
$('#' + ts.iframeId).show();
}
};
var initialTabs = function() {
$tabContainer.addClass(settings.tabContainerClass);
$(settings.tabPanel).addClass(settings.tabPanelCls);
var stopFloatDiv = $('<div></div>');
stopFloatDiv.css({ clear: 'both', height: '0px' })
.insertAfter($tabContainer);
$('li', $tabContainer).each(function(i) {
var $tab = $(this);
var $link = $('a', $tab);
var href = $link.attr('href');
$link.attr('href', "#");
$tab.attr('target', href)
.addClass(settings.defaultTabClass)
.click(function(e) {
ts.selectedTab = $tab;
ts.selectedIndex = i;
if (typeof (settings.selectHandler) == "function") {
settings.selectHandler();
}
else {
ts.setActiveTab(i);
}
})
});
};
//#endregion 'private' methods
initialTabs();
ts.setActiveTab(0); //set first tab active as default.
});
};

Demo
代碼如下:
html code:
<ul id="tabs">
<li id="tabBlog"><a href="blog.htm"><span>博客園</span></a></li>
<li id="tabHome"><a href="home.htm"><span>首頁</span></a></li>
<li id="tabManagement"><a href="management.htm"><span>管理</span></a></li>
</ul>
<div id="tabPanel">
</div>

javascript code:
$(window).load(function() {
$('#tabs').tab({
tabPanel: '#tabPanel'
});
})

screenshot:


Description
parameter(optional) -- 可自定義tab的樣式,觸發tab的事件等。默認值如下:
代碼如下:
var settings =
{
activeTabClass: "tab-selected", //css for active tab
defaultTabClass: "tab-default", //css for inactive tabs
tabContainerClass: "tabContainer", //css for the tab container
tabPanelCls: "tabPanel", //css for the panel that contains the iframe
mouseoverTabClass: null, //css for tab when mouse over it
hiddenTabClass: 'tab-hide', //css for the hidden tab
tabPanelId: null, //the panel id which is used for include iframe
selectHandler: null, //event handler when user switch tab
iframeIdPrex: 'iframe_' //the id prex for iframe, it's useful for getting iframe by tab id.
};

public methods -- setActiveTab(tabIndex) && getFrameByTabId(tabId)
代碼如下:
setAcitveTab: set active tab by tab index.
$('#tabs').setActiveTab(1); //set the second tab active.
getFrameByTabId: get frame for a specific tab.
$('#tabs').getFrameByTabId("tabHome"); //get the frame for home page.

others
1. 此tab用了三個dom元素<li><a><span>, 是因為為了兼容tab文字的任意大小,其背景用了三張圖片,我用了li呈現左邊的圓角圖片,a呈現右邊的圓角,而span則平鋪中間的背景。其實用兩個圖片也可以實現,做一個很長的有左圓角的的背景圖片和一個右圓角。但不管如何為了有圓角效果添加了這些無意義的元素,總是讓人不爽。真是希望CSS3的圓角技術和一個dom元素可設置多張背景圖能到很好的支持。
2. 此插件支持用戶自定義切換tab事件(selectHandler),以支持特殊需求,如某tab頁驗證不通過,不讓切換等。用法:
代碼如下:
$('#tabs').tab({
tabPanel: '#tabPanel',
selectHandler: function() {
switchTab(); //the function that you defined.
}
});

3. tab插件裡activeTab,selectedIndex屬性等是為了讓用戶自定義tab切換事件是能得到與tab相關的信息,可根據自己的需要擴展。用法:
代碼如下:
$('#tabs').each(function() {
var $tabs = this;
var currentTabId = $tabs.activeTab.attr('id');
//...
}

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved