//------------- PS_DOM 功能函数 start----------------
var PS_DOM ={
indexOf: function(arr, e){
for(var i= 0; i<arr.length; i++){
if(arr[i]===e) return i;
}
return -1;
},
addClass: function(o,cls){
var arrCls = o.className.split(" ");
if( this.indexOf(arrCls,cls)==-1) {arrCls.push(cls); o.className =arrCls.join(" ").replace(/(^\s*|\s*$)/g,"");}
},
removeClass: function(o, cls){
var arrCls = o.className.split(" "),i;
if( (i=this.indexOf(arrCls,cls))!== -1){
arrCls[i]="";
o.className = arrCls.join(" ");
}
},
hasClass: function(o,cls){
var arrCls = o.className.split(" ");
return (this.indexOf(arrCls,cls)==-1) ? false : true;
},
$byClass: function(clsName,root,tag){
if(root){
if(typeof root=='string') root=document.getElementById(root);
}else{
root=document.body;
}

tag=tag||'*';
var arr=[],eles;
eles=root.getElementsByTagName(tag);

for(var i=0,n=eles.length;i<n;i++){
if(this.hasClass(eles[i], clsName)) arr.push(eles[i]);
}

return arr;
}
};
//------------- PS_DOM 功能函数 end ----------------

//--------------------- Tab类 start ------------------
function Tab(config){
this.root=config.root;
this.active_class=config.active_class;
var trigger=config.trigger?config.trigger:'click';
var tabCls = config.tabCls || 'tab-menu',
tabConCls = config.tabConCls || 'tab-content',
tabTag = config.tabTag || '*',
tabConTag = config.tabConTag || '*';

//获得tab_menus tab_contents
this.tab_menus=PS_DOM.$byClass(tabCls,this.root, tabTag);
this.tab_contents=PS_DOM.$byClass(tabConCls,this.root, tabConTag);
var len=this.tab_menus.length;
var menu_active=config.menu_active;

//若指定了默认激活的选项卡 则激活之
if(menu_active>1 && menu_active<=len){
this.activeMenu(menu_active-1); //index=menu_active-1
this.menu_active_index=menu_active-1;
}else{
this.menu_active_index=0;
}
var that=this;
//循环遍历 设置 tab-menu _index属性 和 点击事件监听器
for(var j=0;j<len;j++){
this.tab_menus[j]._index=j;
this.tab_menus[j]['on'+trigger]=(function(k){return function(){that.activeMenu(k)};})(j);}

}

Tab.prototype={
activeMenu:function(index){
for(var m=0;m<this.tab_menus.length;m++){
if(m!=index && PS_DOM.hasClass(this.tab_menus[m],this.active_class[0])){
PS_DOM.removeClass(this.tab_menus[m],this.active_class[0]);
PS_DOM.removeClass(this.tab_contents[m],this.active_class[1]);
}

if(index==m && (! PS_DOM.hasClass(this.tab_menus[m],this.active_class[0]) ) ){
PS_DOM.addClass(this.tab_menus[m],this.active_class[0]);
PS_DOM.addClass(this.tab_contents[m],this.active_class[1]);
}
}
}
};

// 调用示例:var mytab=new Tab({root:$id('mytab'),tabCls:'tab', tabConCls:'con', tabTag:'a', tabConTag:'div', trigger:'click',menu_active:1,active_class:['tab_menu_active','tab_content_active']});

//-----------------------------------------------------  jQuery版本的Tab -----------------------------

function Tab(config){
var tabDiv = config.tabDivSelector || 'mytab',
tabCls = config.tabCls || 'tab',
conCls = config.conCls || 'con',
activeCls = config.activeCls || 'on';
trigger = config.trigger || 'click';

var tabs = $('.' +tabCls, tabDiv).eq(0).siblings('.'+tabCls).andSelf(),  // ~~~当tabCon内再嵌套一个 选项卡 则会有问题,这里修正一下
cons = $('.'+conCls, tabDiv).eq(0).siblings('.'+conCls).andSelf();
//定义事件处理函数
tabs.bind(trigger,function(){
var clkIdx = $('.' +tabCls, tabDiv).index(this);
$(this).addClass(activeCls).siblings().removeClass(activeCls);
cons.eq(clkIdx).addClass(activeCls).siblings().removeClass(activeCls);
});
}
$.extend({'Tab':Tab});

$.Tab({tabDiv:'#tabDiv', tabCls:'tab', conCls:'tabCon',activeCls:'on'});

自己写的一个简单的Tab类的更多相关文章

  1. 用PHP写的一个简单的分页类 1.0版

    <?php /* 分页类 用于实现对多条数据分页显示 version:1.0 author:Knight E-Mail:S.Knight.Work@gmail.com Date:2013-10- ...

  2. 用PHP写的一个简单的分页类 2.0版

    <?php /* 分页类 用于实现对多条数据分页显示 version:2.0 //基于1.0 数据库查询用mysqli实现 author:Knight E-Mail:S.Knight.Work@ ...

  3. 只是一个用EF写的一个简单的分页方法而已

    只是一个用EF写的一个简单的分页方法而已 慢慢的写吧.比如,第一步,先把所有数据查询出来吧. //第一步. public IQueryable<UserInfo> LoadPagesFor ...

  4. Python之自定义封装一个简单的Log类

    参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...

  5. 写了一个简单可用的IOC

    根据<架构探险从零开始写javaweb框架>内容写的一个简单的 IOC 学习记录    只说明了主要的类,从上到下执行的流程,需要分清主次,无法每个类都说明,只是把整个主线流程说清楚,避免 ...

  6. 写了一个简单的 Mybatis

    写了一个简单的 Mybatis,取名 SimpleMybatis . 具备增删改查的基本功能,后续还要添加剩下的基本数据类型和Java集合类型的处理. 脑图中有完整的源码和测试的地址 http://n ...

  7. VC++ 一个简单的Log类

    在软件开发中,为程序建立Log日志是很必要的,它可以记录程序运行的状态以及出错信息,方便维护和调试. 下面实现了一个简单的Log类,使用非常简单,仅供参考. // CLogHelper.h : hea ...

  8. 写了一个简单的CGI Server

    之前看过一些开源程序的源码,也略微知道些Apache的CGI处理程序架构,于是用了一周时间,用C写了一个简单的CGI Server,代码算上头文件,一共1200行左右,难度中等偏上,小伙伴可以仔细看看 ...

  9. python+selenium之自定义封装一个简单的Log类

    python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...

随机推荐

  1. Matlab单元(Cell)数据的应用

    MATLAB里面的cell有的翻译为单元有的翻译为细胞型数据.它是MATLAB的一种特殊数据类型,可以将它看作是一种无所不包的广义矩阵.组成cell的元素可以是任何一种数据类型的常数或者常量,每一个元 ...

  2. Python BeautifulSoup4 使用指南

    前言: 昨天把传说中的BeautifulSoup4装上了,还没有装好的童鞋,请看本人的上一篇博客: Python3 Win7安装 BeautifulSoup,依照里面简单的步骤就能够把Beautifu ...

  3. externkeyword放到函数体内而导致的linkage问题

    不少人都知道,C/C++语言编程时,假设要引用在别的C/C++文件里定义的变量或函数,必须extern一下,才干使用 另一些人知道,这个extern事实上能够放在函数体内声明,这么做的理由是不想让其它 ...

  4. IronJs 无相关源?

    在工作中用到了IronJs  一切正常 就是 在启动项目的时候 报错说无相关源,将取消引用之后 就可以正常运行 如果不取消引用需要重新启动~ 是这个样子滴~ 说明: 在编译向该请求提供服务所需资源的过 ...

  5. Windows Server 2012 R2 服务器管理器介绍和配置使用

    1. 服务管理器是用于管理系统服务的管理工具.一般常用于windows系统,使用这个工具你可以启动.停止服务:设置服务是自动.手动启动或禁用:查看某个服务的相关信息:设置服务以什么用户启动等等(一般包 ...

  6. 关于MATLAB中any和all的个人理解

    any: any=1,有一个元素是1,即可: any=0,全部元素为0,即可. all: all=1,全部元素是1,即可: all=0,有一个元素是0,即可. ALL True if all elem ...

  7. jsp中的两种跳转方式分别是?有什么区别?

    在JSP中跳转有两种方式 forward跳转:<jsp:forward page ="跳转页面地址"> response跳转:response.sendRedirect ...

  8. java代理课程测试 spring AOP代理简单测试

    jjava加强课程测试代码 反射. 代理 .泛型.beanUtils等 项目源码下载:http://download.csdn.net/detail/liangrui1988/6568169 热身运动 ...

  9. python自定义排序函数

    Python内置的 sorted()函数可对list进行排序: >>>sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36] 但 sorted() ...

  10. 高质量程序设计指南C/C++语言——C++/C程序设计入门(2)

    *标准C规定,编译器只取前31个字符作为有效的标识符,而标准C++则取前255个字符作为有效的标识符. *把具有特殊含义的字符输出到终端上,尤其是当它们出现在普通字符串或格式控制字符串中时,一般来说有 ...