前言:

阅读建议:去github下载一个完整dom然后把,本篇代码复制进去然后运行就好了以地址

tab组件是非常简单的一种组件,因为这是一个系列,所以就顺便看了,其实它写的这个还算不错的,很有条例,也算是插件的规范写法,研究一下也不错

/* ========================================================================
* Bootstrap: tab.js v3.3.7
* http://getbootstrap.com/javascript/#tabs
* ========================================================================
* Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */ +function ($) {
'use strict'; // TAB CLASS DEFINITION
// ==================== var Tab = function (element) {//传入一个选择器
// jscs:disable requireDollarBeforejQueryAssignment
this.element = $(element)
// jscs:enable requireDollarBeforejQueryAssignment
} Tab.VERSION = '3.3.7' Tab.TRANSITION_DURATION = 150 Tab.prototype.show = function () {
var $this = this.element//把a标签赋值给$this
var $ul = $this.closest('ul:not(.dropdown-menu)')//closest 仅供插件开发者使用的方法,jquery1.7后就不建议使用了 冲a标签处向上寻找ul包裹元素
var selector = $this.data('target')//取出target if (!selector) {//没有target的话,
selector = $this.attr('href')//把当前触发的a标签的某点,付给他
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
} if ($this.parent('li').hasClass('active')) return//发现已经时active了,则返回,没有泽继续向下执行 var $previous = $ul.find('.active:last a')
var hideEvent = $.Event('hide.bs.tab', {
relatedTarget: $this[0]
})
var showEvent = $.Event('show.bs.tab', {
relatedTarget: $previous[0]
}) $previous.trigger(hideEvent)
$this.trigger(showEvent) if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return var $target = $(selector) this.activate($this.closest('li'), $ul)
this.activate($target, $target.parent(), function () {
$previous.trigger({
type: 'hidden.bs.tab',
relatedTarget: $this[0]
})
$this.trigger({
type: 'shown.bs.tab',
relatedTarget: $previous[0]
})
})
} Tab.prototype.activate = function (element, container, callback) {
var $active = container.find('> .active')//得到先前li.active
var transition = callback
&& $.support.transition
&& ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) function next() {
$active
.removeClass('active')//把原来的active去除
.find('> .dropdown-menu > .active')
.removeClass('active')//在把menu下拉菜单下的active去掉
.end()//退到上一层
.find('[data-toggle="tab"]')//寻找他下面的a标签,
.attr('aria-expanded', false)//aria-expanded 属性赋值为false element
.addClass('active')//给当前触发的li负上active
.find('[data-toggle="tab"]')//找到地下a标签
.attr('aria-expanded', true)//赋值为true if (transition) {//有毁掉函数的时候
element[0].offsetWidth // reflow for transition
element.addClass('in')
} else {
element.removeClass('fade')
} if (element.parent('.dropdown-menu').length) {//父元素时.dropdown-menu时执行
element
.closest('li.dropdown')
.addClass('active')
.end()
.find('[data-toggle="tab"]')
.attr('aria-expanded', true)
} callback && callback()
} $active.length && transition ?
$active
.one('bsTransitionEnd', next)
.emulateTransitionEnd(Tab.TRANSITION_DURATION) :
next() $active.removeClass('in')
} // TAB PLUGIN DEFINITION
// ===================== function Plugin(option) {
return this.each(function () {//加each是jquery插件的标配,意为选中多个dom时挨个处理
var $this = $(this)
var data = $this.data('bs.tab')//先取一下bs.tab 这一步是为了缓存Tab对象的,这是必须的,不可能点击一下tab就new Tab(this), if (!data) $this.data('bs.tab', (data = new Tab(this)))//如果没有data,那么吧点击的a标签传入tab,然后把Tab对象赋值给data
if (typeof option == 'string') data[option]()//如果传入的是字符串,则执行相应的方法
})
} var old = $.fn.tab $.fn.tab = Plugin
$.fn.tab.Constructor = Tab // TAB NO CONFLICT
// =============== $.fn.tab.noConflict = function () {//这个防冲突的代码,为了规范,应该加上
$.fn.tab = old
return this
} // TAB DATA-API 自动给你初始化了,这样就可以不用写js代码了
// ============ var clickHandler = function (e) {
e.preventDefault()
Plugin.call($(this), 'show')
} $(document)
.on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
.on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)//pill这个是给胶囊导航用的,其实tab和pill原理都一样,只是名字不一样而已 }(jQuery);

Bootstrap tabs 源码分析的更多相关文章

  1. Bootstrap Tooltip源码分析

    /* ======================================================================== * Bootstrap: tooltip.js ...

  2. Bootstrap popover源码分析

    /* ======================================================================== * Bootstrap: popover.js ...

  3. Bootstrap Dropdown 源码分析

    /* ======================================================================== * Bootstrap: dropdown.js ...

  4. Bootstrap button源码分析

    /* ======================================================================== * Bootstrap: button.js v ...

  5. BOOtstrap源码分析之 tooltip、popover

    一.tooltip(提示框) 源码文件: Tooltip.jsTooltip.scss 实现原理: 1.获取当前要显示tooltip的元素的定位信息(top.left.bottom.right.wid ...

  6. Bootstrap源码分析之dropdown

    源码分析: Dropdowns.scss:下拉框模块 Javascripts/bootstrap/dropdown.js:实现下拉框响应 实现功能及原理: 下拉选项卡,默认不能实现显示选中项的功能 原 ...

  7. Appium Server源码分析之作为Bootstrap客户端

    Appium Server拥有两个主要的功能: 它是个http服务器,它专门接收从客户端通过基于http的REST协议发送过来的命令 他是bootstrap客户端:它接收到客户端的命令后,需要想办法把 ...

  8. Appium Android Bootstrap源码分析之启动运行

    通过前面的两篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>和<Appium Android Bootstrap源码分析之命令解析 ...

  9. Appium Android Bootstrap源码分析之命令解析执行

    通过上一篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>我们知道了Appium从pc端发送过来的命令如果是控件相关的话,最终目标控件在b ...

随机推荐

  1. pycharm debug后会出现 step over /step into/step into my code /force step into /step out 分别表示

    1.debug,全部打印 2.打断点debug,出现单步调试等按钮,只运行断点前 3.setup over 调试一行代码 4.setup out 运行断点后面所有代码 5.debug窗口显示调试按钮 ...

  2. 初识Python(windows)——下载、安装、使用

    Table of Contents 1. Why is Python 1.1. Python和R 2. python的下载与安装 2.1. python的版本选择 2.2. python的下载 2.3 ...

  3. 级数求和(C++)

    题目描述 已知:Sn​=1+1/2+1/3+…+1/n.显然对于任意一个整数K,当n足够大的时候,Sn​大于K. 现给出一个整数K(1≤K≤15),要求计算出一个最小的n:使得Sn​>K. 输入 ...

  4. CentO7-使用plantuml绘制UML类图

    准备工作 到PlantUml官网(http://plantuml.com/download)下载plantuml.jar.官网上还有一个在线的demof服务.plantuml的官网真的很挫! 到官网下 ...

  5. 笔试算法题(25):复制拥有多个指针的链表 & 判断二元树B是否为A的子树

    出题:定义一个复杂链表:在单向链表的基础上,每个节点附加一个指向链表中其他任意节点的指针sibling,实现CNode* Clone(Cnode *head)函数复制这个复杂链表: 分析: 解法1:将 ...

  6. 版本控制git之五-标签管理 tags 标签 代码版本 如: v1.0

      版本控制git之五-标签管理 打标签 像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签,以示重要. 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 等等). ...

  7. Springboot+dubbo+zookeeper整合

    本想自己搭建一个Spring+dubbo+zookeeper整合好的框架,想寻找个最佳实现但是遇到各种各样的问题,只好自己看看dubbo starter的源码 整理如下: 通过打上断点来看配置的对不对 ...

  8. GitHub总结

    1) 工作原理 2) 工作流程 clone资源到本地 更新本地资源 新增或修改clone的资源 查看状态 资源推送回github

  9. 58. Spring Boot国际化(i18n)【从零开始学Spring Boot】

    国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式.它要求从产品中抽离所有地域语言,国家/地区和文化相关的元素.换言之,应用程序的功能和代码设计考虑在不 ...

  10. POJ-1988Cube Stacking/HDU-2818Building Block;

    Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 23283   Accepted: 8166 Ca ...