js学习总结_选项卡封装(实例讲解)


Posted in Javascript onJuly 13, 2017

这个插件对应的html的结构如下

<div class='box' id='tabFir'>
    <ul id='tabOptions'>
      <li class='select'>页卡一</li>
      <li>页卡二</li>
      <li>页卡三</li>
    </ul>
    <div class='select'>
      <div>1</div>
      <div>2</div>
      <div>3</div>
      <div>4</div>
    </div>
    <div>内容二</div>
    <div>内容三</div>
  </div>

版本1

//实现一个选项卡封装:我们可以分析出,只要多个选项卡的主体结构一样,那么每个实现的思想都是一样的,唯一不一样的就是最外层的盒子不一样

~function(){
  /*
    tabChange:封装一个选项卡的插件,只要大结构保持统一,以后实现选项卡的功能,只需要调取这个方法执行即可实现
    param:container当前要实现选项卡的这个容器
        defaultIndex:默认选中项的索引
  */
  function tabChange(container,defaultIndex){
    var tabFirst = utils.firstChild(container),oLis = utils.children(tabFirst);
    var divList = utils.children(container,"div");
    //让defaultIndex对应的页卡有选中的样式
    defaultIndex = defaultIndex || 0;
    utils.addClass(oLis[defaultIndex],"select");
    utils.addClass(divList[defaultIndex],"select");
    //具体的切换功能
    for(var i = 0;i<oLis.length;i++){
      oLis[i].onclick = function(){
        utils.addClass(this,"select");
        var curSiblings = utils.siblings(this);
        for(var i = 0;i<curSiblings.length;i++){
          utils.removeClass(curSiblings[i],"select")
        }
        var index = utils.index(this);
        for(var i = 0;i<divList.length;i++){
          i===index ? utils.addClass(divList[i],"select") : utils.removeClass(divList[i],"select")
        }
      }  
    }
    
  }
  window.fTab = tabChange
  
}()

版本2(将for循环改为使用事件委托的方式)

//实现一个选项卡封装:我们可以分析出,只要多个选项卡的主体结构一样,那么每个实现的思想都是一样的,唯一不一样的就是最外层的盒子不一样

~function(){
  /*
    tabChange:封装一个选项卡的插件,只要大结构保持统一,以后实现选项卡的功能,只需要调取这个方法执行即可实现
    param:container当前要实现选项卡的这个容器
        defaultIndex:默认选中项的索引
  */
  function tabChange(container,defaultIndex){
    var tabFirst = utils.firstChild(container),oLis = utils.children(tabFirst);
    var divList = utils.children(container,"div");
    //让defaultIndex对应的页卡有选中的样式
    defaultIndex = defaultIndex || 0;
    utils.addClass(oLis[defaultIndex],"select");
    utils.addClass(divList[defaultIndex],"select");
    //具体的切换功能
    
    //使用事件委托优化
    tabFirst.onclick = function(e){
      e = e || window.event;
      e.target = e.target || e.srcElement;
      if(e.target.tagName.toLowercase()==="li"){//说明当前点击的是li标签
        detailFn.call(e.target,oLis,divList);

      }
    }
  }
  function detailFn(oLis,divList){
    var index = utils.index(this);
    utils.addClass(this,"select");
    for(var i = 0;i<oLis.length;i++){
      i!==index?utils.removeClass(oLis[i],"select"):null;
      i===index ? utils.addClass(divList[i],"select") : utils.removeClass(divList[i],"select");
    }
  }
  window.fTab = tabChange
  
}()

版本3:面向对象的方式,使用构造函数

//实现一个选项卡封装:我们可以分析出,只要多个选项卡的主体结构一样,那么每个实现的思想都是一样的,唯一不一样的就是最外层的盒子不一样

~function(){
  /*
    tabChange:封装一个选项卡的插件,只要大结构保持统一,以后实现选项卡的功能,只需要调取这个方法执行即可实现
    param:container当前要实现选项卡的这个容器
        defaultIndex:默认选中项的索引
  */


  function TabChange(container,defaultIndex){
    this.init(container,defaultIndex);

  }
  TabChange.prototype = {
    constructor:TabChange,//注意重写原型方法,需要重新指定构造器
    //初始化 ,也是当前插件的唯一入口
    init:function(container,defaultIndex){
      this.container = container || null;
      this.defaultIndex = defaultIndex || 0;
      this.tabFirst = utils.firstChild(this.container);
      this.oLis = utils.children(this.tabFirst);
      this.divList = utils.children(this.container,"div");

      this.defaultIndexEven();
      this.liveClick();
      return this;
    },
    //事件委托实现绑定切换
    liveClick:function(){
      var _this = this;
      this.tabFirst.onclick = function(e){
        e = e || window.event;
        e.target = e.target || e.srcElement;
        if(e.target.tagName.toLowercase()==="li"){//说明当前点击的是li标签
          _this.detailFn(e.target);

        }
      }
    },
    detailFn:function(curEle){
      var index = utils.index(curEle);
      utils.addClass(curEle,"select");
      for(var i = 0;i<this.oLis.length;i++){
        i!==index?utils.removeClass(this.oLis[i],"select"):null;
        i===index ? utils.addClass(this.divList[i],"select") : utils.removeClass(this.divList[i],"select");
      }
    },
    //按照索引来设置默认选中的页卡
    defaultIndexEven:function(){
      utils.addClass(this.oLis[this.defaultIndex],"select");
      utils.addClass(this.divList[this.defaultIndex],"select");
    }

  }
  window.fTab = TabChange
  
}()

//使用
var box1 = new fTab(boxList[0],0)

以上这篇js学习总结_选项卡封装(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
利用jquery操作select下拉列表框的代码
Jun 04 Javascript
JavaScript 拾碎[三] 使用className属性
Oct 16 Javascript
自制基于jQuery的智能提示插件一枚
Feb 18 Javascript
js锁屏解屏通过对$.ajax进行封装实现
Jul 31 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
Sep 12 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
Aug 08 jQuery
基于vue如何发布一个npm包的方法步骤
May 15 Javascript
基于js实现数组相邻元素上移下移
May 19 Javascript
如何在面试中手写出javascript节流和防抖函数
Oct 22 Javascript
JS如何监听div的resize事件详解
Dec 03 Javascript
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
用户管理的设计_jquery的ajax实现二级联动效果
Jul 13 #jQuery
通过命令行生成vue项目框架的方法
Jul 12 #Javascript
微信小程序实现点击返回顶层的方法
Jul 12 #Javascript
使用AngularJS对表单提交内容进行验证的操作方法
Jul 12 #Javascript
JQuery EasyUI的一些常用组件
Jul 12 #jQuery
JavaScript严格模式下关于this的几种指向详解
Jul 12 #Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
Jul 12 #jQuery
You might like
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
PHP多个版本的分析解释
2011/07/21 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
PHP删除字符串中非字母数字字符方法总结
2019/01/20 PHP
基于jquery的时间段实现代码
2012/08/02 Javascript
js有序数组的连接问题
2013/10/01 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
js实现抽奖效果
2017/03/27 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
Vue.js仿微信聊天窗口展示组件功能
2017/08/11 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
2018/04/26 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
[08:29]DOTA2每周TOP10 精彩击杀集锦vol.7
2014/06/25 DOTA
Python脚本实现网卡流量监控
2015/02/14 Python
介绍Python中的__future__模块
2015/04/27 Python
解决Python pandas plot输出图形中显示中文乱码问题
2018/12/12 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
pytorch梯度剪裁方式
2020/02/04 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
美国购买体育赛事门票网站:TicketCity
2019/03/06 全球购物
租车协议书范本2014
2014/11/17 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
2016高校自主招生自荐信范文
2016/01/28 职场文书
2019年度政务公开考核工作总结模板
2019/11/11 职场文书
python 机器学习的标准化、归一化、正则化、离散化和白化
2021/04/16 Python
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
python3操作redis实现List列表实例
2021/08/04 Python
Java 关于String字符串原理上的问题
2022/04/07 Java/Android