github.com/kayoticsully/syncthing@v0.8.9-0.20140724133906-c45a2fdc03f8/assets/bootstrap-3.1.1/js/dropdown.js (about) 1 /* ======================================================================== 2 * Bootstrap: dropdown.js v3.1.1 3 * http://getbootstrap.com/javascript/#dropdowns 4 * ======================================================================== 5 * Copyright 2011-2014 Twitter, Inc. 6 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 7 * ======================================================================== */ 8 9 10 +function ($) { 11 'use strict'; 12 13 // DROPDOWN CLASS DEFINITION 14 // ========================= 15 16 var backdrop = '.dropdown-backdrop' 17 var toggle = '[data-toggle=dropdown]' 18 var Dropdown = function (element) { 19 $(element).on('click.bs.dropdown', this.toggle) 20 } 21 22 Dropdown.prototype.toggle = function (e) { 23 var $this = $(this) 24 25 if ($this.is('.disabled, :disabled')) return 26 27 var $parent = getParent($this) 28 var isActive = $parent.hasClass('open') 29 30 clearMenus() 31 32 if (!isActive) { 33 if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { 34 // if mobile we use a backdrop because click events don't delegate 35 $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) 36 } 37 38 var relatedTarget = { relatedTarget: this } 39 $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) 40 41 if (e.isDefaultPrevented()) return 42 43 $parent 44 .toggleClass('open') 45 .trigger('shown.bs.dropdown', relatedTarget) 46 47 $this.focus() 48 } 49 50 return false 51 } 52 53 Dropdown.prototype.keydown = function (e) { 54 if (!/(38|40|27)/.test(e.keyCode)) return 55 56 var $this = $(this) 57 58 e.preventDefault() 59 e.stopPropagation() 60 61 if ($this.is('.disabled, :disabled')) return 62 63 var $parent = getParent($this) 64 var isActive = $parent.hasClass('open') 65 66 if (!isActive || (isActive && e.keyCode == 27)) { 67 if (e.which == 27) $parent.find(toggle).focus() 68 return $this.click() 69 } 70 71 var desc = ' li:not(.divider):visible a' 72 var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc) 73 74 if (!$items.length) return 75 76 var index = $items.index($items.filter(':focus')) 77 78 if (e.keyCode == 38 && index > 0) index-- // up 79 if (e.keyCode == 40 && index < $items.length - 1) index++ // down 80 if (!~index) index = 0 81 82 $items.eq(index).focus() 83 } 84 85 function clearMenus(e) { 86 $(backdrop).remove() 87 $(toggle).each(function () { 88 var $parent = getParent($(this)) 89 var relatedTarget = { relatedTarget: this } 90 if (!$parent.hasClass('open')) return 91 $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) 92 if (e.isDefaultPrevented()) return 93 $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) 94 }) 95 } 96 97 function getParent($this) { 98 var selector = $this.attr('data-target') 99 100 if (!selector) { 101 selector = $this.attr('href') 102 selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 103 } 104 105 var $parent = selector && $(selector) 106 107 return $parent && $parent.length ? $parent : $this.parent() 108 } 109 110 111 // DROPDOWN PLUGIN DEFINITION 112 // ========================== 113 114 var old = $.fn.dropdown 115 116 $.fn.dropdown = function (option) { 117 return this.each(function () { 118 var $this = $(this) 119 var data = $this.data('bs.dropdown') 120 121 if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) 122 if (typeof option == 'string') data[option].call($this) 123 }) 124 } 125 126 $.fn.dropdown.Constructor = Dropdown 127 128 129 // DROPDOWN NO CONFLICT 130 // ==================== 131 132 $.fn.dropdown.noConflict = function () { 133 $.fn.dropdown = old 134 return this 135 } 136 137 138 // APPLY TO STANDARD DROPDOWN ELEMENTS 139 // =================================== 140 141 $(document) 142 .on('click.bs.dropdown.data-api', clearMenus) 143 .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) 144 .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) 145 .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown) 146 147 }(jQuery);