博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

结构/表现/行为完全分离的选项卡(jQ版和原生JS版)

Posted on 2010-10-12 19:57  linFen  阅读(948)  评论(0编辑  收藏  举报

结构/表现/行为完全分离的选项卡(jQ版和原生JS版)

日常项目中常用到的,用jQuery和原生JS分别写了一个. 两种写法均实现了结构/表现/行为的完全分离.当然,稍作修改,可以在同一个页面中应用于多个选项卡.
关于思路,和常规选项卡思路一样.点击选项菜单,突出显示,并显示对应的选项.本文实例中主要是通过判断点击菜单在菜单列表中的索引位置来显示或隐藏选项区.原生js还有很多种实现方法(蓝色理想中搜索),为了与jQ版思路保持一致,本文实例用的是循环判断. 详见注释.
另有几点说明:
1. 通过本文DEMO演示,可以很明显的看到原生JS的window.onload=function(){…}与jQuery的$(document).ready(function(){…});的区别,这也是我为什么不用样式定义初始状态下隐藏第二三个显示区的原因;
2. 本文只是选项卡一个原型实现,若要用于同一页面多个选项卡,变量已集中到函数头部,可自行封装成函数;
3. 请不要问如何实现更酷很炫的效果,请自已思考添加效果;
4. 不希望大家用这个效果时只是机械的复制粘贴,思考加实践,然后消化成自己的.
查看演示: 点此查看DEMO
核心代码:

//jQ版本
$
(function(){
    
var _tab=$('ul.tabnav>li');//获取选项卡导航
    
var _box=$('.tabbox div');//获取内容切换区
    
var _hover='hover';//当前点击显示的样式
    
var _index;//索引值
    
_tab.eq(0).addClass(_hover);//第一个导航高亮显示
    
_tab.click(function(){
        
_index=_tab.index(this);//获取当前点击的索引值
        $
(this).addClass(_hover).siblings().removeClass(_hover);//当前点击高亮显示
        
_box.eq(_index).show().siblings().hide();//通过索引值让对应的选项内容区显示
    
}).eq(0).click();
});
//原生JS版本
window.onload=function(){
    
var tabnav=document.getElementById('tabnav');
    
var list=tabnav.getElementsByTagName('li');
    
var tabbox=document.getElementById('tabbox');
    
var divs=tabbox.getElementsByTagName('div');
    
var hover='hover';//当前点击显示的样式
    
var indexValue=function(self,obj){//获取索引值的函数,通过它获取当前点击在导航中的索引位置
        
for(var i=0;i<obj.length;i++){
            
if(obj[i]==self) return i;
        
}
    
};
    
var index;
    
list[0].className=hover;//第一个默认高亮,建议在页面中直接定义
    
for(var k=1;k<divs.length;k++){//我为了省事,用一个for循环定义默认显示第一个切换区块,其他隐藏.这个最好用CSS定义,能避免页面加载时它全部显示出来.
        
divs[k].style.display='none';
    
}
    
for(var l=0;l<list.length;l++){//点击事件
        
list[l].onclick=function(){
            
index=indexValue(this,list);//利用前面定义的indexValue函数取当前点击在选项导航中的索引值,
            
for(var m=0;m<list.length;m++){
                
list[m].className= (m==index) ? hover : '';//高亮显示点击项并移除其他项高亮
            
}
            
for(var n=0;n<divs.length;n++){
                
divs[n].style.display= (n==index) ? 'block' : 'none';//显示点击对应的选项区,隐藏其他
            
}
        
}
    
}
}

 

原文发布于Mr.Think的博客:http://mrthink.net/js-jq-settab-separation/#comment-186 转载请注明