aboutsummaryrefslogtreecommitdiff
path: root/js/dropdown.js
diff options
context:
space:
mode:
authorfat <[email protected]>2014-06-12 11:11:04 -0700
committerfat <[email protected]>2014-06-12 11:11:04 -0700
commit2b302f69eea416bc85e7827b7d7a74d49f879662 (patch)
tree6cdc496ae2264e96ee9e1bfa0b48b0d4cbd6253e /js/dropdown.js
parent696632d7dac91dba3f83c056263b527c56b63991 (diff)
downloadbootstrap-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.js206
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)
+ })
-});
+}();