tab.js 3.81 KB
Newer Older
1
/* ========================================================================
Chris Rebert's avatar
Chris Rebert committed
2
 * Bootstrap: tab.js v3.3.4
3
 * http://getbootstrap.com/javascript/#tabs
4
 * ========================================================================
Zlatan Vasović's avatar
Zlatan Vasović committed
5
 * Copyright 2011-2015 Twitter, Inc.
6
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
 * ======================================================================== */
8
9


10
11
+function ($) {
  'use strict';
Katie Zhu's avatar
Katie Zhu committed
12

13
14
  // TAB CLASS DEFINITION
  // ====================
15

16
  var Tab = function (element) {
XhmikosR's avatar
XhmikosR committed
17
    // jscs:disable requireDollarBeforejQueryAssignment
18
    this.element = $(element)
XhmikosR's avatar
XhmikosR committed
19
    // jscs:enable requireDollarBeforejQueryAssignment
20
  }
21

Chris Rebert's avatar
Chris Rebert committed
22
  Tab.VERSION = '3.3.4'
23

24
25
  Tab.TRANSITION_DURATION = 150

26
27
28
29
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
    var selector = $this.data('target')
30

31
32
33
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
34
35
    }

36
    if ($this.parent('li').hasClass('active')) return
37

38
39
40
41
42
43
    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]
44
    })
45

46
47
    $previous.trigger(hideEvent)
    $this.trigger(showEvent)
48

49
    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
50

51
    var $target = $(selector)
52

53
54
    this.activate($this.closest('li'), $ul)
    this.activate($target, $target.parent(), function () {
55
56
57
58
      $previous.trigger({
        type: 'hidden.bs.tab',
        relatedTarget: $this[0]
      })
59
60
      $this.trigger({
        type: 'shown.bs.tab',
61
        relatedTarget: $previous[0]
62
63
64
65
66
67
68
69
      })
    })
  }

  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
XhmikosR's avatar
XhmikosR committed
70
      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
71
72
73
74
75

    function next() {
      $active
        .removeClass('active')
        .find('> .dropdown-menu > .active')
Cameron Little's avatar
Cameron Little committed
76
77
78
79
          .removeClass('active')
        .end()
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', false)
80

Cameron Little's avatar
Cameron Little committed
81
82
83
84
      element
        .addClass('active')
        .find('[data-toggle="tab"]')
          .attr('aria-expanded', true)
85
86
87
88
89
90

      if (transition) {
        element[0].offsetWidth // reflow for transition
        element.addClass('in')
      } else {
        element.removeClass('fade')
fat's avatar
fat committed
91
      }
92

93
      if (element.parent('.dropdown-menu').length) {
Cameron Little's avatar
Cameron Little committed
94
95
96
97
98
99
        element
          .closest('li.dropdown')
            .addClass('active')
          .end()
          .find('[data-toggle="tab"]')
            .attr('aria-expanded', true)
100
      }
fat's avatar
fat committed
101

102
      callback && callback()
103
    }
fat's avatar
fat committed
104

105
    $active.length && transition ?
106
107
      $active
        .one('bsTransitionEnd', next)
108
        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
109
      next()
110

111
112
    $active.removeClass('in')
  }
113
114


115
116
  // TAB PLUGIN DEFINITION
  // =====================
fat's avatar
fat committed
117

118
119
120
121
  function Plugin(option) {
    return this.each(function () {
      var $this = $(this)
      var data  = $this.data('bs.tab')
122

123
124
125
126
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
      if (typeof option == 'string') data[option]()
    })
  }
127

128
  var old = $.fn.tab
129

130
131
  $.fn.tab             = Plugin
  $.fn.tab.Constructor = Tab
132

133

134
135
  // TAB NO CONFLICT
  // ===============
136

137
138
139
140
  $.fn.tab.noConflict = function () {
    $.fn.tab = old
    return this
  }
141

142

143
144
145
  // TAB DATA-API
  // ============

146
  var clickHandler = function (e) {
147
148
    e.preventDefault()
    Plugin.call($(this), 'show')
149
150
151
152
153
  }

  $(document)
    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
154

155
}(jQuery);