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
     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);