tab.js 2.93 KB
Newer Older
1
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
2
 * Bootstrap: tab.js v3.1.1
3
 * http://getbootstrap.com/javascript/#tabs
4
 * ========================================================================
5
 * Copyright 2011-2014 Twitter, Inc.
6
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
 * ======================================================================== */
8
9


Zlatan Vasović's avatar
Zlatan Vasović committed
10
11
+function ($) {
  'use strict';
12

fat's avatar
fat committed
13
14
  // TAB CLASS DEFINITION
  // ====================
15

Jacob Thornton's avatar
Jacob Thornton committed
16
  var Tab = function (element) {
17
18
19
    this.element = $(element)
  }

fat's avatar
fat committed
20
21
  Tab.VERSION = '3.1.1'

fat's avatar
fat committed
22
23
24
  Tab.prototype.show = function () {
    var $this    = this.element
    var $ul      = $this.closest('ul:not(.dropdown-menu)')
25
    var selector = $this.data('target')
26

fat's avatar
fat committed
27
28
29
30
    if (!selector) {
      selector = $this.attr('href')
      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
    }
31

fat's avatar
fat committed
32
    if ($this.parent('li').hasClass('active')) return
33

fat's avatar
fat committed
34
    var previous = $ul.find('.active:last a')[0]
35
    var e        = $.Event('show.bs.tab', {
fat's avatar
fat committed
36
37
      relatedTarget: previous
    })
38

fat's avatar
fat committed
39
    $this.trigger(e)
40

fat's avatar
fat committed
41
    if (e.isDefaultPrevented()) return
42

fat's avatar
fat committed
43
    var $target = $(selector)
44

45
    this.activate($this.closest('li'), $ul)
fat's avatar
fat committed
46
47
    this.activate($target, $target.parent(), function () {
      $this.trigger({
Zlatan Vasović's avatar
Zlatan Vasović committed
48
49
        type: 'shown.bs.tab',
        relatedTarget: previous
50
      })
fat's avatar
fat committed
51
52
    })
  }
53

fat's avatar
fat committed
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  Tab.prototype.activate = function (element, container, callback) {
    var $active    = container.find('> .active')
    var transition = callback
      && $.support.transition
      && $active.hasClass('fade')

    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')
73
      }
74

fat's avatar
fat committed
75
76
77
      if (element.parent('.dropdown-menu')) {
        element.closest('li.dropdown').addClass('active')
      }
78

fat's avatar
fat committed
79
      callback && callback()
80
    }
fat's avatar
fat committed
81
82

    transition ?
83
84
85
      $active
        .one($.support.transition.end, next)
        .emulateTransitionEnd(150) :
fat's avatar
fat committed
86
87
88
      next()

    $active.removeClass('in')
89
90
91
  }


fat's avatar
fat committed
92
93
  // TAB PLUGIN DEFINITION
  // =====================
94

XhmikosR's avatar
XhmikosR committed
95
  function Plugin(option) {
96
97
    return this.each(function () {
      var $this = $(this)
98
      var data  = $this.data('bs.tab')
fat's avatar
fat committed
99

100
      if (!data) $this.data('bs.tab', (data = new Tab(this)))
101
102
103
104
      if (typeof option == 'string') data[option]()
    })
  }

105
106
107
  var old = $.fn.tab

  $.fn.tab             = Plugin
108
  $.fn.tab.Constructor = Tab
109
110


fat's avatar
fat committed
111
112
  // TAB NO CONFLICT
  // ===============
113
114
115
116
117
118
119

  $.fn.tab.noConflict = function () {
    $.fn.tab = old
    return this
  }


fat's avatar
fat committed
120
121
  // TAB DATA-API
  // ============
122

123
  $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
124
    e.preventDefault()
125
    Plugin.call($(this), 'show')
126
127
  })

128
}(jQuery);