视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
跨浏览器通用、可重用的选项卡tab切换js代码_javascript技巧
2020-11-27 21:00:42 责编:小采
文档


由于近来学了点js,于是我装逼道。。不太难吧。。就切一下display属性?同学无视我。说要搞个通用的。。什么还要跟ajax交互。???我愣是没有听懂。。到底要搞什么。。权当作练手,我自己胡弄了一个。
  需求:同学口中的通用我不知道神马意思。。那我就按自己的理解吧。
    ①跨浏览器,IE6+,FF,Chrome,Safari,Opera
    ②同一个页面可以用同一个js设置不同的选项卡。
  说太多没啥米用,来看代码吧。
一、html部分(其实这还没啥好看的,设置了三个,前两个是一样的,通过click事件触发,最后一个通过鼠标移动触发)
代码如下:


  • 项目一

  • 项目二

  • 项目三



  • 类为"tab1"项目一内容,通过"click"触发

  • 类为"tab1"项目二内容,通过"click"触发

  • 类为"tab1"项目三内容,通过"click"触发





  • 项目一

  • 项目二

  • 项目三



  • 类为"tab1"项目一内容,通过"click"触发

  • 类为"tab1"项目二内容,通过"click"触发

  • 类为"tab1"项目三内容,通过"click"触发





  • 项目一

  • 项目二

  • 项目三



  • 类为"tab2"项目一内容,通过"mouseover"触发

  • 类为"tab2"项目二内容,通过"mouseover"触发

  • 类为"tab2""项目三内容,通过"mouseover"触发




  • 特别声明,由于我是菜鸟,所以,我写的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; kif(divs[k].className.indexOf(inClassName) > -1){
    tabs.push(divs[k]);
    }
    }
    }
    //为每个选项卡建立切换功能
    for(var j=0,len=tabs.length; 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; inameList[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的?点此实例下载

    下载本文
    显示全文
    专题