Commit f8b2569e authored by fat's avatar fat

implement global dispose method

parent dafdd180
...@@ -70,7 +70,7 @@ module.exports = function (grunt) { ...@@ -70,7 +70,7 @@ module.exports = function (grunt) {
}, },
babel: { babel: {
src: { dev: {
options: { options: {
sourceMap: true, sourceMap: true,
modules: 'ignore' modules: 'ignore'
...@@ -352,7 +352,7 @@ module.exports = function (grunt) { ...@@ -352,7 +352,7 @@ module.exports = function (grunt) {
watch: { watch: {
src: { src: {
files: '<%= jscs.core.src %>', files: '<%= jscs.core.src %>',
tasks: ['qunit', 'concat'] tasks: ['babel:dev']
}, },
test: { test: {
files: '<%= jscs.test.src %>', files: '<%= jscs.test.src %>',
......
This diff is collapsed.
This diff is collapsed.
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
var NAME = 'alert'; var NAME = 'alert';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.alert'; var DATA_KEY = 'bs.alert';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 150; var TRANSITION_DURATION = 150;
...@@ -47,9 +49,9 @@ ...@@ -47,9 +49,9 @@
}; };
var Event = { var Event = {
CLOSE: 'close.bs.alert', CLOSE: 'close' + EVENT_KEY,
CLOSED: 'closed.bs.alert', CLOSED: 'closed' + EVENT_KEY,
CLICK: 'click.bs.alert.data-api' CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -88,6 +90,12 @@ ...@@ -88,6 +90,12 @@
this._removeElement(rootElement); this._removeElement(rootElement);
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
this._element = null;
}
}, { }, {
key: '_getRootElement', key: '_getRootElement',
...@@ -181,7 +189,7 @@ ...@@ -181,7 +189,7 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DISMISS, Alert._handleDismiss(new Alert())); $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
......
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
var NAME = 'button'; var NAME = 'button';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.button'; var DATA_KEY = 'bs.button';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 150; var TRANSITION_DURATION = 150;
...@@ -53,8 +55,8 @@ ...@@ -53,8 +55,8 @@
}; };
var Event = { var Event = {
CLICK: 'click.bs.button.data-api', CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY,
FOCUS_BLUR: 'focus.bs.button.data-api blur.bs.button.data-api' FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + '' + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + '' + DATA_API_KEY)
}; };
/** /**
...@@ -108,6 +110,12 @@ ...@@ -108,6 +110,12 @@
$(this._element).toggleClass(ClassName.ACTIVE); $(this._element).toggleClass(ClassName.ACTIVE);
} }
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
this._element = null;
}
}], [{ }], [{
key: 'VERSION', key: 'VERSION',
...@@ -146,7 +154,7 @@ ...@@ -146,7 +154,7 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_TOGGLE_CARROT, function (event) { $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
event.preventDefault(); event.preventDefault();
var button = event.target; var button = event.target;
...@@ -156,7 +164,7 @@ ...@@ -156,7 +164,7 @@
} }
Button._jQueryInterface.call($(button), 'toggle'); Button._jQueryInterface.call($(button), 'toggle');
}).on(Event.FOCUS_BLUR, Selector.DATA_TOGGLE_CARROT, function (event) { }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
var button = $(event.target).closest(Selector.BUTTON)[0]; var button = $(event.target).closest(Selector.BUTTON)[0];
$(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type)); $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
}); });
......
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
var NAME = 'carousel'; var NAME = 'carousel';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.carousel'; var DATA_KEY = 'bs.carousel';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 600; var TRANSITION_DURATION = 600;
...@@ -56,10 +58,13 @@ ...@@ -56,10 +58,13 @@
}; };
var Event = { var Event = {
SLIDE: 'slide.bs.carousel', SLIDE: 'slide' + EVENT_KEY,
SLID: 'slid.bs.carousel', SLID: 'slid' + EVENT_KEY,
CLICK: 'click.bs.carousel.data-api', KEYDOWN: 'keydown' + EVENT_KEY,
LOAD: 'load' MOUSEENTER: 'mouseenter' + EVENT_KEY,
MOUSELEAVE: 'mouseleave' + EVENT_KEY,
LOAD_DATA_API: 'load' + EVENT_KEY + '' + DATA_API_KEY,
CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -183,6 +188,21 @@ ...@@ -183,6 +188,21 @@
this._slide(direction, this._items[index]); this._slide(direction, this._items[index]);
} }
}, {
key: 'dispose',
value: function dispose() {
$(this._element).off(EVENT_KEY);
$.removeData(this._element, DATA_KEY);
this._items = null;
this._config = null;
this._element = null;
this._interval = null;
this._isPaused = null;
this._isSliding = null;
this._activeElement = null;
this._indicatorsElement = null;
}
}, { }, {
key: '_addEventListeners', key: '_addEventListeners',
...@@ -190,11 +210,11 @@ ...@@ -190,11 +210,11 @@
value: function _addEventListeners() { value: function _addEventListeners() {
if (this._config.keyboard) { if (this._config.keyboard) {
$(this._element).on('keydown.bs.carousel', $.proxy(this._keydown, this)); $(this._element).on(Event.KEYDOWN, $.proxy(this._keydown, this));
} }
if (this._config.pause == 'hover' && !('ontouchstart' in document.documentElement)) { if (this._config.pause == 'hover' && !('ontouchstart' in document.documentElement)) {
$(this._element).on('mouseenter.bs.carousel', $.proxy(this.pause, this)).on('mouseleave.bs.carousel', $.proxy(this.cycle, this)); $(this._element).on(Event.MOUSEENTER, $.proxy(this.pause, this)).on(Event.MOUSELEAVE, $.proxy(this.cycle, this));
} }
} }
}, { }, {
...@@ -421,9 +441,9 @@ ...@@ -421,9 +441,9 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_SLIDE, Carousel._dataApiClickHandler); $(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
$(window).on(Event.LOAD, function () { $(window).on(Event.LOAD_DATA_API, function () {
$(Selector.DATA_RIDE).each(function () { $(Selector.DATA_RIDE).each(function () {
var $carousel = $(this); var $carousel = $(this);
Carousel._jQueryInterface.call($carousel, $carousel.data()); Carousel._jQueryInterface.call($carousel, $carousel.data());
......
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
var NAME = 'collapse'; var NAME = 'collapse';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.collapse'; var DATA_KEY = 'bs.collapse';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 600; var TRANSITION_DURATION = 600;
...@@ -48,11 +50,11 @@ ...@@ -48,11 +50,11 @@
}; };
var Event = { var Event = {
SHOW: 'show.bs.collapse', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.collapse', SHOWN: 'shown' + EVENT_KEY,
HIDE: 'hide.bs.collapse', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.collapse', HIDDEN: 'hidden' + EVENT_KEY,
CLICK: 'click.bs.collapse.data-api' CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -119,8 +121,8 @@ ...@@ -119,8 +121,8 @@
return; return;
} }
var activesData = undefined;
var actives = undefined; var actives = undefined;
var activesData = undefined;
if (this._parent) { if (this._parent) {
actives = $.makeArray($(Selector.ACTIVES)); actives = $.makeArray($(Selector.ACTIVES));
...@@ -233,6 +235,17 @@ ...@@ -233,6 +235,17 @@
value: function setTransitioning(isTransitioning) { value: function setTransitioning(isTransitioning) {
this._isTransitioning = isTransitioning; this._isTransitioning = isTransitioning;
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
this._config = null;
this._parent = null;
this._element = null;
this._triggerArray = null;
this._isTransitioning = null;
}
}, { }, {
key: '_getDimension', key: '_getDimension',
...@@ -323,7 +336,7 @@ ...@@ -323,7 +336,7 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_TOGGLE, function (event) { $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
event.preventDefault(); event.preventDefault();
var target = Collapse._getTargetFromElement(this); var target = Collapse._getTargetFromElement(this);
......
...@@ -39,16 +39,18 @@ ...@@ -39,16 +39,18 @@
var NAME = 'dropdown'; var NAME = 'dropdown';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.dropdown'; var DATA_KEY = 'bs.dropdown';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var Event = { var Event = {
HIDE: 'hide.bs.dropdown', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.dropdown', HIDDEN: 'hidden' + EVENT_KEY,
SHOW: 'show.bs.dropdown', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.dropdown', SHOWN: 'shown' + EVENT_KEY,
CLICK: 'click.bs.dropdown', CLICK: 'click' + EVENT_KEY,
KEYDOWN: 'keydown.bs.dropdown.data-api', CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY,
CLICK_DATA: 'click.bs.dropdown.data-api' KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -77,7 +79,9 @@ ...@@ -77,7 +79,9 @@
function Dropdown(element) { function Dropdown(element) {
_classCallCheck(this, Dropdown); _classCallCheck(this, Dropdown);
$(element).on(Event.CLICK, this.toggle); this._element = element;
this._addEventListeners();
} }
_createClass(Dropdown, [{ _createClass(Dropdown, [{
...@@ -125,6 +129,21 @@ ...@@ -125,6 +129,21 @@
return false; return false;
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
$(this._element).off(EVENT_KEY);
this._element = null;
}
}, {
key: '_addEventListeners',
// private
value: function _addEventListeners() {
$(this._element).on(Event.CLICK, this.toggle);
}
}], [{ }], [{
key: 'VERSION', key: 'VERSION',
...@@ -257,7 +276,7 @@ ...@@ -257,7 +276,7 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.KEYDOWN, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA, Dropdown._clearMenus).on(Event.CLICK_DATA, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA, Selector.FORM_CHILD, function (e) { $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
e.stopPropagation(); e.stopPropagation();
}); });
......
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
var NAME = 'modal'; var NAME = 'modal';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.modal'; var DATA_KEY = 'bs.modal';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 300; var TRANSITION_DURATION = 300;
var BACKDROP_TRANSITION_DURATION = 150; var BACKDROP_TRANSITION_DURATION = 150;
...@@ -50,17 +52,17 @@ ...@@ -50,17 +52,17 @@
}; };
var Event = { var Event = {
HIDE: 'hide.bs.modal', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.modal', HIDDEN: 'hidden' + EVENT_KEY,
SHOW: 'show.bs.modal', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.modal', SHOWN: 'shown' + EVENT_KEY,
DISMISS: 'click.dismiss.bs.modal', FOCUSIN: 'focusin' + EVENT_KEY,
KEYDOWN: 'keydown.dismiss.bs.modal', RESIZE: 'resize' + EVENT_KEY,
FOCUSIN: 'focusin.bs.modal', CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,
RESIZE: 'resize.bs.modal', KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,
CLICK: 'click.bs.modal.data-api', MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,
MOUSEDOWN: 'mousedown.dismiss.bs.modal', MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,
MOUSEUP: 'mouseup.dismiss.bs.modal' CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -131,10 +133,10 @@ ...@@ -131,10 +133,10 @@
this._setEscapeEvent(); this._setEscapeEvent();
this._setResizeEvent(); this._setResizeEvent();
$(this._element).on(Event.DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this)); $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this));
$(this._dialog).on(Event.MOUSEDOWN, function () { $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
$(_this._element).one(Event.MOUSEUP, function (event) { $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
if ($(event.target).is(_this._element)) { if ($(event.target).is(_this._element)) {
that._ignoreBackdropClick = true; that._ignoreBackdropClick = true;
} }
...@@ -167,8 +169,8 @@ ...@@ -167,8 +169,8 @@
$(this._element).removeClass(ClassName.IN); $(this._element).removeClass(ClassName.IN);
$(this._element).off(Event.DISMISS); $(this._element).off(Event.CLICK_DISMISS);
$(this._dialog).off(Event.MOUSEDOWN); $(this._dialog).off(Event.MOUSEDOWN_DISMISS);
if (_Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) { if (_Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
...@@ -177,6 +179,26 @@ ...@@ -177,6 +179,26 @@
this._hideModal(); this._hideModal();
} }
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
$(window).off(EVENT_KEY);
$(document).off(EVENT_KEY);
$(this._element).off(EVENT_KEY);
$(this._backdrop).off(EVENT_KEY);
this._config = null;
this._element = null;
this._dialog = null;
this._backdrop = null;
this._isShown = null;
this._isBodyOverflowing = null;
this._ignoreBackdropClick = null;
this._originalBodyPadding = null;
this._scrollbarWidth = null;
}
}, { }, {
key: '_showElement', key: '_showElement',
...@@ -236,13 +258,13 @@ ...@@ -236,13 +258,13 @@
var _this4 = this; var _this4 = this;
if (this._isShown && this._config.keyboard) { if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN, function (event) { $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
if (event.which === 27) { if (event.which === 27) {
_this4.hide(); _this4.hide();
} }
}); });
} else if (!this._isShown) { } else if (!this._isShown) {
$(this._element).off(Event.KEYDOWN); $(this._element).off(Event.KEYDOWN_DISMISS);
} }
} }
}, { }, {
...@@ -294,7 +316,7 @@ ...@@ -294,7 +316,7 @@
$(this._backdrop).appendTo(this.$body); $(this._backdrop).appendTo(this.$body);
$(this._element).on(Event.DISMISS, function (event) { $(this._element).on(Event.CLICK_DISMISS, function (event) {
if (_this6._ignoreBackdropClick) { if (_this6._ignoreBackdropClick) {
_this6._ignoreBackdropClick = false; _this6._ignoreBackdropClick = false;
return; return;
...@@ -459,7 +481,7 @@ ...@@ -459,7 +481,7 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_TOGGLE, function (event) { $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
var _this7 = this; var _this7 = this;
var target = undefined; var target = undefined;
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
var NAME = 'popover'; var NAME = 'popover';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.popover'; var DATA_KEY = 'bs.popover';
var EVENT_KEY = '.' + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var Default = $.extend({}, _Tooltip2.Default, { var Default = $.extend({}, _Tooltip2.Default, {
...@@ -62,16 +63,16 @@ ...@@ -62,16 +63,16 @@
}; };
var Event = { var Event = {
HIDE: 'hide.bs.popover', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.popover', HIDDEN: 'hidden' + EVENT_KEY,
SHOW: 'show.bs.popover', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.popover', SHOWN: 'shown' + EVENT_KEY,
INSERTED: 'inserted.bs.popover', INSERTED: 'inserted' + EVENT_KEY,
CLICK: 'click.bs.popover', CLICK: 'click' + EVENT_KEY,
FOCUSIN: 'focusin.bs.popover', FOCUSIN: 'focusin' + EVENT_KEY,
FOCUSOUT: 'focusout.bs.popover', FOCUSOUT: 'focusout' + EVENT_KEY,
MOUSEENTER: 'mouseenter.bs.popover', MOUSEENTER: 'mouseenter' + EVENT_KEY,
MOUSELEAVE: 'mouseleave.bs.popover' MOUSELEAVE: 'mouseleave' + EVENT_KEY
}; };
/** /**
...@@ -159,6 +160,11 @@ ...@@ -159,6 +160,11 @@
get: function () { get: function () {
return Event; return Event;
} }
}, {
key: 'EVENT_KEY',
get: function () {
return EVENT_KEY;
}
}, { }, {
key: '_jQueryInterface', key: '_jQueryInterface',
......
...@@ -39,6 +39,8 @@ ...@@ -39,6 +39,8 @@
var NAME = 'scrollspy'; var NAME = 'scrollspy';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.scrollspy'; var DATA_KEY = 'bs.scrollspy';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var Default = { var Default = {
...@@ -46,9 +48,9 @@ ...@@ -46,9 +48,9 @@
}; };
var Event = { var Event = {
ACTIVATE: 'activate.bs.scrollspy', ACTIVATE: 'activate' + EVENT_KEY,
SCROLL: 'scroll.bs.scrollspy', SCROLL: 'scroll' + EVENT_KEY,
LOAD: 'load.bs.scrollspy.data-api' LOAD_DATA_API: 'load' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -73,6 +75,7 @@ ...@@ -73,6 +75,7 @@
function ScrollSpy(element, config) { function ScrollSpy(element, config) {
_classCallCheck(this, ScrollSpy); _classCallCheck(this, ScrollSpy);
this._element = element;
this._scrollElement = element.tagName === 'BODY' ? window : element; this._scrollElement = element.tagName === 'BODY' ? window : element;
this._config = $.extend({}, Default, config); this._config = $.extend({}, Default, config);
this._selector = '' + (this._config.target || '') + ' .nav li > a'; this._selector = '' + (this._config.target || '') + ' .nav li > a';
...@@ -131,6 +134,21 @@ ...@@ -131,6 +134,21 @@
_this._targets.push(item[1]); _this._targets.push(item[1]);
}); });
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
$(this._scrollElement).off(EVENT_KEY);
this._element = null;
this._scrollElement = null;
this._config = null;
this._selector = null;
this._offsets = null;
this._targets = null;
this._activeTarget = null;
this._scrollHeight = null;
}
}, { }, {
key: '_getScrollTop', key: '_getScrollTop',
...@@ -257,7 +275,7 @@ ...@@ -257,7 +275,7 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(window).on(Event.LOAD, function () { $(window).on(Event.LOAD_DATA_API, function () {
var scrollSpys = $.makeArray($(Selector.DATA_SPY)); var scrollSpys = $.makeArray($(Selector.DATA_SPY));
for (var i = scrollSpys.length; i--;) { for (var i = scrollSpys.length; i--;) {
......
...@@ -39,15 +39,17 @@ ...@@ -39,15 +39,17 @@
var NAME = 'tab'; var NAME = 'tab';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.tab'; var DATA_KEY = 'bs.tab';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 150; var TRANSITION_DURATION = 150;
var Event = { var Event = {
HIDE: 'hide.bs.tab', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.tab', HIDDEN: 'hidden' + EVENT_KEY,
SHOW: 'show.bs.tab', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.tab', SHOWN: 'shown' + EVENT_KEY,
CLICK: 'click.bs.tab.data-api' CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -151,6 +153,12 @@ ...@@ -151,6 +153,12 @@
complete(); complete();
} }
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeClass(this._element, DATA_KEY);
this._element = null;
}
}, { }, {
key: '_activate', key: '_activate',
...@@ -264,7 +272,7 @@ ...@@ -264,7 +272,7 @@
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_TOGGLE, function (event) { $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
event.preventDefault(); event.preventDefault();
Tab._jQueryInterface.call($(this), 'show'); Tab._jQueryInterface.call($(this), 'show');
}); });
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
var NAME = 'tooltip'; var NAME = 'tooltip';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.tooltip'; var DATA_KEY = 'bs.tooltip';
var EVENT_KEY = '.' + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 150; var TRANSITION_DURATION = 150;
var CLASS_PREFIX = 'bs-tether'; var CLASS_PREFIX = 'bs-tether';
...@@ -69,16 +70,16 @@ ...@@ -69,16 +70,16 @@
}; };
var Event = { var Event = {
HIDE: 'hide.bs.tooltip', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.tooltip', HIDDEN: 'hidden' + EVENT_KEY,
SHOW: 'show.bs.tooltip', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.tooltip', SHOWN: 'shown' + EVENT_KEY,
INSERTED: 'inserted.bs.tooltip', INSERTED: 'inserted' + EVENT_KEY,
CLICK: 'click.bs.tooltip', CLICK: 'click' + EVENT_KEY,
FOCUSIN: 'focusin.bs.tooltip', FOCUSIN: 'focusin' + EVENT_KEY,
FOCUSOUT: 'focusout.bs.tooltip', FOCUSOUT: 'focusout' + EVENT_KEY,
MOUSEENTER: 'mouseenter.bs.tooltip', MOUSEENTER: 'mouseenter' + EVENT_KEY,
MOUSELEAVE: 'mouseleave.bs.tooltip' MOUSELEAVE: 'mouseleave' + EVENT_KEY
}; };
var ClassName = { var ClassName = {
...@@ -172,25 +173,34 @@ ...@@ -172,25 +173,34 @@
} }
} }
}, { }, {
key: 'destroy', key: 'dispose',
value: function destroy() { value: function dispose() {
var _this = this;
clearTimeout(this._timeout); clearTimeout(this._timeout);
this.hide(function () {
$(_this.element).off('.' + _this.constructor.NAME).removeData(_this.constructor.DATA_KEY);
if (_this.tip) { this.cleanupTether();
$(_this.tip).detach();
}
_this.tip = null; $.removeData(this.element, this.constructor.DATA_KEY);
});
$(this.element).off(this.constructor.EVENT_KEY);
if (this.tip) {
$(this.tip).remove();
}
this._isEnabled = null;
this._timeout = null;
this._hoverState = null;
this._activeTrigger = null;
this._tether = null;
this.element = null;
this.config = null;
this.tip = null;
} }
}, { }, {
key: 'show', key: 'show',
value: function show() { value: function show() {
var _this2 = this; var _this = this;
var showEvent = $.Event(this.constructor.Event.SHOW); var showEvent = $.Event(this.constructor.Event.SHOW);
...@@ -239,13 +249,13 @@ ...@@ -239,13 +249,13 @@
$(tip).addClass(ClassName.IN); $(tip).addClass(ClassName.IN);
var complete = function complete() { var complete = function complete() {
var prevHoverState = _this2._hoverState; var prevHoverState = _this._hoverState;
_this2._hoverState = null; _this._hoverState = null;
$(_this2.element).trigger(_this2.constructor.Event.SHOWN); $(_this.element).trigger(_this.constructor.Event.SHOWN);
if (prevHoverState === HoverState.OUT) { if (prevHoverState === HoverState.OUT) {
_this2._leave(null, _this2); _this._leave(null, _this);
} }
}; };
...@@ -255,18 +265,18 @@ ...@@ -255,18 +265,18 @@
}, { }, {
key: 'hide', key: 'hide',
value: function hide(callback) { value: function hide(callback) {
var _this3 = this; var _this2 = this;
var tip = this.getTipElement(); var tip = this.getTipElement();
var hideEvent = $.Event(this.constructor.Event.HIDE); var hideEvent = $.Event(this.constructor.Event.HIDE);
var complete = function complete() { var complete = function complete() {
if (_this3._hoverState !== HoverState.IN && tip.parentNode) { if (_this2._hoverState !== HoverState.IN && tip.parentNode) {
tip.parentNode.removeChild(tip); tip.parentNode.removeChild(tip);
} }
_this3.element.removeAttribute('aria-describedby'); _this2.element.removeAttribute('aria-describedby');
$(_this3.element).trigger(_this3.constructor.Event.HIDDEN); $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
_this3.cleanupTether(); _this2.cleanupTether();
if (callback) { if (callback) {
callback(); callback();
...@@ -351,18 +361,18 @@ ...@@ -351,18 +361,18 @@
}, { }, {
key: '_setListeners', key: '_setListeners',
value: function _setListeners() { value: function _setListeners() {
var _this4 = this; var _this3 = this;
var triggers = this.config.trigger.split(' '); var triggers = this.config.trigger.split(' ');
triggers.forEach(function (trigger) { triggers.forEach(function (trigger) {
if (trigger === 'click') { if (trigger === 'click') {
$(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, $.proxy(_this4.toggle, _this4)); $(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, $.proxy(_this3.toggle, _this3));
} else if (trigger !== Trigger.MANUAL) { } else if (trigger !== Trigger.MANUAL) {
var eventIn = trigger == Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN; var eventIn = trigger == Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;
var eventOut = trigger == Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT; var eventOut = trigger == Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;
$(_this4.element).on(eventIn, _this4.config.selector, $.proxy(_this4._enter, _this4)).on(eventOut, _this4.config.selector, $.proxy(_this4._leave, _this4)); $(_this3.element).on(eventIn, _this3.config.selector, $.proxy(_this3._enter, _this3)).on(eventOut, _this3.config.selector, $.proxy(_this3._leave, _this3));
} }
}); });
...@@ -529,6 +539,11 @@ ...@@ -529,6 +539,11 @@
get: function () { get: function () {
return Event; return Event;
} }
}, {
key: 'EVENT_KEY',
get: function () {
return EVENT_KEY;
}
}, { }, {
key: '_jQueryInterface', key: '_jQueryInterface',
......
...@@ -22,6 +22,8 @@ var Alert = (function ($) { ...@@ -22,6 +22,8 @@ var Alert = (function ($) {
var NAME = 'alert'; var NAME = 'alert';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.alert'; var DATA_KEY = 'bs.alert';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 150; var TRANSITION_DURATION = 150;
...@@ -30,9 +32,9 @@ var Alert = (function ($) { ...@@ -30,9 +32,9 @@ var Alert = (function ($) {
}; };
var Event = { var Event = {
CLOSE: 'close.bs.alert', CLOSE: 'close' + EVENT_KEY,
CLOSED: 'closed.bs.alert', CLOSED: 'closed' + EVENT_KEY,
CLICK: 'click.bs.alert.data-api' CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -71,6 +73,12 @@ var Alert = (function ($) { ...@@ -71,6 +73,12 @@ var Alert = (function ($) {
this._removeElement(rootElement); this._removeElement(rootElement);
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
this._element = null;
}
}, { }, {
key: '_getRootElement', key: '_getRootElement',
...@@ -164,7 +172,7 @@ var Alert = (function ($) { ...@@ -164,7 +172,7 @@ var Alert = (function ($) {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DISMISS, Alert._handleDismiss(new Alert())); $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));
/** /**
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
......
This diff was suppressed by a .gitattributes entry.
...@@ -22,6 +22,8 @@ var Button = (function ($) { ...@@ -22,6 +22,8 @@ var Button = (function ($) {
var NAME = 'button'; var NAME = 'button';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.button'; var DATA_KEY = 'bs.button';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 150; var TRANSITION_DURATION = 150;
...@@ -40,8 +42,8 @@ var Button = (function ($) { ...@@ -40,8 +42,8 @@ var Button = (function ($) {
}; };
var Event = { var Event = {
CLICK: 'click.bs.button.data-api', CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY,
FOCUS_BLUR: 'focus.bs.button.data-api blur.bs.button.data-api' FOCUS_BLUR_DATA_API: 'focus' + EVENT_KEY + '' + DATA_API_KEY + ' ' + ('blur' + EVENT_KEY + '' + DATA_API_KEY)
}; };
/** /**
...@@ -95,6 +97,12 @@ var Button = (function ($) { ...@@ -95,6 +97,12 @@ var Button = (function ($) {
$(this._element).toggleClass(ClassName.ACTIVE); $(this._element).toggleClass(ClassName.ACTIVE);
} }
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
this._element = null;
}
}], [{ }], [{
key: 'VERSION', key: 'VERSION',
...@@ -133,7 +141,7 @@ var Button = (function ($) { ...@@ -133,7 +141,7 @@ var Button = (function ($) {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_TOGGLE_CARROT, function (event) { $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
event.preventDefault(); event.preventDefault();
var button = event.target; var button = event.target;
...@@ -143,7 +151,7 @@ var Button = (function ($) { ...@@ -143,7 +151,7 @@ var Button = (function ($) {
} }
Button._jQueryInterface.call($(button), 'toggle'); Button._jQueryInterface.call($(button), 'toggle');
}).on(Event.FOCUS_BLUR, Selector.DATA_TOGGLE_CARROT, function (event) { }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
var button = $(event.target).closest(Selector.BUTTON)[0]; var button = $(event.target).closest(Selector.BUTTON)[0];
$(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type)); $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type));
}); });
......
This diff was suppressed by a .gitattributes entry.
...@@ -22,6 +22,8 @@ var Carousel = (function ($) { ...@@ -22,6 +22,8 @@ var Carousel = (function ($) {
var NAME = 'carousel'; var NAME = 'carousel';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.carousel'; var DATA_KEY = 'bs.carousel';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 600; var TRANSITION_DURATION = 600;
...@@ -39,10 +41,13 @@ var Carousel = (function ($) { ...@@ -39,10 +41,13 @@ var Carousel = (function ($) {
}; };
var Event = { var Event = {
SLIDE: 'slide.bs.carousel', SLIDE: 'slide' + EVENT_KEY,
SLID: 'slid.bs.carousel', SLID: 'slid' + EVENT_KEY,
CLICK: 'click.bs.carousel.data-api', KEYDOWN: 'keydown' + EVENT_KEY,
LOAD: 'load' MOUSEENTER: 'mouseenter' + EVENT_KEY,
MOUSELEAVE: 'mouseleave' + EVENT_KEY,
LOAD_DATA_API: 'load' + EVENT_KEY + '' + DATA_API_KEY,
CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -166,6 +171,21 @@ var Carousel = (function ($) { ...@@ -166,6 +171,21 @@ var Carousel = (function ($) {
this._slide(direction, this._items[index]); this._slide(direction, this._items[index]);
} }
}, {
key: 'dispose',
value: function dispose() {
$(this._element).off(EVENT_KEY);
$.removeData(this._element, DATA_KEY);
this._items = null;
this._config = null;
this._element = null;
this._interval = null;
this._isPaused = null;
this._isSliding = null;
this._activeElement = null;
this._indicatorsElement = null;
}
}, { }, {
key: '_addEventListeners', key: '_addEventListeners',
...@@ -173,11 +193,11 @@ var Carousel = (function ($) { ...@@ -173,11 +193,11 @@ var Carousel = (function ($) {
value: function _addEventListeners() { value: function _addEventListeners() {
if (this._config.keyboard) { if (this._config.keyboard) {
$(this._element).on('keydown.bs.carousel', $.proxy(this._keydown, this)); $(this._element).on(Event.KEYDOWN, $.proxy(this._keydown, this));
} }
if (this._config.pause == 'hover' && !('ontouchstart' in document.documentElement)) { if (this._config.pause == 'hover' && !('ontouchstart' in document.documentElement)) {
$(this._element).on('mouseenter.bs.carousel', $.proxy(this.pause, this)).on('mouseleave.bs.carousel', $.proxy(this.cycle, this)); $(this._element).on(Event.MOUSEENTER, $.proxy(this.pause, this)).on(Event.MOUSELEAVE, $.proxy(this.cycle, this));
} }
} }
}, { }, {
...@@ -404,9 +424,9 @@ var Carousel = (function ($) { ...@@ -404,9 +424,9 @@ var Carousel = (function ($) {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_SLIDE, Carousel._dataApiClickHandler); $(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler);
$(window).on(Event.LOAD, function () { $(window).on(Event.LOAD_DATA_API, function () {
$(Selector.DATA_RIDE).each(function () { $(Selector.DATA_RIDE).each(function () {
var $carousel = $(this); var $carousel = $(this);
Carousel._jQueryInterface.call($carousel, $carousel.data()); Carousel._jQueryInterface.call($carousel, $carousel.data());
......
This diff was suppressed by a .gitattributes entry.
...@@ -22,6 +22,8 @@ var Collapse = (function ($) { ...@@ -22,6 +22,8 @@ var Collapse = (function ($) {
var NAME = 'collapse'; var NAME = 'collapse';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.collapse'; var DATA_KEY = 'bs.collapse';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 600; var TRANSITION_DURATION = 600;
...@@ -31,11 +33,11 @@ var Collapse = (function ($) { ...@@ -31,11 +33,11 @@ var Collapse = (function ($) {
}; };
var Event = { var Event = {
SHOW: 'show.bs.collapse', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.collapse', SHOWN: 'shown' + EVENT_KEY,
HIDE: 'hide.bs.collapse', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.collapse', HIDDEN: 'hidden' + EVENT_KEY,
CLICK: 'click.bs.collapse.data-api' CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -102,8 +104,8 @@ var Collapse = (function ($) { ...@@ -102,8 +104,8 @@ var Collapse = (function ($) {
return; return;
} }
var activesData = undefined;
var actives = undefined; var actives = undefined;
var activesData = undefined;
if (this._parent) { if (this._parent) {
actives = $.makeArray($(Selector.ACTIVES)); actives = $.makeArray($(Selector.ACTIVES));
...@@ -216,6 +218,17 @@ var Collapse = (function ($) { ...@@ -216,6 +218,17 @@ var Collapse = (function ($) {
value: function setTransitioning(isTransitioning) { value: function setTransitioning(isTransitioning) {
this._isTransitioning = isTransitioning; this._isTransitioning = isTransitioning;
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
this._config = null;
this._parent = null;
this._element = null;
this._triggerArray = null;
this._isTransitioning = null;
}
}, { }, {
key: '_getDimension', key: '_getDimension',
...@@ -306,7 +319,7 @@ var Collapse = (function ($) { ...@@ -306,7 +319,7 @@ var Collapse = (function ($) {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_TOGGLE, function (event) { $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
event.preventDefault(); event.preventDefault();
var target = Collapse._getTargetFromElement(this); var target = Collapse._getTargetFromElement(this);
......
This diff was suppressed by a .gitattributes entry.
...@@ -22,16 +22,18 @@ var Dropdown = (function ($) { ...@@ -22,16 +22,18 @@ var Dropdown = (function ($) {
var NAME = 'dropdown'; var NAME = 'dropdown';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.dropdown'; var DATA_KEY = 'bs.dropdown';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var Event = { var Event = {
HIDE: 'hide.bs.dropdown', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.dropdown', HIDDEN: 'hidden' + EVENT_KEY,
SHOW: 'show.bs.dropdown', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.dropdown', SHOWN: 'shown' + EVENT_KEY,
CLICK: 'click.bs.dropdown', CLICK: 'click' + EVENT_KEY,
KEYDOWN: 'keydown.bs.dropdown.data-api', CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY,
CLICK_DATA: 'click.bs.dropdown.data-api' KEYDOWN_DATA_API: 'keydown' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -60,7 +62,9 @@ var Dropdown = (function ($) { ...@@ -60,7 +62,9 @@ var Dropdown = (function ($) {
function Dropdown(element) { function Dropdown(element) {
_classCallCheck(this, Dropdown); _classCallCheck(this, Dropdown);
$(element).on(Event.CLICK, this.toggle); this._element = element;
this._addEventListeners();
} }
_createClass(Dropdown, [{ _createClass(Dropdown, [{
...@@ -108,6 +112,21 @@ var Dropdown = (function ($) { ...@@ -108,6 +112,21 @@ var Dropdown = (function ($) {
return false; return false;
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
$(this._element).off(EVENT_KEY);
this._element = null;
}
}, {
key: '_addEventListeners',
// private
value: function _addEventListeners() {
$(this._element).on(Event.CLICK, this.toggle);
}
}], [{ }], [{
key: 'VERSION', key: 'VERSION',
...@@ -240,7 +259,7 @@ var Dropdown = (function ($) { ...@@ -240,7 +259,7 @@ var Dropdown = (function ($) {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.KEYDOWN, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA, Dropdown._clearMenus).on(Event.CLICK_DATA, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA, Selector.FORM_CHILD, function (e) { $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
e.stopPropagation(); e.stopPropagation();
}); });
......
This diff was suppressed by a .gitattributes entry.
...@@ -22,6 +22,8 @@ var Modal = (function ($) { ...@@ -22,6 +22,8 @@ var Modal = (function ($) {
var NAME = 'modal'; var NAME = 'modal';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.modal'; var DATA_KEY = 'bs.modal';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 300; var TRANSITION_DURATION = 300;
var BACKDROP_TRANSITION_DURATION = 150; var BACKDROP_TRANSITION_DURATION = 150;
...@@ -33,17 +35,17 @@ var Modal = (function ($) { ...@@ -33,17 +35,17 @@ var Modal = (function ($) {
}; };
var Event = { var Event = {
HIDE: 'hide.bs.modal', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.modal', HIDDEN: 'hidden' + EVENT_KEY,
SHOW: 'show.bs.modal', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.modal', SHOWN: 'shown' + EVENT_KEY,
DISMISS: 'click.dismiss.bs.modal', FOCUSIN: 'focusin' + EVENT_KEY,
KEYDOWN: 'keydown.dismiss.bs.modal', RESIZE: 'resize' + EVENT_KEY,
FOCUSIN: 'focusin.bs.modal', CLICK_DISMISS: 'click.dismiss' + EVENT_KEY,
RESIZE: 'resize.bs.modal', KEYDOWN_DISMISS: 'keydown.dismiss' + EVENT_KEY,
CLICK: 'click.bs.modal.data-api', MOUSEUP_DISMISS: 'mouseup.dismiss' + EVENT_KEY,
MOUSEDOWN: 'mousedown.dismiss.bs.modal', MOUSEDOWN_DISMISS: 'mousedown.dismiss' + EVENT_KEY,
MOUSEUP: 'mouseup.dismiss.bs.modal' CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -114,10 +116,10 @@ var Modal = (function ($) { ...@@ -114,10 +116,10 @@ var Modal = (function ($) {
this._setEscapeEvent(); this._setEscapeEvent();
this._setResizeEvent(); this._setResizeEvent();
$(this._element).on(Event.DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this)); $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, $.proxy(this.hide, this));
$(this._dialog).on(Event.MOUSEDOWN, function () { $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () {
$(_this._element).one(Event.MOUSEUP, function (event) { $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) {
if ($(event.target).is(_this._element)) { if ($(event.target).is(_this._element)) {
that._ignoreBackdropClick = true; that._ignoreBackdropClick = true;
} }
...@@ -150,8 +152,8 @@ var Modal = (function ($) { ...@@ -150,8 +152,8 @@ var Modal = (function ($) {
$(this._element).removeClass(ClassName.IN); $(this._element).removeClass(ClassName.IN);
$(this._element).off(Event.DISMISS); $(this._element).off(Event.CLICK_DISMISS);
$(this._dialog).off(Event.MOUSEDOWN); $(this._dialog).off(Event.MOUSEDOWN_DISMISS);
if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) { if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) {
...@@ -160,6 +162,26 @@ var Modal = (function ($) { ...@@ -160,6 +162,26 @@ var Modal = (function ($) {
this._hideModal(); this._hideModal();
} }
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
$(window).off(EVENT_KEY);
$(document).off(EVENT_KEY);
$(this._element).off(EVENT_KEY);
$(this._backdrop).off(EVENT_KEY);
this._config = null;
this._element = null;
this._dialog = null;
this._backdrop = null;
this._isShown = null;
this._isBodyOverflowing = null;
this._ignoreBackdropClick = null;
this._originalBodyPadding = null;
this._scrollbarWidth = null;
}
}, { }, {
key: '_showElement', key: '_showElement',
...@@ -219,13 +241,13 @@ var Modal = (function ($) { ...@@ -219,13 +241,13 @@ var Modal = (function ($) {
var _this4 = this; var _this4 = this;
if (this._isShown && this._config.keyboard) { if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN, function (event) { $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
if (event.which === 27) { if (event.which === 27) {
_this4.hide(); _this4.hide();
} }
}); });
} else if (!this._isShown) { } else if (!this._isShown) {
$(this._element).off(Event.KEYDOWN); $(this._element).off(Event.KEYDOWN_DISMISS);
} }
} }
}, { }, {
...@@ -277,7 +299,7 @@ var Modal = (function ($) { ...@@ -277,7 +299,7 @@ var Modal = (function ($) {
$(this._backdrop).appendTo(this.$body); $(this._backdrop).appendTo(this.$body);
$(this._element).on(Event.DISMISS, function (event) { $(this._element).on(Event.CLICK_DISMISS, function (event) {
if (_this6._ignoreBackdropClick) { if (_this6._ignoreBackdropClick) {
_this6._ignoreBackdropClick = false; _this6._ignoreBackdropClick = false;
return; return;
...@@ -442,7 +464,7 @@ var Modal = (function ($) { ...@@ -442,7 +464,7 @@ var Modal = (function ($) {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_TOGGLE, function (event) { $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
var _this7 = this; var _this7 = this;
var target = undefined; var target = undefined;
......
This diff was suppressed by a .gitattributes entry.
...@@ -24,6 +24,7 @@ var Popover = (function ($) { ...@@ -24,6 +24,7 @@ var Popover = (function ($) {
var NAME = 'popover'; var NAME = 'popover';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.popover'; var DATA_KEY = 'bs.popover';
var EVENT_KEY = '.' + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var Default = $.extend({}, Tooltip.Default, { var Default = $.extend({}, Tooltip.Default, {
...@@ -45,16 +46,16 @@ var Popover = (function ($) { ...@@ -45,16 +46,16 @@ var Popover = (function ($) {
}; };
var Event = { var Event = {
HIDE: 'hide.bs.popover', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.popover', HIDDEN: 'hidden' + EVENT_KEY,
SHOW: 'show.bs.popover', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.popover', SHOWN: 'shown' + EVENT_KEY,
INSERTED: 'inserted.bs.popover', INSERTED: 'inserted' + EVENT_KEY,
CLICK: 'click.bs.popover', CLICK: 'click' + EVENT_KEY,
FOCUSIN: 'focusin.bs.popover', FOCUSIN: 'focusin' + EVENT_KEY,
FOCUSOUT: 'focusout.bs.popover', FOCUSOUT: 'focusout' + EVENT_KEY,
MOUSEENTER: 'mouseenter.bs.popover', MOUSEENTER: 'mouseenter' + EVENT_KEY,
MOUSELEAVE: 'mouseleave.bs.popover' MOUSELEAVE: 'mouseleave' + EVENT_KEY
}; };
/** /**
...@@ -142,6 +143,11 @@ var Popover = (function ($) { ...@@ -142,6 +143,11 @@ var Popover = (function ($) {
get: function () { get: function () {
return Event; return Event;
} }
}, {
key: 'EVENT_KEY',
get: function () {
return EVENT_KEY;
}
}, { }, {
key: '_jQueryInterface', key: '_jQueryInterface',
......
This diff was suppressed by a .gitattributes entry.
...@@ -22,6 +22,8 @@ var ScrollSpy = (function ($) { ...@@ -22,6 +22,8 @@ var ScrollSpy = (function ($) {
var NAME = 'scrollspy'; var NAME = 'scrollspy';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.scrollspy'; var DATA_KEY = 'bs.scrollspy';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var Default = { var Default = {
...@@ -29,9 +31,9 @@ var ScrollSpy = (function ($) { ...@@ -29,9 +31,9 @@ var ScrollSpy = (function ($) {
}; };
var Event = { var Event = {
ACTIVATE: 'activate.bs.scrollspy', ACTIVATE: 'activate' + EVENT_KEY,
SCROLL: 'scroll.bs.scrollspy', SCROLL: 'scroll' + EVENT_KEY,
LOAD: 'load.bs.scrollspy.data-api' LOAD_DATA_API: 'load' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -56,6 +58,7 @@ var ScrollSpy = (function ($) { ...@@ -56,6 +58,7 @@ var ScrollSpy = (function ($) {
function ScrollSpy(element, config) { function ScrollSpy(element, config) {
_classCallCheck(this, ScrollSpy); _classCallCheck(this, ScrollSpy);
this._element = element;
this._scrollElement = element.tagName === 'BODY' ? window : element; this._scrollElement = element.tagName === 'BODY' ? window : element;
this._config = $.extend({}, Default, config); this._config = $.extend({}, Default, config);
this._selector = '' + (this._config.target || '') + ' .nav li > a'; this._selector = '' + (this._config.target || '') + ' .nav li > a';
...@@ -114,6 +117,21 @@ var ScrollSpy = (function ($) { ...@@ -114,6 +117,21 @@ var ScrollSpy = (function ($) {
_this._targets.push(item[1]); _this._targets.push(item[1]);
}); });
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeData(this._element, DATA_KEY);
$(this._scrollElement).off(EVENT_KEY);
this._element = null;
this._scrollElement = null;
this._config = null;
this._selector = null;
this._offsets = null;
this._targets = null;
this._activeTarget = null;
this._scrollHeight = null;
}
}, { }, {
key: '_getScrollTop', key: '_getScrollTop',
...@@ -240,7 +258,7 @@ var ScrollSpy = (function ($) { ...@@ -240,7 +258,7 @@ var ScrollSpy = (function ($) {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(window).on(Event.LOAD, function () { $(window).on(Event.LOAD_DATA_API, function () {
var scrollSpys = $.makeArray($(Selector.DATA_SPY)); var scrollSpys = $.makeArray($(Selector.DATA_SPY));
for (var i = scrollSpys.length; i--;) { for (var i = scrollSpys.length; i--;) {
......
This diff was suppressed by a .gitattributes entry.
...@@ -22,15 +22,17 @@ var Tab = (function ($) { ...@@ -22,15 +22,17 @@ var Tab = (function ($) {
var NAME = 'tab'; var NAME = 'tab';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.tab'; var DATA_KEY = 'bs.tab';
var EVENT_KEY = '.' + DATA_KEY;
var DATA_API_KEY = '.data-api';
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 150; var TRANSITION_DURATION = 150;
var Event = { var Event = {
HIDE: 'hide.bs.tab', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.tab', HIDDEN: 'hidden' + EVENT_KEY,
SHOW: 'show.bs.tab', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.tab', SHOWN: 'shown' + EVENT_KEY,
CLICK: 'click.bs.tab.data-api' CLICK_DATA_API: 'click' + EVENT_KEY + '' + DATA_API_KEY
}; };
var ClassName = { var ClassName = {
...@@ -134,6 +136,12 @@ var Tab = (function ($) { ...@@ -134,6 +136,12 @@ var Tab = (function ($) {
complete(); complete();
} }
} }
}, {
key: 'dispose',
value: function dispose() {
$.removeClass(this._element, DATA_KEY);
this._element = null;
}
}, { }, {
key: '_activate', key: '_activate',
...@@ -247,7 +255,7 @@ var Tab = (function ($) { ...@@ -247,7 +255,7 @@ var Tab = (function ($) {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_TOGGLE, function (event) { $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
event.preventDefault(); event.preventDefault();
Tab._jQueryInterface.call($(this), 'show'); Tab._jQueryInterface.call($(this), 'show');
}); });
......
This diff was suppressed by a .gitattributes entry.
...@@ -22,6 +22,7 @@ var Tooltip = (function ($) { ...@@ -22,6 +22,7 @@ var Tooltip = (function ($) {
var NAME = 'tooltip'; var NAME = 'tooltip';
var VERSION = '4.0.0'; var VERSION = '4.0.0';
var DATA_KEY = 'bs.tooltip'; var DATA_KEY = 'bs.tooltip';
var EVENT_KEY = '.' + DATA_KEY;
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var TRANSITION_DURATION = 150; var TRANSITION_DURATION = 150;
var CLASS_PREFIX = 'bs-tether'; var CLASS_PREFIX = 'bs-tether';
...@@ -52,16 +53,16 @@ var Tooltip = (function ($) { ...@@ -52,16 +53,16 @@ var Tooltip = (function ($) {
}; };
var Event = { var Event = {
HIDE: 'hide.bs.tooltip', HIDE: 'hide' + EVENT_KEY,
HIDDEN: 'hidden.bs.tooltip', HIDDEN: 'hidden' + EVENT_KEY,
SHOW: 'show.bs.tooltip', SHOW: 'show' + EVENT_KEY,
SHOWN: 'shown.bs.tooltip', SHOWN: 'shown' + EVENT_KEY,
INSERTED: 'inserted.bs.tooltip', INSERTED: 'inserted' + EVENT_KEY,
CLICK: 'click.bs.tooltip', CLICK: 'click' + EVENT_KEY,
FOCUSIN: 'focusin.bs.tooltip', FOCUSIN: 'focusin' + EVENT_KEY,
FOCUSOUT: 'focusout.bs.tooltip', FOCUSOUT: 'focusout' + EVENT_KEY,
MOUSEENTER: 'mouseenter.bs.tooltip', MOUSEENTER: 'mouseenter' + EVENT_KEY,
MOUSELEAVE: 'mouseleave.bs.tooltip' MOUSELEAVE: 'mouseleave' + EVENT_KEY
}; };
var ClassName = { var ClassName = {
...@@ -155,25 +156,34 @@ var Tooltip = (function ($) { ...@@ -155,25 +156,34 @@ var Tooltip = (function ($) {
} }
} }
}, { }, {
key: 'destroy', key: 'dispose',
value: function destroy() { value: function dispose() {
var _this = this;
clearTimeout(this._timeout); clearTimeout(this._timeout);
this.hide(function () {
$(_this.element).off('.' + _this.constructor.NAME).removeData(_this.constructor.DATA_KEY);
if (_this.tip) { this.cleanupTether();
$(_this.tip).detach();
}
_this.tip = null; $.removeData(this.element, this.constructor.DATA_KEY);
});
$(this.element).off(this.constructor.EVENT_KEY);
if (this.tip) {
$(this.tip).remove();
}
this._isEnabled = null;
this._timeout = null;
this._hoverState = null;
this._activeTrigger = null;
this._tether = null;
this.element = null;
this.config = null;
this.tip = null;
} }
}, { }, {
key: 'show', key: 'show',
value: function show() { value: function show() {
var _this2 = this; var _this = this;
var showEvent = $.Event(this.constructor.Event.SHOW); var showEvent = $.Event(this.constructor.Event.SHOW);
...@@ -222,13 +232,13 @@ var Tooltip = (function ($) { ...@@ -222,13 +232,13 @@ var Tooltip = (function ($) {
$(tip).addClass(ClassName.IN); $(tip).addClass(ClassName.IN);
var complete = function complete() { var complete = function complete() {
var prevHoverState = _this2._hoverState; var prevHoverState = _this._hoverState;
_this2._hoverState = null; _this._hoverState = null;
$(_this2.element).trigger(_this2.constructor.Event.SHOWN); $(_this.element).trigger(_this.constructor.Event.SHOWN);
if (prevHoverState === HoverState.OUT) { if (prevHoverState === HoverState.OUT) {
_this2._leave(null, _this2); _this._leave(null, _this);
} }
}; };
...@@ -238,18 +248,18 @@ var Tooltip = (function ($) { ...@@ -238,18 +248,18 @@ var Tooltip = (function ($) {
}, { }, {
key: 'hide', key: 'hide',
value: function hide(callback) { value: function hide(callback) {
var _this3 = this; var _this2 = this;
var tip = this.getTipElement(); var tip = this.getTipElement();
var hideEvent = $.Event(this.constructor.Event.HIDE); var hideEvent = $.Event(this.constructor.Event.HIDE);
var complete = function complete() { var complete = function complete() {
if (_this3._hoverState !== HoverState.IN && tip.parentNode) { if (_this2._hoverState !== HoverState.IN && tip.parentNode) {
tip.parentNode.removeChild(tip); tip.parentNode.removeChild(tip);
} }
_this3.element.removeAttribute('aria-describedby'); _this2.element.removeAttribute('aria-describedby');
$(_this3.element).trigger(_this3.constructor.Event.HIDDEN); $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);
_this3.cleanupTether(); _this2.cleanupTether();
if (callback) { if (callback) {
callback(); callback();
...@@ -334,18 +344,18 @@ var Tooltip = (function ($) { ...@@ -334,18 +344,18 @@ var Tooltip = (function ($) {
}, { }, {
key: '_setListeners', key: '_setListeners',
value: function _setListeners() { value: function _setListeners() {
var _this4 = this; var _this3 = this;
var triggers = this.config.trigger.split(' '); var triggers = this.config.trigger.split(' ');
triggers.forEach(function (trigger) { triggers.forEach(function (trigger) {
if (trigger === 'click') { if (trigger === 'click') {
$(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, $.proxy(_this4.toggle, _this4)); $(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, $.proxy(_this3.toggle, _this3));
} else if (trigger !== Trigger.MANUAL) { } else if (trigger !== Trigger.MANUAL) {
var eventIn = trigger == Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN; var eventIn = trigger == Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN;
var eventOut = trigger == Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT; var eventOut = trigger == Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT;
$(_this4.element).on(eventIn, _this4.config.selector, $.proxy(_this4._enter, _this4)).on(eventOut, _this4.config.selector, $.proxy(_this4._leave, _this4)); $(_this3.element).on(eventIn, _this3.config.selector, $.proxy(_this3._enter, _this3)).on(eventOut, _this3.config.selector, $.proxy(_this3._leave, _this3));
} }
}); });
...@@ -512,6 +522,11 @@ var Tooltip = (function ($) { ...@@ -512,6 +522,11 @@ var Tooltip = (function ($) {
get: function () { get: function () {
return Event; return Event;
} }
}, {
key: 'EVENT_KEY',
get: function () {
return EVENT_KEY;
}
}, { }, {
key: '_jQueryInterface', key: '_jQueryInterface',
......
This diff was suppressed by a .gitattributes entry.
...@@ -20,6 +20,8 @@ const Alert = (($) => { ...@@ -20,6 +20,8 @@ const Alert = (($) => {
const NAME = 'alert' const NAME = 'alert'
const VERSION = '4.0.0' const VERSION = '4.0.0'
const DATA_KEY = 'bs.alert' const DATA_KEY = 'bs.alert'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const TRANSITION_DURATION = 150 const TRANSITION_DURATION = 150
...@@ -28,9 +30,9 @@ const Alert = (($) => { ...@@ -28,9 +30,9 @@ const Alert = (($) => {
} }
const Event = { const Event = {
CLOSE : 'close.bs.alert', CLOSE : `close${EVENT_KEY}`,
CLOSED : 'closed.bs.alert', CLOSED : `closed${EVENT_KEY}`,
CLICK : 'click.bs.alert.data-api' CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
} }
const ClassName = { const ClassName = {
...@@ -75,6 +77,11 @@ const Alert = (($) => { ...@@ -75,6 +77,11 @@ const Alert = (($) => {
this._removeElement(rootElement) this._removeElement(rootElement)
} }
dispose() {
$.removeData(this._element, DATA_KEY)
this._element = null
}
// private // private
...@@ -159,7 +166,7 @@ const Alert = (($) => { ...@@ -159,7 +166,7 @@ const Alert = (($) => {
*/ */
$(document).on( $(document).on(
Event.CLICK, Event.CLICK_DATA_API,
Selector.DISMISS, Selector.DISMISS,
Alert._handleDismiss(new Alert()) Alert._handleDismiss(new Alert())
) )
......
...@@ -17,6 +17,8 @@ const Button = (($) => { ...@@ -17,6 +17,8 @@ const Button = (($) => {
const NAME = 'button' const NAME = 'button'
const VERSION = '4.0.0' const VERSION = '4.0.0'
const DATA_KEY = 'bs.button' const DATA_KEY = 'bs.button'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const TRANSITION_DURATION = 150 const TRANSITION_DURATION = 150
...@@ -35,8 +37,9 @@ const Button = (($) => { ...@@ -35,8 +37,9 @@ const Button = (($) => {
} }
const Event = { const Event = {
CLICK : 'click.bs.button.data-api', CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
FOCUS_BLUR : 'focus.bs.button.data-api blur.bs.button.data-api' FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} `
+ `blur${EVENT_KEY}${DATA_API_KEY}`
} }
...@@ -101,6 +104,11 @@ const Button = (($) => { ...@@ -101,6 +104,11 @@ const Button = (($) => {
} }
} }
dispose() {
$.removeData(this._element, DATA_KEY)
this._element = null
}
// static // static
...@@ -129,7 +137,7 @@ const Button = (($) => { ...@@ -129,7 +137,7 @@ const Button = (($) => {
*/ */
$(document) $(document)
.on(Event.CLICK, Selector.DATA_TOGGLE_CARROT, function (event) { .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
event.preventDefault() event.preventDefault()
let button = event.target let button = event.target
...@@ -140,7 +148,7 @@ const Button = (($) => { ...@@ -140,7 +148,7 @@ const Button = (($) => {
Button._jQueryInterface.call($(button), 'toggle') Button._jQueryInterface.call($(button), 'toggle')
}) })
.on(Event.FOCUS_BLUR, Selector.DATA_TOGGLE_CARROT, function (event) { .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) {
var button = $(event.target).closest(Selector.BUTTON)[0] var button = $(event.target).closest(Selector.BUTTON)[0]
$(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type)) $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))
}) })
......
...@@ -20,6 +20,8 @@ const Carousel = (($) => { ...@@ -20,6 +20,8 @@ const Carousel = (($) => {
const NAME = 'carousel' const NAME = 'carousel'
const VERSION = '4.0.0' const VERSION = '4.0.0'
const DATA_KEY = 'bs.carousel' const DATA_KEY = 'bs.carousel'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const TRANSITION_DURATION = 600 const TRANSITION_DURATION = 600
...@@ -37,10 +39,13 @@ const Carousel = (($) => { ...@@ -37,10 +39,13 @@ const Carousel = (($) => {
} }
const Event = { const Event = {
SLIDE : 'slide.bs.carousel', SLIDE : `slide${EVENT_KEY}`,
SLID : 'slid.bs.carousel', SLID : `slid${EVENT_KEY}`,
CLICK : 'click.bs.carousel.data-api', KEYDOWN : `keydown${EVENT_KEY}`,
LOAD : 'load' MOUSEENTER : `mouseenter${EVENT_KEY}`,
MOUSELEAVE : `mouseleave${EVENT_KEY}`,
LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
} }
const ClassName = { const ClassName = {
...@@ -171,20 +176,34 @@ const Carousel = (($) => { ...@@ -171,20 +176,34 @@ const Carousel = (($) => {
this._slide(direction, this._items[index]) this._slide(direction, this._items[index])
} }
dispose() {
$(this._element).off(EVENT_KEY)
$.removeData(this._element, DATA_KEY)
this._items = null
this._config = null
this._element = null
this._interval = null
this._isPaused = null
this._isSliding = null
this._activeElement = null
this._indicatorsElement = null
}
// private // private
_addEventListeners() { _addEventListeners() {
if (this._config.keyboard) { if (this._config.keyboard) {
$(this._element) $(this._element)
.on('keydown.bs.carousel', $.proxy(this._keydown, this)) .on(Event.KEYDOWN, $.proxy(this._keydown, this))
} }
if (this._config.pause == 'hover' && if (this._config.pause == 'hover' &&
!('ontouchstart' in document.documentElement)) { !('ontouchstart' in document.documentElement)) {
$(this._element) $(this._element)
.on('mouseenter.bs.carousel', $.proxy(this.pause, this)) .on(Event.MOUSEENTER, $.proxy(this.pause, this))
.on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) .on(Event.MOUSELEAVE, $.proxy(this.cycle, this))
} }
} }
...@@ -405,9 +424,9 @@ const Carousel = (($) => { ...@@ -405,9 +424,9 @@ const Carousel = (($) => {
*/ */
$(document) $(document)
.on(Event.CLICK, Selector.DATA_SLIDE, Carousel._dataApiClickHandler) .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)
$(window).on(Event.LOAD, function () { $(window).on(Event.LOAD_DATA_API, function () {
$(Selector.DATA_RIDE).each(function () { $(Selector.DATA_RIDE).each(function () {
let $carousel = $(this) let $carousel = $(this)
Carousel._jQueryInterface.call($carousel, $carousel.data()) Carousel._jQueryInterface.call($carousel, $carousel.data())
......
...@@ -20,6 +20,8 @@ const Collapse = (($) => { ...@@ -20,6 +20,8 @@ const Collapse = (($) => {
const NAME = 'collapse' const NAME = 'collapse'
const VERSION = '4.0.0' const VERSION = '4.0.0'
const DATA_KEY = 'bs.collapse' const DATA_KEY = 'bs.collapse'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const TRANSITION_DURATION = 600 const TRANSITION_DURATION = 600
...@@ -29,11 +31,11 @@ const Collapse = (($) => { ...@@ -29,11 +31,11 @@ const Collapse = (($) => {
} }
const Event = { const Event = {
SHOW : 'show.bs.collapse', SHOW : `show${EVENT_KEY}`,
SHOWN : 'shown.bs.collapse', SHOWN : `shown${EVENT_KEY}`,
HIDE : 'hide.bs.collapse', HIDE : `hide${EVENT_KEY}`,
HIDDEN : 'hidden.bs.collapse', HIDDEN : `hidden${EVENT_KEY}`,
CLICK : 'click.bs.collapse.data-api' CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
} }
const ClassName = { const ClassName = {
...@@ -110,8 +112,8 @@ const Collapse = (($) => { ...@@ -110,8 +112,8 @@ const Collapse = (($) => {
return return
} }
let activesData
let actives let actives
let activesData
if (this._parent) { if (this._parent) {
actives = $.makeArray($(Selector.ACTIVES)) actives = $.makeArray($(Selector.ACTIVES))
...@@ -244,6 +246,16 @@ const Collapse = (($) => { ...@@ -244,6 +246,16 @@ const Collapse = (($) => {
this._isTransitioning = isTransitioning this._isTransitioning = isTransitioning
} }
dispose() {
$.removeData(this._element, DATA_KEY)
this._config = null
this._parent = null
this._element = null
this._triggerArray = null
this._isTransitioning = null
}
// private // private
...@@ -323,7 +335,7 @@ const Collapse = (($) => { ...@@ -323,7 +335,7 @@ const Collapse = (($) => {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_TOGGLE, function (event) { $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
event.preventDefault() event.preventDefault()
let target = Collapse._getTargetFromElement(this) let target = Collapse._getTargetFromElement(this)
......
...@@ -20,16 +20,18 @@ const Dropdown = (($) => { ...@@ -20,16 +20,18 @@ const Dropdown = (($) => {
const NAME = 'dropdown' const NAME = 'dropdown'
const VERSION = '4.0.0' const VERSION = '4.0.0'
const DATA_KEY = 'bs.dropdown' const DATA_KEY = 'bs.dropdown'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const Event = { const Event = {
HIDE   : 'hide.bs.dropdown', HIDE   : `hide${EVENT_KEY}`,
HIDDEN   : 'hidden.bs.dropdown', HIDDEN   : `hidden${EVENT_KEY}`,
SHOW   : 'show.bs.dropdown', SHOW   : `show${EVENT_KEY}`,
SHOWN   : 'shown.bs.dropdown', SHOWN   : `shown${EVENT_KEY}`,
CLICK   : 'click.bs.dropdown', CLICK   : `click${EVENT_KEY}`,
KEYDOWN   : 'keydown.bs.dropdown.data-api', CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
CLICK_DATA : 'click.bs.dropdown.data-api' KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`
} }
const ClassName = { const ClassName = {
...@@ -59,7 +61,9 @@ const Dropdown = (($) => { ...@@ -59,7 +61,9 @@ const Dropdown = (($) => {
class Dropdown { class Dropdown {
constructor(element) { constructor(element) {
$(element).on(Event.CLICK, this.toggle) this._element = element
this._addEventListeners()
} }
...@@ -114,6 +118,19 @@ const Dropdown = (($) => { ...@@ -114,6 +118,19 @@ const Dropdown = (($) => {
return false return false
} }
dispose() {
$.removeData(this._element, DATA_KEY)
$(this._element).off(EVENT_KEY)
this._element = null
}
// private
_addEventListeners() {
$(this._element).on(Event.CLICK, this.toggle)
}
// static // static
...@@ -239,12 +256,12 @@ const Dropdown = (($) => { ...@@ -239,12 +256,12 @@ const Dropdown = (($) => {
*/ */
$(document) $(document)
.on(Event.KEYDOWN, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler) .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)
.on(Event.KEYDOWN, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler) .on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler)
.on(Event.KEYDOWN, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler) .on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler)
.on(Event.CLICK_DATA, Dropdown._clearMenus) .on(Event.CLICK_DATA_API, Dropdown._clearMenus)
.on(Event.CLICK_DATA, Selector.DATA_TOGGLE, Dropdown.prototype.toggle) .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle)
.on(Event.CLICK_DATA, Selector.FORM_CHILD, function (e) { .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) {
e.stopPropagation() e.stopPropagation()
}) })
......
...@@ -20,6 +20,8 @@ const Modal = (($) => { ...@@ -20,6 +20,8 @@ const Modal = (($) => {
const NAME = 'modal' const NAME = 'modal'
const VERSION = '4.0.0' const VERSION = '4.0.0'
const DATA_KEY = 'bs.modal' const DATA_KEY = 'bs.modal'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const TRANSITION_DURATION = 300 const TRANSITION_DURATION = 300
const BACKDROP_TRANSITION_DURATION = 150 const BACKDROP_TRANSITION_DURATION = 150
...@@ -31,17 +33,17 @@ const Modal = (($) => { ...@@ -31,17 +33,17 @@ const Modal = (($) => {
} }
const Event = { const Event = {
HIDE   : 'hide.bs.modal', HIDE   : `hide${EVENT_KEY}`,
HIDDEN   : 'hidden.bs.modal', HIDDEN   : `hidden${EVENT_KEY}`,
SHOW   : 'show.bs.modal', SHOW   : `show${EVENT_KEY}`,
SHOWN   : 'shown.bs.modal', SHOWN   : `shown${EVENT_KEY}`,
DISMISS : 'click.dismiss.bs.modal', FOCUSIN : `focusin${EVENT_KEY}`,
KEYDOWN : 'keydown.dismiss.bs.modal', RESIZE : `resize${EVENT_KEY}`,
FOCUSIN : 'focusin.bs.modal', CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,
RESIZE : 'resize.bs.modal', KEYDOWN_DISMISS : `keydown.dismiss${EVENT_KEY}`,
CLICK : 'click.bs.modal.data-api', MOUSEUP_DISMISS : `mouseup.dismiss${EVENT_KEY}`,
MOUSEDOWN : 'mousedown.dismiss.bs.modal', MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,
MOUSEUP : 'mouseup.dismiss.bs.modal' CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
} }
const ClassName = { const ClassName = {
...@@ -119,13 +121,13 @@ const Modal = (($) => { ...@@ -119,13 +121,13 @@ const Modal = (($) => {
this._setResizeEvent() this._setResizeEvent()
$(this._element).on( $(this._element).on(
Event.DISMISS, Event.CLICK_DISMISS,
Selector.DATA_DISMISS, Selector.DATA_DISMISS,
$.proxy(this.hide, this) $.proxy(this.hide, this)
) )
$(this._dialog).on(Event.MOUSEDOWN, () => { $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {
$(this._element).one(Event.MOUSEUP, (event) => { $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {
if ($(event.target).is(this._element)) { if ($(event.target).is(this._element)) {
that._ignoreBackdropClick = true that._ignoreBackdropClick = true
} }
...@@ -159,8 +161,8 @@ const Modal = (($) => { ...@@ -159,8 +161,8 @@ const Modal = (($) => {
$(this._element).removeClass(ClassName.IN) $(this._element).removeClass(ClassName.IN)
$(this._element).off(Event.DISMISS) $(this._element).off(Event.CLICK_DISMISS)
$(this._dialog).off(Event.MOUSEDOWN) $(this._dialog).off(Event.MOUSEDOWN_DISMISS)
if (Util.supportsTransitionEnd() && if (Util.supportsTransitionEnd() &&
($(this._element).hasClass(ClassName.FADE))) { ($(this._element).hasClass(ClassName.FADE))) {
...@@ -173,6 +175,25 @@ const Modal = (($) => { ...@@ -173,6 +175,25 @@ const Modal = (($) => {
} }
} }
dispose() {
$.removeData(this._element, DATA_KEY)
$(window).off(EVENT_KEY)
$(document).off(EVENT_KEY)
$(this._element).off(EVENT_KEY)
$(this._backdrop).off(EVENT_KEY)
this._config = null
this._element = null
this._dialog = null
this._backdrop = null
this._isShown = null
this._isBodyOverflowing = null
this._ignoreBackdropClick = null
this._originalBodyPadding = null
this._scrollbarWidth = null
}
// private // private
...@@ -228,14 +249,14 @@ const Modal = (($) => { ...@@ -228,14 +249,14 @@ const Modal = (($) => {
_setEscapeEvent() { _setEscapeEvent() {
if (this._isShown && this._config.keyboard) { if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN, (event) => { $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {
if (event.which === 27) { if (event.which === 27) {
this.hide() this.hide()
} }
}) })
} else if (!this._isShown) { } else if (!this._isShown) {
$(this._element).off(Event.KEYDOWN) $(this._element).off(Event.KEYDOWN_DISMISS)
} }
} }
...@@ -280,7 +301,7 @@ const Modal = (($) => { ...@@ -280,7 +301,7 @@ const Modal = (($) => {
$(this._backdrop).appendTo(this.$body) $(this._backdrop).appendTo(this.$body)
$(this._element).on(Event.DISMISS, (event) => { $(this._element).on(Event.CLICK_DISMISS, (event) => {
if (this._ignoreBackdropClick) { if (this._ignoreBackdropClick) {
this._ignoreBackdropClick = false this._ignoreBackdropClick = false
return return
...@@ -440,7 +461,7 @@ const Modal = (($) => { ...@@ -440,7 +461,7 @@ const Modal = (($) => {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(document).on(Event.CLICK, Selector.DATA_TOGGLE, function (event) { $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
let target let target
let selector = Util.getSelectorFromElement(this) let selector = Util.getSelectorFromElement(this)
......
...@@ -20,6 +20,7 @@ const Popover = (($) => { ...@@ -20,6 +20,7 @@ const Popover = (($) => {
const NAME = 'popover' const NAME = 'popover'
const VERSION = '4.0.0' const VERSION = '4.0.0'
const DATA_KEY = 'bs.popover' const DATA_KEY = 'bs.popover'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const Default = $.extend({}, Tooltip.Default, { const Default = $.extend({}, Tooltip.Default, {
...@@ -44,16 +45,16 @@ const Popover = (($) => { ...@@ -44,16 +45,16 @@ const Popover = (($) => {
} }
const Event = { const Event = {
HIDE : 'hide.bs.popover', HIDE : `hide${EVENT_KEY}`,
HIDDEN : 'hidden.bs.popover', HIDDEN : `hidden${EVENT_KEY}`,
SHOW : 'show.bs.popover', SHOW : `show${EVENT_KEY}`,
SHOWN : 'shown.bs.popover', SHOWN : `shown${EVENT_KEY}`,
INSERTED : 'inserted.bs.popover', INSERTED : `inserted${EVENT_KEY}`,
CLICK : 'click.bs.popover', CLICK : `click${EVENT_KEY}`,
FOCUSIN : 'focusin.bs.popover', FOCUSIN : `focusin${EVENT_KEY}`,
FOCUSOUT : 'focusout.bs.popover', FOCUSOUT : `focusout${EVENT_KEY}`,
MOUSEENTER : 'mouseenter.bs.popover', MOUSEENTER : `mouseenter${EVENT_KEY}`,
MOUSELEAVE : 'mouseleave.bs.popover' MOUSELEAVE : `mouseleave${EVENT_KEY}`
} }
...@@ -88,6 +89,10 @@ const Popover = (($) => { ...@@ -88,6 +89,10 @@ const Popover = (($) => {
return Event return Event
} }
static get EVENT_KEY() {
return EVENT_KEY
}
// overrides // overrides
......
...@@ -20,6 +20,8 @@ const ScrollSpy = (($) => { ...@@ -20,6 +20,8 @@ const ScrollSpy = (($) => {
const NAME = 'scrollspy' const NAME = 'scrollspy'
const VERSION = '4.0.0' const VERSION = '4.0.0'
const DATA_KEY = 'bs.scrollspy' const DATA_KEY = 'bs.scrollspy'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const Default = { const Default = {
...@@ -27,9 +29,9 @@ const ScrollSpy = (($) => { ...@@ -27,9 +29,9 @@ const ScrollSpy = (($) => {
} }
const Event = { const Event = {
ACTIVATE : 'activate.bs.scrollspy', ACTIVATE : `activate${EVENT_KEY}`,
SCROLL : 'scroll.bs.scrollspy', SCROLL : `scroll${EVENT_KEY}`,
LOAD : 'load.bs.scrollspy.data-api' LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`
} }
const ClassName = { const ClassName = {
...@@ -54,6 +56,7 @@ const ScrollSpy = (($) => { ...@@ -54,6 +56,7 @@ const ScrollSpy = (($) => {
class ScrollSpy { class ScrollSpy {
constructor(element, config) { constructor(element, config) {
this._element = element
this._scrollElement = element.tagName === 'BODY' ? window : element this._scrollElement = element.tagName === 'BODY' ? window : element
this._config = $.extend({}, Default, config) this._config = $.extend({}, Default, config)
this._selector = `${this._config.target || ''} .nav li > a` this._selector = `${this._config.target || ''} .nav li > a`
...@@ -123,6 +126,20 @@ const ScrollSpy = (($) => { ...@@ -123,6 +126,20 @@ const ScrollSpy = (($) => {
}) })
} }
dispose() {
$.removeData(this._element, DATA_KEY)
$(this._scrollElement).off(EVENT_KEY)
this._element = null
this._scrollElement = null
this._config = null
this._selector = null
this._offsets = null
this._targets = null
this._activeTarget = null
this._scrollHeight = null
}
// private // private
...@@ -244,7 +261,7 @@ const ScrollSpy = (($) => { ...@@ -244,7 +261,7 @@ const ScrollSpy = (($) => {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(window).on(Event.LOAD, function () { $(window).on(Event.LOAD_DATA_API, function () {
let scrollSpys = $.makeArray($(Selector.DATA_SPY)) let scrollSpys = $.makeArray($(Selector.DATA_SPY))
for (let i = scrollSpys.length; i--;) { for (let i = scrollSpys.length; i--;) {
......
...@@ -20,15 +20,17 @@ const Tab = (($) => { ...@@ -20,15 +20,17 @@ const Tab = (($) => {
const NAME = 'tab' const NAME = 'tab'
const VERSION = '4.0.0' const VERSION = '4.0.0'
const DATA_KEY = 'bs.tab' const DATA_KEY = 'bs.tab'
const EVENT_KEY = `.${DATA_KEY}`
const DATA_API_KEY = '.data-api'
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const TRANSITION_DURATION = 150 const TRANSITION_DURATION = 150
const Event = { const Event = {
HIDE : 'hide.bs.tab', HIDE : `hide${EVENT_KEY}`,
HIDDEN : 'hidden.bs.tab', HIDDEN : `hidden${EVENT_KEY}`,
SHOW : 'show.bs.tab', SHOW : `show${EVENT_KEY}`,
SHOWN : 'shown.bs.tab', SHOWN : `shown${EVENT_KEY}`,
CLICK : 'click.bs.tab.data-api' CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`
} }
const ClassName = { const ClassName = {
...@@ -146,6 +148,11 @@ const Tab = (($) => { ...@@ -146,6 +148,11 @@ const Tab = (($) => {
} }
} }
dispose() {
$.removeClass(this._element, DATA_KEY)
this._element = null
}
// private // private
...@@ -258,7 +265,7 @@ const Tab = (($) => { ...@@ -258,7 +265,7 @@ const Tab = (($) => {
*/ */
$(document) $(document)
.on(Event.CLICK, Selector.DATA_TOGGLE, function (event) { .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {
event.preventDefault() event.preventDefault()
Tab._jQueryInterface.call($(this), 'show') Tab._jQueryInterface.call($(this), 'show')
}) })
......
...@@ -20,6 +20,7 @@ const Tooltip = (($) => { ...@@ -20,6 +20,7 @@ const Tooltip = (($) => {
const NAME = 'tooltip' const NAME = 'tooltip'
const VERSION = '4.0.0' const VERSION = '4.0.0'
const DATA_KEY = 'bs.tooltip' const DATA_KEY = 'bs.tooltip'
const EVENT_KEY = `.${DATA_KEY}`
const JQUERY_NO_CONFLICT = $.fn[NAME] const JQUERY_NO_CONFLICT = $.fn[NAME]
const TRANSITION_DURATION = 150 const TRANSITION_DURATION = 150
const CLASS_PREFIX = 'bs-tether' const CLASS_PREFIX = 'bs-tether'
...@@ -52,16 +53,16 @@ const Tooltip = (($) => { ...@@ -52,16 +53,16 @@ const Tooltip = (($) => {
} }
const Event = { const Event = {
HIDE : 'hide.bs.tooltip', HIDE : `hide${EVENT_KEY}`,
HIDDEN : 'hidden.bs.tooltip', HIDDEN : `hidden${EVENT_KEY}`,
SHOW : 'show.bs.tooltip', SHOW : `show${EVENT_KEY}`,
SHOWN : 'shown.bs.tooltip', SHOWN : `shown${EVENT_KEY}`,
INSERTED : 'inserted.bs.tooltip', INSERTED : `inserted${EVENT_KEY}`,
CLICK : 'click.bs.tooltip', CLICK : `click${EVENT_KEY}`,
FOCUSIN : 'focusin.bs.tooltip', FOCUSIN : `focusin${EVENT_KEY}`,
FOCUSOUT : 'focusout.bs.tooltip', FOCUSOUT : `focusout${EVENT_KEY}`,
MOUSEENTER : 'mouseenter.bs.tooltip', MOUSEENTER : `mouseenter${EVENT_KEY}`,
MOUSELEAVE : 'mouseleave.bs.tooltip' MOUSELEAVE : `mouseleave${EVENT_KEY}`
} }
const ClassName = { const ClassName = {
...@@ -136,6 +137,9 @@ const Tooltip = (($) => { ...@@ -136,6 +137,9 @@ const Tooltip = (($) => {
return Event return Event
} }
static get EVENT_KEY() {
return EVENT_KEY
}
// public // public
...@@ -182,19 +186,28 @@ const Tooltip = (($) => { ...@@ -182,19 +186,28 @@ const Tooltip = (($) => {
} }
} }
destroy() { dispose() {
clearTimeout(this._timeout) clearTimeout(this._timeout)
this.hide(() => {
$(this.element)
.off(`.${this.constructor.NAME}`)
.removeData(this.constructor.DATA_KEY)
if (this.tip) { this.cleanupTether()
$(this.tip).detach()
}
this.tip = null $.removeData(this.element, this.constructor.DATA_KEY)
})
$(this.element).off(this.constructor.EVENT_KEY)
if (this.tip) {
$(this.tip).remove()
}
this._isEnabled = null
this._timeout = null
this._hoverState = null
this._activeTrigger = null
this._tether = null
this.element = null
this.config = null
this.tip = null
} }
show() { show() {
......
...@@ -179,7 +179,7 @@ $(function () { ...@@ -179,7 +179,7 @@ $(function () {
assert.strictEqual($._data($popover[0], 'events').click[0].namespace, 'foo', 'popover has extra click.foo event') assert.strictEqual($._data($popover[0], 'events').click[0].namespace, 'foo', 'popover has extra click.foo event')
$popover.bootstrapPopover('show') $popover.bootstrapPopover('show')
$popover.bootstrapPopover('destroy') $popover.bootstrapPopover('dispose')
assert.ok(!$popover.hasClass('in'), 'popover is hidden') assert.ok(!$popover.hasClass('in'), 'popover is hidden')
assert.ok(!$popover.data('popover'), 'popover does not have data') assert.ok(!$popover.data('popover'), 'popover does not have data')
...@@ -231,7 +231,7 @@ $(function () { ...@@ -231,7 +231,7 @@ $(function () {
$div $div
.one('shown.bs.popover', function () { .one('shown.bs.popover', function () {
$('.content-with-handler .btn').trigger('click') $('.content-with-handler .btn').trigger('click')
$div.bootstrapPopover('destroy') $div.bootstrapPopover('dispose')
assert.ok(handlerCalled, 'content\'s event handler still present') assert.ok(handlerCalled, 'content\'s event handler still present')
done() done()
}) })
......
...@@ -250,7 +250,7 @@ $(function () { ...@@ -250,7 +250,7 @@ $(function () {
assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip has extra click.foo event') assert.strictEqual($._data($tooltip[0], 'events').click[0].namespace, 'foo', 'tooltip has extra click.foo event')
$tooltip.bootstrapTooltip('show') $tooltip.bootstrapTooltip('show')
$tooltip.bootstrapTooltip('destroy') $tooltip.bootstrapTooltip('dispose')
assert.ok(!$tooltip.hasClass('in'), 'tooltip is hidden') assert.ok(!$tooltip.hasClass('in'), 'tooltip is hidden')
assert.ok(!$._data($tooltip[0], 'bs.tooltip'), 'tooltip does not have data') assert.ok(!$._data($tooltip[0], 'bs.tooltip'), 'tooltip does not have data')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment