基于JavaScript实现通用tab选项卡(通用性强)


Posted in Javascript onJanuary 07, 2016

选项卡在大量的网站都有应用,虽然形式各有不同,但是索要达成的目的都是一样的,一般都是为了进行分类或者节省网页空间只用,算是一件利器,下面就是一个选项卡的代码实例,通用性很强,下面就和大家分享一下。

代码实例如下:

<!DOCTYPE html>
<html>
<head>
<meta charset=" utf-8">
<meta name="author" content="https://3water.com/" />
<title>js实现的可以通用的选项卡代码实例</title>
<style type="text/css">
body {text-align:center;}
.tab1, .tab2 
{
width:350px;
margin:0 5px;
background:#CC9933;
opacity:0.5;
border-radius:5px 5px 5px 5px;
box-shadow:#CCC 4px 4px 4px;
text-align:left;
float:left;
display:inline;
}
.name 
{
list-style:none;
overflow:hidden;
}
.name li 
{
width:90px;
font:bold 16px/30px Verdana, Geneva, sans-serif;
background:#669900;
text-align:center;
border-radius:5px 5px 5px;
margin-right:5px;
float:left;
display:inline;
cursor:pointer;
}
li.selected{background:#FF9900;}
.content li 
{
height:500px;
display:none;
}
</style>
<script type="text/javascript">
/** 
* 事件处理通用函数
*/
var EventUtil={
getEvent:function(event)
{
return event ? event : window.event;
},
getTarget:function(event)
{
return event.target||event.srcElement;
},
addHandler:function(element,type,handler)
{
if(element.addEventListener)
{
element.addEventListener(type,handler,false);
}
else if(element.attachEvent)
{
element.attachEvent("on"+type,handler);
}
else
{
element["on"+type] = handler;
} 
}
};
/**
* 选项卡通用函数
*/
// 传入参数inClassName设定为绑定的选项卡类名,参数triggerType设定为触发切换的类型
function tabSwitch(inClassName,triggerType){
//取得全部选项卡区域
if(document.querySelectorAll)
{
var tabs=document.querySelectorAll("."+inClassName);
}
else
{
var divs=document.getElementsByTagName("div");
var tabs = new Array();
for(var k=0,lenDiv=divs.length;k<lenDiv;k++)
{
if(divs[k].className.indexOf(inClassName)>-1)
{
tabs.push(divs[k]);
}
}
}
//为每个选项卡建立切换功能
for(var j=0,len=tabs.length; j<len; j++)
{
//获取标题和内容列表
var tab = tabs[j];
//使用私有作用域为每个选项卡建立切换
(function(){
var nameUl = tab.getElementsByTagName("ul")[0];
var content = tab.getElementsByTagName("ul")[1];
//初始化选项卡
nameUl.getElementsByTagName("li")[0].className = "selected";
content.getElementsByTagName("li")[0].style.display = "block";
//添加事件委托
EventUtil.addHandler(nameUl,triggerType,function(event)
{
//获取事件对象
event = EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);
//选项卡切换
if(target.nodeName.toLowerCase() == "li")
{
//分别取得标题列表项和内容列表项
var nameList = nameUl.getElementsByTagName("li");
var contentList = content.getElementsByTagName("li");
//标题添加selected类,并显示内容
for(var i=0,len=nameList.length; i<len; i++)
{
nameList[i].className = "";
contentList.style.display = "none";
if(nameList == target)
{
nameList.className = "selected";
contentList.style.display = "block";
}
}
}
});
})();
}
}
window.onload=function()
{
//设置选项卡切换方式
tabSwitch("tab1","click");
tabSwitch("tab2","mouseover");
}
</script>
</head>
<body>
<div class="tab1">
<ul class="name">
<li>项目一</li>
<li>项目二</li>
<li>项目三</li>
</ul>
<ul class="content">
<li>类为<em>"tab1"</em>项目一内容,通过<em>"click"</em>触发</li>
<li>类为<em>"tab1"</em>项目二内容,通过<em>"click"</em>触发</li>
<li>类为<em>"tab1"</em>项目三内容,通过<em>"click"</em>触发</li>
</ul>
</div>
<div class="tab1">
<ul class="name">
<li>项目一</li>
<li>项目二</li>
<li>项目三</li>
</ul>
<ul class="content">
<li>类为<em>"tab1"</em>项目一内容,通过<em>"click"</em>触发</li>
<li>类为<em>"tab1"</em>项目二内容,通过<em>"click"</em>触发</li>
<li>类为<em>"tab1"</em>项目三内容,通过<em>"click"</em>触发</li>
</ul>
</div>
<div class="tab2">
<ul class="name">
<li>项目一</li>
<li>项目二</li>
<li>项目三</li>
</ul>
<ul class="content">
<li>类为<em>"tab2"</em>项目一内容,通过<em>"mouseover"</em>触发</li>
<li>类为<em>"tab2"</em>项目二内容,通过<em>"mouseover"</em>触发</li>
<li>类为<em>"tab2"</em>"项目三内容,通过<em>"mouseover"</em>触发</li>
</ul>
</div>
</body>
</html>

以上代码实现了选项卡的功能,下面就简单介绍一下实现过程。

一.实现原理:

看上去代码一大堆,其实原理非常的简单,咱们这里只简单的介绍一下原理,具体可以参阅代码注释依靠自己的思考。在默认状态选项卡的标题是显示的,并且第一个标题并赋予指定的样式类,选项卡内容只有第一个是显示的,其他的都出于隐藏状态,这样就实现了,默认状态下第一个被选中的效果。每一个选项卡标题都会被注册指定的事件处理函数,当进行点击或者划过操作时候,能够实现相应的切换,主要是通过遍历实现的,这里不多介绍了,参阅代码注释吧。

二.代码注释:

1.var EventUtil={},声明了一个对象直接量,它的内部实现了获取事件对象,事件源对象和事件处理函数绑定的操作,并且兼容了各大浏览器。
2. getEvent:function(event){return event ? event : window.event;},获取事件对象,兼容各大浏览器。
3.getTarget:function(event){return event.target||event.srcElement;},获取事件源对象,兼容各大浏览器。
4.addHandler:function(element,type,handler){},注册事件处理函数兼容各大浏览器。
5.function tabSwitch(inClassName,triggerType){},此函数可以为指定的对象注册指定事件处理函数,具有两个参数,第一个参数是样式类名称,用来获取具有此类名的对象,第二个是事件类型。
6.if(document.querySelectorAll),用来判断浏览器是否支持querySelectorAll函数。
7.var tabs=document.querySelectorAll("."+inClassName),如果支持则获取具有指定类名称的对象。
8.var divs=document.getElementsByTagName("div"),获取div对象集合。
9.var tabs=new Array(),创建一个数组,用语存储具有指定样式类的div对象。
10.for(var k=0,lenDiv=divs.length;k<lenDiv;k++),遍历获取的div对象集合。
11.if(divs[k].className.indexOf(inClassName)>-1),如果div的样式类名称含有指定的样式类名称。
12. tabs.push(divs[k]),将此div存入数组。
13.for(var j=0,len=tabs.length;j<len;j++),遍历存有div的数组,在本例中也就是class属性值为tab1和tab2的div。
14.var tab=tabs[j],将一个div对象的引用赋值给tab。
15.(function(){})(),声明一个匿名函数,并执行。
16.var nameUl=tab.getElementsByTagName("ul")[0],获取ul集合中的第一个,也就是选项卡的标题部分。
17.var content=tab.getElementsByTagName("ul")[1],获取选项卡的内容部分。
18.nameUl.getElementsByTagName("li")[0].className="selected",将选项卡标题部分的第一个标题的样式class值设置为selected。
19.content.getElementsByTagName("li")[0].style.display="block",将选项卡内容部分的第一个设置为显示。
20.EventUtil.addHandler(nameUl,triggerType,function(event){}),此函数是实现选项卡的核心部分,具有三个参数,第一个参数是标题部分的ul对象,第二个是事件类型,第三个函数是要被注册的事件处理函数。
21.var event=EventUtil.getEvent(event),获取事件对象。
22.var target=EventUtil.getTarget(event),获取事件源对象。
23.if(target.nodeName.toLowerCase()=="li"),判断事件源对象的标签名称是否是li。
24.var nameList=nameUl.getElementsByTagName("li"),获取选项卡标题部分li元素集合。
25.var contentList=content.getElementsByTagName("li"),获取选项卡内容部分li元素结合。
26.for(var i=0,len=nameList.length;i<len;i++),遍历li元素集合。
27.nameList.className="",将每一个标题li元素样式类清除。
28.contentList.style.display="none",将每一个选项卡内容部分的li隐藏。
29.if(nameList==target),如果指定索引的标题li就是为事件源对象,也就是说鼠标当前点击的li或者鼠标滑过的li。
30.nameList.className="selected",那么就为它添加指定的样式类。
31.contentList.style.display="block",将对应索引的内容li显示。

以上内容介绍的还算比较详细,有代码,有注释,希望对大家学习js实现选项卡相关知识有所帮助。

Javascript 相关文章推荐
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
Oct 20 Javascript
js动态加载以及确定加载完成的代码
Jul 31 Javascript
Jquery异步请求数据实例代码
Dec 28 Javascript
jQuery Ajax异步处理Json数据详解
Nov 05 Javascript
angular.element方法汇总
Jan 07 Javascript
理解js对象继承的N种模式
Jan 25 Javascript
javaScript+turn.js实现图书翻页效果实例代码
Feb 16 Javascript
AngularJs 延时器、计时器实例代码
Sep 16 Javascript
基于vue cli重构多页面脚手架过程详解
Jan 23 Javascript
vuex操作state对象的实例代码
Apr 25 Javascript
JavaScript在web自动化测试中的作用示例详解
Aug 25 Javascript
vue props 单项数据流实例分享
Feb 16 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
Jan 07 #Javascript
JavaScript设计模式初探
Jan 07 #Javascript
JavaScript类型系统之Object详解
Jan 07 #Javascript
7个去伪存真的JavaScript面试题
Jan 07 #Javascript
jQuery表格插件datatables用法详解
Nov 23 #Javascript
详解JavaScript UTC时间转换方法
Jan 07 #Javascript
jQuery formValidator表单验证
Jan 07 #Javascript
You might like
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
use jscript List Installed Software
2007/06/11 Javascript
JS控制输入框内字符串长度
2014/05/21 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
JS解决IOS中拍照图片预览旋转90度BUG的问题
2017/09/13 Javascript
原生JS控制多个滚动条同步跟随滚动效果
2017/12/22 Javascript
详解vscode中vue代码颜色插件
2018/10/11 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
Openlayers3实现车辆轨迹回放功能
2020/09/29 Javascript
Python自动重试HTTP连接装饰器
2015/04/28 Python
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
用python处理图片之打开\显示\保存图像的方法
2018/05/04 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
python使用paramiko实现ssh的功能详解
2020/03/06 Python
python三引号如何输入
2020/07/06 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
奥兰多迪士尼门票折扣:Undercover Tourist
2018/07/09 全球购物
Tostadora意大利:定制T恤
2019/04/08 全球购物
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
园林设计师自荐信
2013/11/18 职场文书
农救科工作职责
2013/11/27 职场文书
图书室标语
2014/06/21 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
《春酒》教学反思
2016/02/22 职场文书
Java设计模式之代理模式
2022/04/22 Java/Android