|
1 /* ======================================================================== |
|
2 * Bootstrap: tab.js v3.3.5 |
|
3 * http://getbootstrap.com/javascript/#tabs |
|
4 * ======================================================================== |
|
5 * Copyright 2011-2015 Twitter, Inc. |
|
6 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) |
|
7 * ======================================================================== */ |
|
8 |
|
9 |
|
10 +function ($) { |
|
11 'use strict'; |
|
12 |
|
13 // TAB CLASS DEFINITION |
|
14 // ==================== |
|
15 |
|
16 var Tab = function (element) { |
|
17 // jscs:disable requireDollarBeforejQueryAssignment |
|
18 this.element = $(element) |
|
19 // jscs:enable requireDollarBeforejQueryAssignment |
|
20 } |
|
21 |
|
22 Tab.VERSION = '3.3.5' |
|
23 |
|
24 Tab.TRANSITION_DURATION = 150 |
|
25 |
|
26 Tab.prototype.show = function () { |
|
27 var $this = this.element |
|
28 var $ul = $this.closest('ul:not(.dropdown-menu)') |
|
29 var selector = $this.data('target') |
|
30 |
|
31 if (!selector) { |
|
32 selector = $this.attr('href') |
|
33 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 |
|
34 } |
|
35 |
|
36 if ($this.parent('li').hasClass('active')) return |
|
37 |
|
38 var $previous = $ul.find('.active:last a') |
|
39 var hideEvent = $.Event('hide.bs.tab', { |
|
40 relatedTarget: $this[0] |
|
41 }) |
|
42 var showEvent = $.Event('show.bs.tab', { |
|
43 relatedTarget: $previous[0] |
|
44 }) |
|
45 |
|
46 $previous.trigger(hideEvent) |
|
47 $this.trigger(showEvent) |
|
48 |
|
49 if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return |
|
50 |
|
51 var $target = $(selector) |
|
52 |
|
53 this.activate($this.closest('li'), $ul) |
|
54 this.activate($target, $target.parent(), function () { |
|
55 $previous.trigger({ |
|
56 type: 'hidden.bs.tab', |
|
57 relatedTarget: $this[0] |
|
58 }) |
|
59 $this.trigger({ |
|
60 type: 'shown.bs.tab', |
|
61 relatedTarget: $previous[0] |
|
62 }) |
|
63 }) |
|
64 } |
|
65 |
|
66 Tab.prototype.activate = function (element, container, callback) { |
|
67 var $active = container.find('> .active') |
|
68 var transition = callback |
|
69 && $.support.transition |
|
70 && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) |
|
71 |
|
72 function next() { |
|
73 $active |
|
74 .removeClass('active') |
|
75 .find('> .dropdown-menu > .active') |
|
76 .removeClass('active') |
|
77 .end() |
|
78 .find('[data-toggle="tab"]') |
|
79 .attr('aria-expanded', false) |
|
80 |
|
81 element |
|
82 .addClass('active') |
|
83 .find('[data-toggle="tab"]') |
|
84 .attr('aria-expanded', true) |
|
85 |
|
86 if (transition) { |
|
87 element[0].offsetWidth // reflow for transition |
|
88 element.addClass('in') |
|
89 } else { |
|
90 element.removeClass('fade') |
|
91 } |
|
92 |
|
93 if (element.parent('.dropdown-menu').length) { |
|
94 element |
|
95 .closest('li.dropdown') |
|
96 .addClass('active') |
|
97 .end() |
|
98 .find('[data-toggle="tab"]') |
|
99 .attr('aria-expanded', true) |
|
100 } |
|
101 |
|
102 callback && callback() |
|
103 } |
|
104 |
|
105 $active.length && transition ? |
|
106 $active |
|
107 .one('bsTransitionEnd', next) |
|
108 .emulateTransitionEnd(Tab.TRANSITION_DURATION) : |
|
109 next() |
|
110 |
|
111 $active.removeClass('in') |
|
112 } |
|
113 |
|
114 |
|
115 // TAB PLUGIN DEFINITION |
|
116 // ===================== |
|
117 |
|
118 function Plugin(option) { |
|
119 return this.each(function () { |
|
120 var $this = $(this) |
|
121 var data = $this.data('bs.tab') |
|
122 |
|
123 if (!data) $this.data('bs.tab', (data = new Tab(this))) |
|
124 if (typeof option == 'string') data[option]() |
|
125 }) |
|
126 } |
|
127 |
|
128 var old = $.fn.tab |
|
129 |
|
130 $.fn.tab = Plugin |
|
131 $.fn.tab.Constructor = Tab |
|
132 |
|
133 |
|
134 // TAB NO CONFLICT |
|
135 // =============== |
|
136 |
|
137 $.fn.tab.noConflict = function () { |
|
138 $.fn.tab = old |
|
139 return this |
|
140 } |
|
141 |
|
142 |
|
143 // TAB DATA-API |
|
144 // ============ |
|
145 |
|
146 var clickHandler = function (e) { |
|
147 e.preventDefault() |
|
148 Plugin.call($(this), 'show') |
|
149 } |
|
150 |
|
151 $(document) |
|
152 .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) |
|
153 .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) |
|
154 |
|
155 }(jQuery); |