1 | function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
|
2 |
|
3 | function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | var Tab = function ($) {
|
12 | |
13 |
|
14 |
|
15 |
|
16 |
|
17 | var NAME = 'tab';
|
18 | var VERSION = '4.1.0';
|
19 | var DATA_KEY = 'bs.tab';
|
20 | var EVENT_KEY = "." + DATA_KEY;
|
21 | var DATA_API_KEY = '.data-api';
|
22 | var JQUERY_NO_CONFLICT = $.fn[NAME];
|
23 | var Event = {
|
24 | HIDE: "hide" + EVENT_KEY,
|
25 | HIDDEN: "hidden" + EVENT_KEY,
|
26 | SHOW: "show" + EVENT_KEY,
|
27 | SHOWN: "shown" + EVENT_KEY,
|
28 | CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY
|
29 | };
|
30 | var ClassName = {
|
31 | DROPDOWN_MENU: 'dropdown-menu',
|
32 | ACTIVE: 'active',
|
33 | DISABLED: 'disabled',
|
34 | FADE: 'fade',
|
35 | SHOW: 'show'
|
36 | };
|
37 | var Selector = {
|
38 | DROPDOWN: '.dropdown',
|
39 | NAV_LIST_GROUP: '.nav, .list-group',
|
40 | ACTIVE: '.active',
|
41 | ACTIVE_UL: '> li > .active',
|
42 | DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',
|
43 | DROPDOWN_TOGGLE: '.dropdown-toggle',
|
44 | DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'
|
45 | |
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 | };
|
52 |
|
53 | var Tab =
|
54 |
|
55 | function () {
|
56 | function Tab(element) {
|
57 | this._element = element;
|
58 | }
|
59 |
|
60 |
|
61 | var _proto = Tab.prototype;
|
62 |
|
63 |
|
64 | _proto.show = function show() {
|
65 | var _this = this;
|
66 |
|
67 | if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) {
|
68 | return;
|
69 | }
|
70 |
|
71 | var target;
|
72 | var previous;
|
73 | var listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0];
|
74 | var selector = Util.getSelectorFromElement(this._element);
|
75 |
|
76 | if (listElement) {
|
77 | var itemSelector = listElement.nodeName === 'UL' ? Selector.ACTIVE_UL : Selector.ACTIVE;
|
78 | previous = $.makeArray($(listElement).find(itemSelector));
|
79 | previous = previous[previous.length - 1];
|
80 | }
|
81 |
|
82 | var hideEvent = $.Event(Event.HIDE, {
|
83 | relatedTarget: this._element
|
84 | });
|
85 | var showEvent = $.Event(Event.SHOW, {
|
86 | relatedTarget: previous
|
87 | });
|
88 |
|
89 | if (previous) {
|
90 | $(previous).trigger(hideEvent);
|
91 | }
|
92 |
|
93 | $(this._element).trigger(showEvent);
|
94 |
|
95 | if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {
|
96 | return;
|
97 | }
|
98 |
|
99 | if (selector) {
|
100 | target = $(selector)[0];
|
101 | }
|
102 |
|
103 | this._activate(this._element, listElement);
|
104 |
|
105 | var complete = function complete() {
|
106 | var hiddenEvent = $.Event(Event.HIDDEN, {
|
107 | relatedTarget: _this._element
|
108 | });
|
109 | var shownEvent = $.Event(Event.SHOWN, {
|
110 | relatedTarget: previous
|
111 | });
|
112 | $(previous).trigger(hiddenEvent);
|
113 | $(_this._element).trigger(shownEvent);
|
114 | };
|
115 |
|
116 | if (target) {
|
117 | this._activate(target, target.parentNode, complete);
|
118 | } else {
|
119 | complete();
|
120 | }
|
121 | };
|
122 |
|
123 | _proto.dispose = function dispose() {
|
124 | $.removeData(this._element, DATA_KEY);
|
125 | this._element = null;
|
126 | };
|
127 |
|
128 |
|
129 | _proto._activate = function _activate(element, container, callback) {
|
130 | var _this2 = this;
|
131 |
|
132 | var activeElements;
|
133 |
|
134 | if (container.nodeName === 'UL') {
|
135 | activeElements = $(container).find(Selector.ACTIVE_UL);
|
136 | } else {
|
137 | activeElements = $(container).children(Selector.ACTIVE);
|
138 | }
|
139 |
|
140 | var active = activeElements[0];
|
141 | var isTransitioning = callback && active && $(active).hasClass(ClassName.FADE);
|
142 |
|
143 | var complete = function complete() {
|
144 | return _this2._transitionComplete(element, active, callback);
|
145 | };
|
146 |
|
147 | if (active && isTransitioning) {
|
148 | var transitionDuration = Util.getTransitionDurationFromElement(active);
|
149 | $(active).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);
|
150 | } else {
|
151 | complete();
|
152 | }
|
153 | };
|
154 |
|
155 | _proto._transitionComplete = function _transitionComplete(element, active, callback) {
|
156 | if (active) {
|
157 | $(active).removeClass(ClassName.SHOW + " " + ClassName.ACTIVE);
|
158 | var dropdownChild = $(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0];
|
159 |
|
160 | if (dropdownChild) {
|
161 | $(dropdownChild).removeClass(ClassName.ACTIVE);
|
162 | }
|
163 |
|
164 | if (active.getAttribute('role') === 'tab') {
|
165 | active.setAttribute('aria-selected', false);
|
166 | }
|
167 | }
|
168 |
|
169 | $(element).addClass(ClassName.ACTIVE);
|
170 |
|
171 | if (element.getAttribute('role') === 'tab') {
|
172 | element.setAttribute('aria-selected', true);
|
173 | }
|
174 |
|
175 | Util.reflow(element);
|
176 | $(element).addClass(ClassName.SHOW);
|
177 |
|
178 | if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {
|
179 | var dropdownElement = $(element).closest(Selector.DROPDOWN)[0];
|
180 |
|
181 | if (dropdownElement) {
|
182 | $(dropdownElement).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
|
183 | }
|
184 |
|
185 | element.setAttribute('aria-expanded', true);
|
186 | }
|
187 |
|
188 | if (callback) {
|
189 | callback();
|
190 | }
|
191 | };
|
192 |
|
193 |
|
194 | Tab._jQueryInterface = function _jQueryInterface(config) {
|
195 | return this.each(function () {
|
196 | var $this = $(this);
|
197 | var data = $this.data(DATA_KEY);
|
198 |
|
199 | if (!data) {
|
200 | data = new Tab(this);
|
201 | $this.data(DATA_KEY, data);
|
202 | }
|
203 |
|
204 | if (typeof config === 'string') {
|
205 | if (typeof data[config] === 'undefined') {
|
206 | throw new TypeError("No method named \"" + config + "\"");
|
207 | }
|
208 |
|
209 | data[config]();
|
210 | }
|
211 | });
|
212 | };
|
213 |
|
214 | _createClass(Tab, null, [{
|
215 | key: "VERSION",
|
216 | get: function get() {
|
217 | return VERSION;
|
218 | }
|
219 | }]);
|
220 |
|
221 | return Tab;
|
222 | }();
|
223 | |
224 |
|
225 |
|
226 |
|
227 |
|
228 |
|
229 |
|
230 | $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
|
231 | event.preventDefault();
|
232 |
|
233 | Tab._jQueryInterface.call($(this), 'show');
|
234 | });
|
235 | |
236 |
|
237 |
|
238 |
|
239 |
|
240 |
|
241 | $.fn[NAME] = Tab._jQueryInterface;
|
242 | $.fn[NAME].Constructor = Tab;
|
243 |
|
244 | $.fn[NAME].noConflict = function () {
|
245 | $.fn[NAME] = JQUERY_NO_CONFLICT;
|
246 | return Tab._jQueryInterface;
|
247 | };
|
248 |
|
249 | return Tab;
|
250 | }($);
|
251 |
|
\ | No newline at end of file |