js/bootstrap-dropdown.js
author indvd00m (gotoindvdum[at]gmail[dot]com)
Fri, 04 Jul 2014 16:42:41 +0400
changeset 0 ba8ab09f730e
permissions -rw-r--r--
First home page
indvd00m@0
     1
/* ============================================================
indvd00m@0
     2
 * bootstrap-dropdown.js v2.3.1
indvd00m@0
     3
 * http://twitter.github.com/bootstrap/javascript.html#dropdowns
indvd00m@0
     4
 * ============================================================
indvd00m@0
     5
 * Copyright 2012 Twitter, Inc.
indvd00m@0
     6
 *
indvd00m@0
     7
 * Licensed under the Apache License, Version 2.0 (the "License");
indvd00m@0
     8
 * you may not use this file except in compliance with the License.
indvd00m@0
     9
 * You may obtain a copy of the License at
indvd00m@0
    10
 *
indvd00m@0
    11
 * http://www.apache.org/licenses/LICENSE-2.0
indvd00m@0
    12
 *
indvd00m@0
    13
 * Unless required by applicable law or agreed to in writing, software
indvd00m@0
    14
 * distributed under the License is distributed on an "AS IS" BASIS,
indvd00m@0
    15
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
indvd00m@0
    16
 * See the License for the specific language governing permissions and
indvd00m@0
    17
 * limitations under the License.
indvd00m@0
    18
 * ============================================================ */
indvd00m@0
    19
indvd00m@0
    20
indvd00m@0
    21
!function ($) {
indvd00m@0
    22
indvd00m@0
    23
  "use strict"; // jshint ;_;
indvd00m@0
    24
indvd00m@0
    25
indvd00m@0
    26
 /* DROPDOWN CLASS DEFINITION
indvd00m@0
    27
  * ========================= */
indvd00m@0
    28
indvd00m@0
    29
  var toggle = '[data-toggle=dropdown]'
indvd00m@0
    30
    , Dropdown = function (element) {
indvd00m@0
    31
        var $el = $(element).on('click.dropdown.data-api', this.toggle)
indvd00m@0
    32
        $('html').on('click.dropdown.data-api', function () {
indvd00m@0
    33
          $el.parent().removeClass('open')
indvd00m@0
    34
        })
indvd00m@0
    35
      }
indvd00m@0
    36
indvd00m@0
    37
  Dropdown.prototype = {
indvd00m@0
    38
indvd00m@0
    39
    constructor: Dropdown
indvd00m@0
    40
indvd00m@0
    41
  , toggle: function (e) {
indvd00m@0
    42
      var $this = $(this)
indvd00m@0
    43
        , $parent
indvd00m@0
    44
        , isActive
indvd00m@0
    45
indvd00m@0
    46
      if ($this.is('.disabled, :disabled')) return
indvd00m@0
    47
indvd00m@0
    48
      $parent = getParent($this)
indvd00m@0
    49
indvd00m@0
    50
      isActive = $parent.hasClass('open')
indvd00m@0
    51
indvd00m@0
    52
      clearMenus()
indvd00m@0
    53
indvd00m@0
    54
      if (!isActive) {
indvd00m@0
    55
        $parent.toggleClass('open')
indvd00m@0
    56
      }
indvd00m@0
    57
indvd00m@0
    58
      $this.focus()
indvd00m@0
    59
indvd00m@0
    60
      return false
indvd00m@0
    61
    }
indvd00m@0
    62
indvd00m@0
    63
  , keydown: function (e) {
indvd00m@0
    64
      var $this
indvd00m@0
    65
        , $items
indvd00m@0
    66
        , $active
indvd00m@0
    67
        , $parent
indvd00m@0
    68
        , isActive
indvd00m@0
    69
        , index
indvd00m@0
    70
indvd00m@0
    71
      if (!/(38|40|27)/.test(e.keyCode)) return
indvd00m@0
    72
indvd00m@0
    73
      $this = $(this)
indvd00m@0
    74
indvd00m@0
    75
      e.preventDefault()
indvd00m@0
    76
      e.stopPropagation()
indvd00m@0
    77
indvd00m@0
    78
      if ($this.is('.disabled, :disabled')) return
indvd00m@0
    79
indvd00m@0
    80
      $parent = getParent($this)
indvd00m@0
    81
indvd00m@0
    82
      isActive = $parent.hasClass('open')
indvd00m@0
    83
indvd00m@0
    84
      if (!isActive || (isActive && e.keyCode == 27)) {
indvd00m@0
    85
        if (e.which == 27) $parent.find(toggle).focus()
indvd00m@0
    86
        return $this.click()
indvd00m@0
    87
      }
indvd00m@0
    88
indvd00m@0
    89
      $items = $('[role=menu] li:not(.divider):visible a', $parent)
indvd00m@0
    90
indvd00m@0
    91
      if (!$items.length) return
indvd00m@0
    92
indvd00m@0
    93
      index = $items.index($items.filter(':focus'))
indvd00m@0
    94
indvd00m@0
    95
      if (e.keyCode == 38 && index > 0) index--                                        // up
indvd00m@0
    96
      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
indvd00m@0
    97
      if (!~index) index = 0
indvd00m@0
    98
indvd00m@0
    99
      $items
indvd00m@0
   100
        .eq(index)
indvd00m@0
   101
        .focus()
indvd00m@0
   102
    }
indvd00m@0
   103
indvd00m@0
   104
  }
indvd00m@0
   105
indvd00m@0
   106
  function clearMenus() {
indvd00m@0
   107
    $(toggle).each(function () {
indvd00m@0
   108
      getParent($(this)).removeClass('open')
indvd00m@0
   109
    })
indvd00m@0
   110
  }
indvd00m@0
   111
indvd00m@0
   112
  function getParent($this) {
indvd00m@0
   113
    var selector = $this.attr('data-target')
indvd00m@0
   114
      , $parent
indvd00m@0
   115
indvd00m@0
   116
    if (!selector) {
indvd00m@0
   117
      selector = $this.attr('href')
indvd00m@0
   118
      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
indvd00m@0
   119
    }
indvd00m@0
   120
indvd00m@0
   121
    $parent = selector && $(selector)
indvd00m@0
   122
indvd00m@0
   123
    if (!$parent || !$parent.length) $parent = $this.parent()
indvd00m@0
   124
indvd00m@0
   125
    return $parent
indvd00m@0
   126
  }
indvd00m@0
   127
indvd00m@0
   128
indvd00m@0
   129
  /* DROPDOWN PLUGIN DEFINITION
indvd00m@0
   130
   * ========================== */
indvd00m@0
   131
indvd00m@0
   132
  var old = $.fn.dropdown
indvd00m@0
   133
indvd00m@0
   134
  $.fn.dropdown = function (option) {
indvd00m@0
   135
    return this.each(function () {
indvd00m@0
   136
      var $this = $(this)
indvd00m@0
   137
        , data = $this.data('dropdown')
indvd00m@0
   138
      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
indvd00m@0
   139
      if (typeof option == 'string') data[option].call($this)
indvd00m@0
   140
    })
indvd00m@0
   141
  }
indvd00m@0
   142
indvd00m@0
   143
  $.fn.dropdown.Constructor = Dropdown
indvd00m@0
   144
indvd00m@0
   145
indvd00m@0
   146
 /* DROPDOWN NO CONFLICT
indvd00m@0
   147
  * ==================== */
indvd00m@0
   148
indvd00m@0
   149
  $.fn.dropdown.noConflict = function () {
indvd00m@0
   150
    $.fn.dropdown = old
indvd00m@0
   151
    return this
indvd00m@0
   152
  }
indvd00m@0
   153
indvd00m@0
   154
indvd00m@0
   155
  /* APPLY TO STANDARD DROPDOWN ELEMENTS
indvd00m@0
   156
   * =================================== */
indvd00m@0
   157
indvd00m@0
   158
  $(document)
indvd00m@0
   159
    .on('click.dropdown.data-api', clearMenus)
indvd00m@0
   160
    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
indvd00m@0
   161
    .on('click.dropdown-menu', function (e) { e.stopPropagation() })
indvd00m@0
   162
    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
indvd00m@0
   163
    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
indvd00m@0
   164
indvd00m@0
   165
}(window.jQuery);