• Jump To … +
    affix.js alert.js button.js carousel.js collapse.js dropdown.js modal.js popover.js scrollspy.js tab.js tooltip.js transition.js
  • collapse.js

  • ¶
    /* ========================================================================
     * Bootstrap: collapse.js v3.0.0
     * http://twbs.github.com/bootstrap/javascript.html#collapse
     * ========================================================================
     * Copyright 2012 Twitter, Inc.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     * http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     * ======================================================================== */
    
    
    +function ($) { "use strict";
  • ¶

    COLLAPSE PUBLIC CLASS DEFINITION

  • ¶
      var Collapse = function (element, options) {
        this.$element      = $(element)
        this.options       = $.extend({}, Collapse.DEFAULTS, options)
        this.transitioning = null
    
        if (this.options.parent) this.$parent = $(this.options.parent)
        if (this.options.toggle) this.toggle()
      }
    
      Collapse.DEFAULTS = {
        toggle: true
      }
    
      Collapse.prototype.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 startEvent = $.Event('show.bs.collapse')
        this.$element.trigger(startEvent)
        if (startEvent.isDefaultPrevented()) return
    
        var actives = this.$parent && this.$parent.find('> .panel > .in')
    
        if (actives && actives.length) {
          var hasData = actives.data('bs.collapse')
          if (hasData && hasData.transitioning) return
          actives.collapse('hide')
          hasData || actives.data('bs.collapse', null)
        }
    
        var dimension = this.dimension()
    
        this.$element
          .removeClass('collapse')
          .addClass('collapsing')
          [dimension](0)
    
        this.transitioning = 1
    
        var complete = function () {
          this.$element
            .removeClass('collapsing')
            .addClass('in')
            [dimension]('auto')
          this.transitioning = 0
          this.$element.trigger('shown.bs.collapse')
        }
    
        if (!$.support.transition) return complete.call(this)
    
        var scrollSize = $.camelCase(['scroll', dimension].join('-'))
    
        this.$element
          .one($.support.transition.end, $.proxy(complete, this))
          .emulateTransitionEnd(350)
          [dimension](this.$element[0][scrollSize])
      }
    
      Collapse.prototype.hide = function () {
        if (this.transitioning || !this.$element.hasClass('in')) return
    
        var startEvent = $.Event('hide.bs.collapse')
        this.$element.trigger(startEvent)
        if (startEvent.isDefaultPrevented()) return
    
        var dimension = this.dimension()
    
        this.$element
          [dimension](this.$element[dimension]())
          [0].offsetHeight
    
        this.$element
          .addClass('collapsing')
          .removeClass('collapse')
          .removeClass('in')
    
        this.transitioning = 1
    
        var complete = function () {
          this.transitioning = 0
          this.$element
            .trigger('hidden.bs.collapse')
            .removeClass('collapsing')
            .addClass('collapse')
        }
    
        if (!$.support.transition) return complete.call(this)
    
        this.$element
          [dimension](0)
          .one($.support.transition.end, $.proxy(complete, this))
          .emulateTransitionEnd(350)
      }
    
      Collapse.prototype.toggle = function () {
        this[this.$element.hasClass('in') ? 'hide' : 'show']()
      }
  • ¶

    COLLAPSE PLUGIN DEFINITION

  • ¶
      var old = $.fn.collapse
    
      $.fn.collapse = function (option) {
        return this.each(function () {
          var $this   = $(this)
          var data    = $this.data('bs.collapse')
          var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
    
          if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
          if (typeof option == 'string') data[option]()
        })
      }
    
      $.fn.collapse.Constructor = Collapse
  • ¶

    COLLAPSE NO CONFLICT

  • ¶
      $.fn.collapse.noConflict = function () {
        $.fn.collapse = old
        return this
      }
  • ¶

    COLLAPSE DATA-API

  • ¶
      $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
        var $this   = $(this), href
        var target  = $this.attr('data-target')
            || e.preventDefault()
            || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
        var $target = $(target)
        var data    = $target.data('bs.collapse')
        var option  = data ? 'toggle' : $this.data()
        var parent  = $this.attr('data-parent')
        var $parent = parent && $(parent)
    
        if (!data || !data.transitioning) {
          if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
          $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
        }
    
        $target.collapse(option)
      })
    
    }(window.jQuery);