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