bootstrap-source/bootstrap-3.0.3/js/dropdown.js
changeset 115 a9d04f5f5650
parent 54 0ded9d7748b7
equal deleted inserted replaced
114:6093dda9fe38 115:a9d04f5f5650
     1 /* ========================================================================
       
     2  * Bootstrap: dropdown.js v3.0.3
       
     3  * http://getbootstrap.com/javascript/#dropdowns
       
     4  * ========================================================================
       
     5  * Copyright 2013 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 ($) { "use strict";
       
    22 
       
    23   // DROPDOWN CLASS DEFINITION
       
    24   // =========================
       
    25 
       
    26   var backdrop = '.dropdown-backdrop'
       
    27   var toggle   = '[data-toggle=dropdown]'
       
    28   var Dropdown = function (element) {
       
    29     $(element).on('click.bs.dropdown', this.toggle)
       
    30   }
       
    31 
       
    32   Dropdown.prototype.toggle = function (e) {
       
    33     var $this = $(this)
       
    34 
       
    35     if ($this.is('.disabled, :disabled')) return
       
    36 
       
    37     var $parent  = getParent($this)
       
    38     var isActive = $parent.hasClass('open')
       
    39 
       
    40     clearMenus()
       
    41 
       
    42     if (!isActive) {
       
    43       if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
       
    44         // if mobile we use a backdrop because click events don't delegate
       
    45         $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
       
    46       }
       
    47 
       
    48       $parent.trigger(e = $.Event('show.bs.dropdown'))
       
    49 
       
    50       if (e.isDefaultPrevented()) return
       
    51 
       
    52       $parent
       
    53         .toggleClass('open')
       
    54         .trigger('shown.bs.dropdown')
       
    55 
       
    56       $this.focus()
       
    57     }
       
    58 
       
    59     return false
       
    60   }
       
    61 
       
    62   Dropdown.prototype.keydown = function (e) {
       
    63     if (!/(38|40|27)/.test(e.keyCode)) return
       
    64 
       
    65     var $this = $(this)
       
    66 
       
    67     e.preventDefault()
       
    68     e.stopPropagation()
       
    69 
       
    70     if ($this.is('.disabled, :disabled')) return
       
    71 
       
    72     var $parent  = getParent($this)
       
    73     var isActive = $parent.hasClass('open')
       
    74 
       
    75     if (!isActive || (isActive && e.keyCode == 27)) {
       
    76       if (e.which == 27) $parent.find(toggle).focus()
       
    77       return $this.click()
       
    78     }
       
    79 
       
    80     var $items = $('[role=menu] li:not(.divider):visible a', $parent)
       
    81 
       
    82     if (!$items.length) return
       
    83 
       
    84     var index = $items.index($items.filter(':focus'))
       
    85 
       
    86     if (e.keyCode == 38 && index > 0)                 index--                        // up
       
    87     if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
       
    88     if (!~index)                                      index=0
       
    89 
       
    90     $items.eq(index).focus()
       
    91   }
       
    92 
       
    93   function clearMenus() {
       
    94     $(backdrop).remove()
       
    95     $(toggle).each(function (e) {
       
    96       var $parent = getParent($(this))
       
    97       if (!$parent.hasClass('open')) return
       
    98       $parent.trigger(e = $.Event('hide.bs.dropdown'))
       
    99       if (e.isDefaultPrevented()) return
       
   100       $parent.removeClass('open').trigger('hidden.bs.dropdown')
       
   101     })
       
   102   }
       
   103 
       
   104   function getParent($this) {
       
   105     var selector = $this.attr('data-target')
       
   106 
       
   107     if (!selector) {
       
   108       selector = $this.attr('href')
       
   109       selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
       
   110     }
       
   111 
       
   112     var $parent = selector && $(selector)
       
   113 
       
   114     return $parent && $parent.length ? $parent : $this.parent()
       
   115   }
       
   116 
       
   117 
       
   118   // DROPDOWN PLUGIN DEFINITION
       
   119   // ==========================
       
   120 
       
   121   var old = $.fn.dropdown
       
   122 
       
   123   $.fn.dropdown = function (option) {
       
   124     return this.each(function () {
       
   125       var $this = $(this)
       
   126       var data  = $this.data('bs.dropdown')
       
   127 
       
   128       if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
       
   129       if (typeof option == 'string') data[option].call($this)
       
   130     })
       
   131   }
       
   132 
       
   133   $.fn.dropdown.Constructor = Dropdown
       
   134 
       
   135 
       
   136   // DROPDOWN NO CONFLICT
       
   137   // ====================
       
   138 
       
   139   $.fn.dropdown.noConflict = function () {
       
   140     $.fn.dropdown = old
       
   141     return this
       
   142   }
       
   143 
       
   144 
       
   145   // APPLY TO STANDARD DROPDOWN ELEMENTS
       
   146   // ===================================
       
   147 
       
   148   $(document)
       
   149     .on('click.bs.dropdown.data-api', clearMenus)
       
   150     .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
       
   151     .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
       
   152     .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
       
   153 
       
   154 }(jQuery);
       
Impressum Datenschutzerklärung