DIY jquery plugin - tabs標(biāo)簽切換實(shí)現(xiàn)代碼
接觸jquery 2,3個(gè)月了,一直都未動(dòng)手寫(xiě)過(guò)插件。正好最近比較閑,就打算把一直看不順眼的項(xiàng)目中現(xiàn)有的tab改造一番(現(xiàn)有的tab未能做成一個(gè)控件,copy,past的代碼太多)。
想著jQuery這么強(qiáng)大的庫(kù)不可能沒(méi)有tabs插件吧,趕緊搜了一下,哈,果然!jQuery tabs!心里一陣竊喜,趕緊load下來(lái)用用吧??刹榭戳艘幌滤挠梅ǎ虐l(fā)現(xiàn)不太適用現(xiàn)有的項(xiàng)目耶,我們的tab每一個(gè)都對(duì)應(yīng)著一個(gè)完整的頁(yè)面,是用iframe嵌入的。而jQuery tabs似乎并沒(méi)有支持iframe哦。那就改造一下吧?得從頭到尾研究它的代碼吧,頭疼!還不如自己寫(xiě)一個(gè)得了,正好練練手,哈哈。說(shuō)干就干,由此便誕生了我的第一個(gè)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>首頁(yè)</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的樣式,觸發(fā)tab的事件等。默認(rèn)值如下:
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用了三個(gè)dom元素<li><a><span>, 是因?yàn)闉榱思嫒輙ab文字的任意大小,其背景用了三張圖片,我用了li呈現(xiàn)左邊的圓角圖片,a呈現(xiàn)右邊的圓角,而span則平鋪中間的背景。其實(shí)用兩個(gè)圖片也可以實(shí)現(xiàn),做一個(gè)很長(zhǎng)的有左圓角的的背景圖片和一個(gè)右圓角。但不管如何為了有圓角效果添加了這些無(wú)意義的元素,總是讓人不爽。真是希望CSS3的圓角技術(shù)和一個(gè)dom元素可設(shè)置多張背景圖能到很好的支持。
2. 此插件支持用戶自定義切換tab事件(selectHandler),以支持特殊需求,如某tab頁(yè)驗(yàn)證不通過(guò),不讓切換等。用法:
$('#tabs').tab({
tabPanel: '#tabPanel',
selectHandler: function() {
switchTab(); //the function that you defined.
}
});
3. tab插件里activeTab,selectedIndex屬性等是為了讓用戶自定義tab切換事件是能得到與tab相關(guān)的信息,可根據(jù)自己的需要擴(kuò)展。用法:
$('#tabs').each(function() {
var $tabs = this;
var currentTabId = $tabs.activeTab.attr('id');
//...
}
- mysql自動(dòng)停止 Plugin FEDERATED is disabled 的完美解決方法
- jQuery多媒體插件jQuery Media Plugin使用詳解
- Ext4.2的Ext.grid.plugin.RowExpander無(wú)法觸發(fā)事件解決辦法
- jQuery中關(guān)于ScrollableGridPlugin.js(固定表頭)插件的使用逐步解析
- JQuery制作的放大效果的popup對(duì)話框(未添加任何jquery plugin)分享
- MySql報(bào)錯(cuò)Table mysql.plugin doesn’t exist的解決方法
- 制作高質(zhì)量的JQuery Plugin 插件的方法
- LazyForm jQuery plugin 定制您的CheckBox Radio和Select
- 一步一步教你寫(xiě)一個(gè)jQuery的插件教程(Plugin)
- Maven的幾個(gè)常用plugin
相關(guān)文章
Jquery uploadify圖片上傳插件無(wú)法上傳的解決方法
很多的朋友都有遇到Jquery uploadify圖片上傳插件無(wú)法上傳的情況,下面為大家介紹下不錯(cuò)的解決方法,感興趣的朋友可以參考下2013-12-12
jQuery過(guò)濾特殊字符及JS字符串轉(zhuǎn)為數(shù)字
這篇文章主要介紹了jQuery過(guò)濾特殊字符及JS字符串轉(zhuǎn)為數(shù)字 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-05-05
jQuery EasyUI Pagination實(shí)現(xiàn)分頁(yè)的常用方法
這篇文章主要為大家詳細(xì)介紹了jQuery EasyUI Pagination實(shí)現(xiàn)分頁(yè)的常用方法,感興趣的朋友可以參考一下2016-05-05
jQuery實(shí)現(xiàn)可展開(kāi)合攏的手風(fēng)琴面板菜單
這篇文章主要介紹了jQuery實(shí)現(xiàn)可展開(kāi)合攏的手風(fēng)琴面板菜單,涉及jQuery中slideUp及slideDown方法的相關(guān)使用技巧,代碼簡(jiǎn)單實(shí)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09
jquery 無(wú)限極下拉菜單的簡(jiǎn)單實(shí)例(精簡(jiǎn)濃縮版)
下面小編就為大家?guī)?lái)一篇jquery 無(wú)限極下拉菜單的簡(jiǎn)單實(shí)例(精簡(jiǎn)濃縮版)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
JQuery點(diǎn)擊事件回到頁(yè)面頂部效果的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇JQuery點(diǎn)擊事件回到頁(yè)面頂部效果的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
基于jquery實(shí)現(xiàn)一個(gè)滾動(dòng)的分步注冊(cè)向?qū)?附源碼
使用jQuery實(shí)現(xiàn)很多很有意思的應(yīng)用效果。我們?cè)诤芏嗑W(wǎng)站注冊(cè)會(huì)員時(shí),需要填寫(xiě)注冊(cè)表單,包括登錄信息、個(gè)人聯(lián)系信息等,本文將帶您一起體驗(yàn)jQuery實(shí)現(xiàn)的一個(gè)可以滾動(dòng)的十分友好的分步注冊(cè)向?qū)?,需要的朋友可以參考?/div> 2015-08-08
jquery修改屬性值實(shí)例代碼(設(shè)置屬性值)
jQuery attr()方法用于設(shè)置/改變屬性值,下面的例子演示如何改變(設(shè)置)鏈接中 href 屬性的值2014-01-01最新評(píng)論

