DIY jquery plugin - tabs标签切换实现代码
DIY jquery plugin - tabs标签切换实现代码
发布时间:2016-12-30 来源:查字典编辑
摘要:WhyDIYjquerytab接触jquery2,3个月了,一直都未动手写过插件。正好最近比较闲,就打算把一直看不顺眼的项目中现有的tab改...

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:

DIY jquery plugin - tabs标签切换实现代码1

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');

//...

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Javascript教程学习
热门Javascript教程学习
编程开发子分类