跨浏览器通用、可重用的选项卡tab切换js代码


Posted in Javascript onSeptember 20, 2011

由于近来学了点js,于是我装逼道。。。不太难吧。。。就切一下display属性?同学无视我。。说要搞个通用的。。。什么还要跟ajax交互。。???我愣是没有听懂。。。到底要搞什么。。。权当作练手,我自己胡弄了一个。

需求:同学口中的通用我不知道神马意思。。。那我就按自己的理解吧。。

①跨浏览器,IE6+,FF,Chrome,Safari,Opera

②同一个页面可以用同一个js设置不同的选项卡。

说太多没啥米用,来看代码吧。
一、html部分(其实这还没啥好看的,设置了三个,前两个是一样的,通过click事件触发,最后一个通过鼠标移动触发)

<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>

特别声明,由于我是菜鸟,所以,我写的js只能在某种特定的结构下运作(真菜!),没有想到怎么搞个极致的通用机制。这个js需要怎样的结构?那就是最外层一个div容器,标题由一个ul列表表示,内容也是一个ul列表。如果不是这种格式,我写的菜鸟代码是无法运行的(菜啊。。。),要运行,就要改改其中的几行js啦。。。
二、样式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; 
}

 这貌似没什么好说的,加了些最简单的css3,凑合着(这美工好烂啊)。
三、js代码
/** 
* 事件处理通用函数 
*/ 
var EventUtil = { 
//跨浏览器取事件对象event 
getEvent : function(event){ 
return event ? event : window.event; 
}, 
//款浏览器取事件对象的目标DOM节点 
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; 
} 
} 
}; 
//设置选项卡切换方式 
tabSwitch("tab1","click"); 
tabSwitch("tab2","mouseover"); 
/** 
* 选项卡通用函数 
*/ 
// 传入参数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[i].style.display = "none"; 
if(nameList[i] == target){ 
nameList[i].className = "selected"; 
contentList[i].style.display = "block"; 
} 
} 
} 
}); 
})(); 
} 
}

就这js函数,我们展开一下吧(很不害羞啊)。。。首先定义了一些事件对象的通用函数,以应对跨浏览器时的使用。接着两行是选项卡切换的函数。一个参数是要定义为选项卡的容器的类,一个是触发切换的类型。

完了就是真正的js,思路是:定义为某个类的容器将会绑定成一个选项卡,切换的方式也可以自定义。tabSwitch("tab1","click");就是所有tab1类都绑定为选项卡,通过click事件切换。

实现切换用到了几个技术,其一,通过类选择器selectqueryAll对同一类型进行选择,为了兼容IE6、7,做了一个备用的遍历版本(非常低效);其二,使用了事件委托,在标题列表ul上绑定了触发事件。


抱怨一下,在取ul的DOM元素时,我用了name作为变量名,结果在chrome和safari绑定不了事件,这里搞了我好久啊!非常郁闷。。。

最后一提的是效果,这个东西有什么效果?就是选项卡切换(废话。。),选中的选项卡标题会添加一个类“selected”,方便设定样式。

最后的最后,我想说,还真有很多要改进的地方(当然的,你又不是pis神)。例如,涉及类添加时,类名的字符串并接保证原有类名不覆盖。例如,可以应对一下结构变换的适应能力。例如(好多问题啊)。。。

至于还有什么毛病,请各位大侠指导了(这人脸皮厚,尽管喷)。

按道理要上传demo的?点此实例下载

Javascript 相关文章推荐
某人初学javascript的时候写的学习笔记
Dec 30 Javascript
jquery的键盘事件修改代码
Feb 24 Javascript
javascript 正则表达式相关应介绍
Nov 27 Javascript
超赞的jQuery图片滑块动画特效代码汇总
Jan 25 Javascript
ArtEditor富文本编辑器增加表单提交功能
Apr 18 Javascript
微信小程序progress组件使用详解
Jan 31 Javascript
使用vux实现上拉刷新功能遇到的坑
Feb 08 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
Jun 01 Javascript
JavaScript日期工具类DateUtils定义与用法示例
Sep 03 Javascript
JS基于ES6新特性async await进行异步处理操作示例
Feb 02 Javascript
重学JS之显示强制类型转换详解
Jun 30 Javascript
Vue-Element-Admin集成自己的接口实现登录跳转
Jun 23 Vue.js
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
Sep 20 #Javascript
简单的jquery拖拽排序效果实现代码
Sep 20 #Javascript
用jQuery中的ajax分页实现代码
Sep 20 #Javascript
jquery模拟按下回车实现代码
Sep 20 #Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
Sep 19 #Javascript
50个比较实用jQuery代码段
Sep 18 #Javascript
最新的10款jQuery内容滑块插件分享
Sep 18 #Javascript
You might like
星际争霸中的对战模式介绍
2020/03/04 星际争霸
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
利用JavaScript的AngularJS库制作电子名片的方法
2015/06/18 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
Nodejs中的this详解
2016/03/26 NodeJs
JavaScript数据推送Comet技术详解
2016/04/07 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
vue-router相关基础知识及工作原理
2018/03/16 Javascript
js的对象与函数详解
2019/01/21 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
python实现博客文章爬虫示例
2014/02/26 Python
python通过yield实现数组全排列的方法
2015/03/18 Python
机器学习之KNN算法原理及Python实现方法详解
2018/07/09 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
大一自我鉴定范文
2013/12/27 职场文书
搞笑征婚广告词
2014/03/17 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
2015年办公室人员工作总结
2015/05/15 职场文书
心灵点滴观后感
2015/06/02 职场文书
学者《孟子》名人名言
2019/08/09 职场文书
深入理解redis中multi与pipeline
2021/06/02 Redis
Django框架中表单的用法
2022/06/10 Python