先看bootstrap-tab.js的结构

var Tab = function ( element ) {} //构造器
Tab.prototype ={} //构造器的原型
$.fn.tab = function ( option ){} //jQuery原型上自定义的方法
$.fn.tab.Constructor = Tab //重写jQuery原型上的自定义方法的构造器名
$(function () {}) //初始化

HTML结构

<ul class="nav nav-tabs">
<li class="active"><a href="#home" data-toggle="tab" >首页</a></li>
<li><a href="#profile" data-toggle="tab">介绍</a></li>
<li><a href="#messages" data-toggle="tab">消息</a></li>
<li><a href="#settings" data-toggle="tab">设置</a></li> </ul> <div class="tab-content">
<div class="tab-pane active" id="home">1</div>
<div class="tab-pane" id="profile">2</div>
<div class="tab-pane" id="messages">3</div>
<div class="tab-pane" id="settings">4</div>
</div>

先从初始化开始

/*
* 初始化
* 给拥有data-toggle='tab'属性的标签绑定click事件
* */
$(function () {
$('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
e.preventDefault()
$(this).tab('show')//向jQuery原型方法tab传入参数show,应该执行show方法。this为拥有data-toggle属性的a标签对象
})
})

让body监听a标签的click事件,并且阻止其冒泡,调用了jQuery的原型方法tab。

 /*
* jQuery原型上自定义的方法
* */
$.fn.tab = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('tab')
if (!data) $this.data('tab', (data = new Tab(this)))//实例化构造器
if (typeof option == 'string') data[option]()//执行option的方法
})
}

这个结构跟之前的几个插件差不多,不过最后它是执行了show方法的,进入构造器

var Tab = function ( element ) {
this.element = $(element)
}

将对象封装成构造器实例的一个属性。接下来我们执行show方法

show: function () {
var $this = this.element
, $ul = $this.closest('ul:not(.dropdown-menu)')//找到最近的不是dropdown类的ul元素
, selector = $this.attr('data-target')
, previous
, $target
//获取与a标签对应的内容id
if (!selector) {
selector = $this.attr('href')
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
//如果一直点击自己,这句之后的代码将不执行
if ( $this.parent('li').hasClass('active') ) return previous = $ul.find('.active a').last()[0]//获得拥有active类的原生a标签对象,即上一次高亮的节点 $this.trigger({
type: 'show'
, relatedTarget: previous
}) $target = $(selector)//获得内容节点的jQueryDOM对象 this.activate($this.parent('li'), $ul)//tab页切换 this.activate($target, $target.parent(), function () {
$this.trigger({
type: 'shown'
, relatedTarget: previous
}) })

根据标签a的data-target属性或是其href找到对应的id的dom节点。最后我们执行了两次activate方法,其实大概猜的出来,一个方法控制a标签的高亮显示,另一个控制dom节点的显示与隐藏

/*
* 控制显示与隐藏
* 参数主要形式是这样的,一个是可以拥有active类的元素,另一个是其父类。
* 先找到父类下来所有拥有active类的节点,删除它们的active,并将当前节点,也就是第一个参数加上active类。
*
* */
, activate: function ( element, container, callback) { var $active = container.find('> .active')
, transition = callback
&& $.support.transition//需要引入其他js文件,这里没有引入。
&& $active.hasClass('fade')
console.log($active[0])
function next() {
$active
.removeClass('active')
.find('> .dropdown-menu > .active')
.removeClass('active') element.addClass('active') if (transition) {
element[0].offsetWidth // reflow for transition
element.addClass('in')
} else {
element.removeClass('fade')
} if ( element.parent('.dropdown-menu') ) {
element.closest('li.dropdown').addClass('active')
} callback && callback()
} transition ?
$active.one($.support.transition.end, next) :
next() $active.removeClass('in')
}

逻辑比较简单,一般遇到一个显示其他同类不显示的情况,基本都是这一套方法,增删class来达到要求。但对于jQuery操作css完成class切换与javascript原生方法相比,哪个效率会更好一点呢?也希望有经验的园友给予解答。

另外是部分css,表现了两块active类的作用

/*tab页切换时的active作用*/
.nav-tabs > .active > a,
.nav-tabs > .active > a:hover,
.nav-tabs > .active > a:focus {
color: #555555;
cursor: default;
background-color: #ffffff;
border: 1px solid #ddd;
border-bottom-color: transparent;//将底部边框变透明
} /*dom*/ .tab-content > .tab-pane,
.pill-content > .pill-pane {
display: none; //原来为隐藏
} .tab-content > .active,
.pill-content > .active {
display: block; //加入active ,变为显示
}

内容不多,时间刚好,以上是我的一点读码体会,如有错误,请指出,大家共通学习。

bootstrap插件学习-bootstrap.tab.js的更多相关文章

  1. bootstrap插件学习-bootstrap.dropdown.js

    bootstrap插件学习-bootstrap.dropdown.js 先看bootstrap.dropdown.js的结构 var toggle = '[data-toggle="drop ...

  2. bootstrap插件学习-bootstrap.modal.js

    bootstrap插件学习-bootstrap.modal.js 先从bootstrap.modal.js的结构看起. function($){ var Modal = function(){} // ...

  3. bootstrap插件学习-bootstrap.tab.js(读码)

    先看bootstrap-tab.js的结构 var Tab = function ( element ) {} //构造器 Tab.prototype ={} //构造器的原型 $.fn.tab = ...

  4. bootstrap插件学习-bootstrap.typehead.js

    先看bootstrap.typehead.js的结构 var Typeahead = function ( element, options ){} //构造器 Typeahead.prototype ...

  5. bootstrap插件学习-bootstrap.carousel.js

    先看bootstrap.carousel.js的结构 var Carousel = function (element, options){} //构造器 Carousel.prototype = { ...

  6. bootstrap插件学习-bootstrap.collapse.js

    先看bootstrap.collapse.js的结构 var Collapse = function ( element, options ){} // 构造器 Collapse.prototype ...

  7. bootstrap插件学习-bootstrap.alert.js

    我们先看bootstrap.alert.js的结构 var dismiss = '[data-dismiss="alert"]' //自定义属性 Alert = function ...

  8. bootstrap插件学习-bootstrap.button.js

    先看bootstrap.button.js的结构 var Button = function ( element, options ){} //构造器 Button.prototype = {} // ...

  9. bootstrap插件学习-bootstrap.popover.js

    先看bootstrap.popover.js的结构 var Popover = function ( element, options ){} //构造器 Popover.prototype = {} ...

随机推荐

  1. javascript实例——时间日期篇(包含5个实例)

    本来想在网上找一些js实例来练练手,结果发现一本书<突破JavaScript编程实例五十讲>,看了下内容还不错,就下了下来: 后面又下了该书籍的源码,一看才发现这本书编的日期是2002年的 ...

  2. 26数据查询的各种小玩法-select 下(必学)-天轰穿sqlserver视频教程

    大纲:简单查询-选择数据列,使用字符串,改变列标题,使用数据运算,使用ALL语DISTINCT关键字,使用TOP关键字,排序 优酷超清地址,为了冲优酷的访问量,所以这里只放优酷的地址了,其实其他网站还 ...

  3. Goodchild教授关于GIS的四大预测的不同看法

    Goodchild教授的关于GIS的4个未来发展的预测不断有人在微信朋友圈里转发,虽然现在做的工作GIS只是一个基本的工具之一了,但对这4个预测还是有不少不同看法和一点自己的意见. Goodchild ...

  4. How to use “svn add” recursively in Linux shell?

    This command will add any un-versioned files listed in svn st command output to subversion. Note tha ...

  5. 吐槽C++:C++ 类成员变量初始化 之 初始化带有参数的构造函数 的类成员变量。

    本来我想写这样的代码: class MatchManager{ public: MatchManager() { } class OnTimerRunFuncHelper{ public: OnTim ...

  6. 那些在学习iOS开发前就应该知道的事(part 2)

    英文原文:Things I wish I had known before starting iOS development—Part 2 http://www.cocoachina.com/ios/ ...

  7. LANDR:在线母带处理

    二前年没看这报道,我就有这样的想法.最近也在完成个别功能,但还是慢,原因有二个:1) 一个人做太慢了,这个要做好有太多工作要做:2) 音乐相关知识功底太差,很多时间在学基础的乐理知识. LANDR是一 ...

  8. ELK——为调试 Logstash Grok 表达式,安装 GrokDebuger 环境

      内容 安装 RVM 安装 Ruby 和 Gems 安装 Rails 安装 jls-grok Ruby grok 解析 调试 grok 注意:不要用 root 执行以下操作. 用 logstash ...

  9. 面包板入门电子制作(class1)视频 全套30集高清

    面包板入门电子制作(class1)套件(30集高清) 本套件以电子制作中最基础的元器件在面包板上搭建电路,用启发性的视频教学方式,使学习者熟悉电子电路基础.发挥想像力.在创新设计和制作中学会独立设计和 ...

  10. highcharts插件使用总结和开发中遇到的问题及解决办法

    这里使用的highchart是2014-01-09从官网下载的版本,版本号是3.0.8, 当过了几天后,发现版本号变成了3.0.9,不由得的感叹highchart的版本更新之快. 在jsp中使用hig ...