diff options
| author | fat <[email protected]> | 2014-06-12 11:11:04 -0700 |
|---|---|---|
| committer | fat <[email protected]> | 2014-06-12 11:11:04 -0700 |
| commit | 2b302f69eea416bc85e7827b7d7a74d49f879662 (patch) | |
| tree | 6cdc496ae2264e96ee9e1bfa0b48b0d4cbd6253e /js/dropdown.js | |
| parent | 696632d7dac91dba3f83c056263b527c56b63991 (diff) | |
| download | bootstrap-2b302f69eea416bc85e7827b7d7a74d49f879662.tar.xz bootstrap-2b302f69eea416bc85e7827b7d7a74d49f879662.zip | |
some changes from #13801 - add strict mode back and ==
Diffstat (limited to 'js/dropdown.js')
| -rw-r--r-- | js/dropdown.js | 206 |
1 files changed, 104 insertions, 102 deletions
diff --git a/js/dropdown.js b/js/dropdown.js index d4ba1e944..f4f6358cd 100644 --- a/js/dropdown.js +++ b/js/dropdown.js @@ -7,149 +7,151 @@ * ======================================================================== */ -(function (o_o) { - typeof define === 'function' && define.amd ? define(['jquery'], o_o) : - typeof exports === 'object' ? o_o(require('jquery')) : o_o(jQuery) -})(function ($) { ++function () { 'use strict'; - 'use strict'; + (function (o_o) { + typeof define == 'function' && define.amd ? define(['jquery'], o_o) : + typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery) + })(function ($) { - // DROPDOWN CLASS DEFINITION - // ========================= + // DROPDOWN CLASS DEFINITION + // ========================= - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle="dropdown"]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.1.1' - Dropdown.VERSION = '3.1.1' + Dropdown.prototype.toggle = function (e) { + var $this = $(this) - Dropdown.prototype.toggle = function (e) { - var $this = $(this) + if ($this.is('.disabled, :disabled')) return - if ($this.is('.disabled, :disabled')) return + var $parent = getParent($this) + var isActive = $parent.hasClass('open') - var $parent = getParent($this) - var isActive = $parent.hasClass('open') + clearMenus() - clearMenus() + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) + } - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) - } + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) - var relatedTarget = { relatedTarget: this } - $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + if (e.isDefaultPrevented()) return - if (e.isDefaultPrevented()) return + $this.trigger('focus') - $this.trigger('focus') + $parent + .toggleClass('open') + .trigger('shown.bs.dropdown', relatedTarget) + } - $parent - .toggleClass('open') - .trigger('shown.bs.dropdown', relatedTarget) + return false } - return false - } + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27)/.test(e.keyCode)) return - Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27)/.test(e.keyCode)) return + var $this = $(this) - var $this = $(this) + e.preventDefault() + e.stopPropagation() - e.preventDefault() - e.stopPropagation() + if ($this.is('.disabled, :disabled')) return - if ($this.is('.disabled, :disabled')) return + var $parent = getParent($this) + var isActive = $parent.hasClass('open') - var $parent = getParent($this) - var isActive = $parent.hasClass('open') + if (!isActive || (isActive && e.keyCode == 27)) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } - if (!isActive || (isActive && e.keyCode == 27)) { - if (e.which == 27) $parent.find(toggle).trigger('focus') - return $this.trigger('click') - } + var desc = ' li:not(.divider):visible a' + var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc) - var desc = ' li:not(.divider):visible a' - var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc) + if (!$items.length) return - if (!$items.length) return + var index = $items.index($items.filter(':focus')) - var index = $items.index($items.filter(':focus')) + if (e.keyCode == 38 && index > 0) index-- // up + if (e.keyCode == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 + $items.eq(index).trigger('focus') + } - $items.eq(index).trigger('focus') - } + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $parent = getParent($(this)) + var relatedTarget = { relatedTarget: this } + if (!$parent.hasClass('open')) return + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + if (e.isDefaultPrevented()) return + $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) + }) + } - function clearMenus(e) { - if (e && e.which === 3) return - $(backdrop).remove() - $(toggle).each(function () { - var $parent = getParent($(this)) - var relatedTarget = { relatedTarget: this } - if (!$parent.hasClass('open')) return - $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) - if (e.isDefaultPrevented()) return - $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) - }) - } + function getParent($this) { + var selector = $this.attr('data-target') - function getParent($this) { - var selector = $this.attr('data-target') + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } - if (!selector) { - selector = $this.attr('href') - selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } + var $parent = selector && $(selector) - var $parent = selector && $(selector) + return $parent && $parent.length ? $parent : $this.parent() + } - return $parent && $parent.length ? $parent : $this.parent() - } + // DROPDOWN PLUGIN DEFINITION + // ========================== - // DROPDOWN PLUGIN DEFINITION - // ========================== + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.dropdown') + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } - if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } + var old = $.fn.dropdown - var old = $.fn.dropdown + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown - $.fn.dropdown = Plugin - $.fn.dropdown.Constructor = Dropdown + // DROPDOWN NO CONFLICT + // ==================== - // DROPDOWN NO CONFLICT - // ==================== + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== - // APPLY TO STANDARD DROPDOWN ELEMENTS - // =================================== + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown) - $(document) - .on('click.bs.dropdown.data-api', clearMenus) - .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown) + }) -}); +}(); |
