diff --git a/js/collapse.js b/js/collapse.js index bdf9eb4c8e..457996d120 100644 --- a/js/collapse.js +++ b/js/collapse.js @@ -18,132 +18,117 @@ * ============================================================ */ -!function ($) { +!function ($) { "use strict"; - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.transitioning = null - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() + if (this.options.parent) this.$parent = $(this.options.parent) + if (this.options.toggle) this.toggle() } - Collapse.prototype = { + Collapse.DEFAULTS = { + toggle: true + } - constructor: Collapse + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var dimension = this.dimension() + var scroll = $.camelCase(['scroll', dimension].join('-')) + var actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + var hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) } - , show: function () { - var dimension - , scroll - , actives - , hasData + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') - if (this.transitioning || this.$element.hasClass('in')) return + if ($.support.transition) this.$element[dimension](this.$element[0][scroll]) + } - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + var dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } + Collapse.prototype.reset = function (size) { + var dimension = this.dimension() - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - $.support.transition && this.$element[dimension](this.$element[0][scroll]) + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + Collapse.prototype.transition = function (method, startEvent, completeEvent) { + var that = this + var complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) } - , hide: function () { - var dimension - if (this.transitioning || !this.$element.hasClass('in')) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } + this.$element.trigger(startEvent) - , reset: function (size) { - var dimension = this.dimension() + if (startEvent.isDefaultPrevented()) return - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth + this.transitioning = 1 - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + this.$element[method]('in') - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() } - /* COLLAPSE PLUGIN DEFINITION - * ========================== */ + // COLLAPSE PLUGIN DEFINITION + // ========================== var old = $.fn.collapse $.fn.collapse = function (option) { return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + var $this = $(this) + var data = $this.data('collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } - $.fn.collapse.defaults = { - toggle: true - } - $.fn.collapse.Constructor = Collapse - /* COLLAPSE NO CONFLICT - * ==================== */ + // COLLAPSE NO CONFLICT + // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old @@ -151,15 +136,16 @@ } - /* COLLAPSE DATA-API - * ================= */ + // COLLAPSE DATA-API + // ================= $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - , target = $this.attr('data-target') + var $this = $(this), href + var target = $this.attr('data-target') || e.preventDefault() || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() + var option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') $(target).collapse(option) })