一个简单的选项卡js插件

估计大概两三个月没有这类的关于前端的文章了,一来是觉得自己太菜,二来也是因为自己的懒散,浑浑噩噩的消耗时间却没有收获什么成果。今天因为和一些同学的聊天,突然自己的心情很低落,有一种看不到未来在哪的感觉,所以强行让自己学习,去看js插件怎么写。今天写一个简单的选项卡插件,这个我也是看别人博文学习实现的,然后加一些自己的理解。

一.实现效果

选项卡切换
实现页面的代码

虽说有点简陋,但是可以看到在html文件中,引入我们写的tab.js插件后,实现选项卡切换,就只需一行代码就可以实现了。

二.tab.js结构

先整体看下结构大概是怎样

//一开始当然是创建一个构造函数tab
function Tab(){
  //里面只有一行代码,就是调用自身的初始化方法
  this.init.apply(this,arguments);
}

//需要的属性和方法全部写在prototype里面
Tab.prototype = {
  //属性
  //some code
  //方法
  //some code
}

三.一些方法的实现

  1. 我们在这里没有使用闭包然后立即执行,所以才需要一个初始化函数将属性都初始化,在init中:
  init:function(ela,elb,paramObj){
  //一般在插件中都会有个配置对象,并且有默认值
  this.defaultOptions = {
    curClass:'current',
    type:'mouseover',
    delay:150
  }
  //然后我们会去检测用户有没有传入配置参数,有的话就要使用用户的配置,这里使用到一个extend方法
  this.options = this.extend(this.defaultOptions, paramObj || {})
}

extend实际是一个对象拓展方法,将b对象的属性覆盖到a对象中,在JQ里直接写好了这种方法,但js里没有,需要我们自己去模拟,我们将这个方法写在init外面

extend:function(a,b){
  for(var i in b){
    //这个是检测for循环到的属性是不是b自身的
    if(b.hasOwnProperty(i)){
      a[i] = b[i]
    }
  }
  return a;
}

后面init里就是一些基本的属性,比如获取导航栏的DOM,内容块的DOM,以及他们的子元素还有子元素的个数,后面遍历会用到,具体可在文章附的源码里去看。最后我们要在init中给每个导航绑定事件,一个是触发,一个是取消,取消自然就是onmouseout,触发的话可以传入参数来制定,使用中括号可以解决这个问题

for(var i=0;i<this.tLen;i++){
    this.triggerItem[i]['on' + this.options.type] = this.change(i)
    this.triggerItem[i].onmouseout = function(){
      clearTime(self.timer);
      self.timer = null;
    }
}
  1. 添加类名和消除类名方法
    实现这种切换效果一般采用的方法都是使用类名的添加和消除来实现的,那么对类名的操作方法就很重要了
addClass:function(el,name){
  var arr = [],
       str = el.className,
       arr = str.split(/\s+/),
       len = arr.length,
       name = this.trim(name),
  for(var i=0;i<len;i++){
    if(arr[i] === name){
      //已存在直接返回
      return;
    }
   }
  el.className += ' ' + name;
  el = null; 
}

消除类名方法类似,主要是用到了一个splice方法。

  1. change选项卡切换函数
    这个就是给每个导航栏绑定的函数
    这里也是使用了一个闭包,每次都返回一个新函数
change:function(index){
  var self = this;
  return function(){
    self.timer = setTimeout(function(){
        for(var i=0;i<self.tLen;i++){
          if(i == index){
            self.addClass(self.triggerItem[index],self.options.curClass);
            self.listItem[i].style.display = 'block';
          }else{
            self.removeClass(self.triggerItem[i],self.options.curClass);
            self.listItem[i].style.display = 'none';
          }
        }
      },self.options.delay)
  }
}

四.总结

其实这个是非常简单的一个封装,刚开始学习前端的肯定是都做过这种切换效果的,而这个封装就是利用对象原型链的继承,来达到一些方法的复用。其中主要的知识点:
1.每新建一个对象都需要init初始化
2.将需要的属性和方法写在prototype中
3.利用闭包去给dom绑定事件
4.类名的处理要注意细节,比如检测是否已存在,是否有空格等
5.对于一些事件要做延迟处理,事件完成后要注意清理现场

五.最后再说两句

这篇文章实际上没有什么有价值的内容,但我希望它对我而言是一个学习开始,就像刚刚开始学习前端的时候一样,那种纯粹的技术的渴望。还有几个月就要毕业了,才意识到自己的大学真的就这么过去了。就像当时读大一大二的时候,回家和高中同学聚会也才意识到高中真的就这么过去了,哪怕那个人站在面前,你也感觉和当初的他不同了。可没办法这就是成长。当时还想着要是能重来,一定要好好读书,一定要追到同桌妹子。现在大学要过去了,遗憾当然是有,但不会再有那种想重来的想法了,因为哪怕重来也一定差不多,真正重要的是自己心智的变化。不重来照样可以好好读书,不重来照样可以去追求自己喜欢的人,何必把自己限定在一种环境,一种身份上呢。尽管这段时间以来受刺激很多,心情有点低落,但还是要好好努力,好好生活。就像以前一直以为自己写文章肯定没人看的,结果偶尔会有人给你点赞,有人给你回复,也许只是寥寥数语,但对我而言确实莫大的鼓励。希望新的一年自己能不断成长,越来越强大!

源码地址:https://coding.net/u/ly550275752/p/MyTest/git/blob/coding-pages/tab.js

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,696评论 2 17
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,045评论 1 10
  • 深入响应式 追踪变化: 把普通js对象传给Vue实例的data选项,Vue将使用Object.defineProp...
    冥冥2017阅读 4,831评论 6 16
  • 从父亲手上接过你的时候 我双眼泛泪 这是第二次了 我还是无法控制好自己的泪腺 第一次 我哭了 你被逗笑了 今天 我...
    Spancer_Wu阅读 274评论 0 0
  • 母亲,像一只勤劳的蜜蜂,为我们酿蜜,母亲,像一头老黄牛,一直默默无闻的工作,母亲像一只春蚕,无私奉献,母...
    宇淼阅读 379评论 1 5