aboutsummaryrefslogtreecommitdiff
path: root/js/bootstrap-dropdown.js
diff options
context:
space:
mode:
authorJacob Thornton <[email protected]>2012-06-02 16:11:35 -0700
committerJacob Thornton <[email protected]>2012-06-02 16:11:35 -0700
commit5e5965ca6fe719e83f5eb06222170b87dba78f02 (patch)
treefa6723ece71b5f733d608c6228521609a4adbd99 /js/bootstrap-dropdown.js
parentebc69356637143c938c07904d10928c11e742196 (diff)
parentb1d7c34086ec95a2b0507c595e3a353cdc550b9b (diff)
downloadbootstrap-5e5965ca6fe719e83f5eb06222170b87dba78f02.tar.xz
bootstrap-5e5965ca6fe719e83f5eb06222170b87dba78f02.zip
Merge branch 'accessibility' into 2.1.0-wip
Conflicts: docs/assets/js/bootstrap.min.js docs/javascript.html docs/templates/pages/javascript.mustache
Diffstat (limited to 'js/bootstrap-dropdown.js')
-rw-r--r--js/bootstrap-dropdown.js78
1 files changed, 64 insertions, 14 deletions
diff --git a/js/bootstrap-dropdown.js b/js/bootstrap-dropdown.js
index 454a9684b..d71a54292 100644
--- a/js/bootstrap-dropdown.js
+++ b/js/bootstrap-dropdown.js
@@ -26,7 +26,7 @@
/* DROPDOWN CLASS DEFINITION
* ========================= */
- var toggle = '[data-toggle="dropdown"]'
+ var toggle = '[data-toggle=dropdown]'
, Dropdown = function (element) {
var $el = $(element).on('click.dropdown.data-api', this.toggle)
$('html').on('click.dropdown.data-api', function () {
@@ -41,34 +41,82 @@
, toggle: function (e) {
var $this = $(this)
, $parent
- , selector
, isActive
if ($this.is('.disabled, :disabled')) return
- selector = $this.attr('data-target')
+ $parent = getParent($this)
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ isActive = $parent.hasClass('open')
+
+ clearMenus()
+
+ if (!isActive) {
+ $parent.toggleClass('open')
+ $this.focus()
}
- $parent = $(selector)
- $parent.length || ($parent = $this.parent())
+ return false
+ }
+
+ , keydown: function (e) {
+ var $this
+ , $items
+ , $active
+ , $parent
+ , isActive
+ , index
+
+ if (!/(38|40|27)/.test(e.keyCode)) return
+
+ $this = $(this)
+
+ e.preventDefault()
+ e.stopPropagation()
+
+ if ($this.is('.disabled, :disabled')) return
+
+ $parent = getParent($this)
isActive = $parent.hasClass('open')
- clearMenus()
+ if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
- if (!isActive) $parent.toggleClass('open')
+ $items = $('[role=menu] li:not(.divider) a', $parent)
- return false
+ if (!$items.length) return
+
+ 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
+
+ $items
+ .eq(index)
+ .focus()
}
}
function clearMenus() {
- $(toggle).parent().removeClass('open')
+ getParent($(toggle))
+ .removeClass('open')
+ }
+
+ function getParent($this) {
+ var selector = $this.attr('data-target')
+ , $parent
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ $parent = $(selector)
+ $parent.length || ($parent = $this.parent())
+
+ return $parent
}
@@ -91,10 +139,12 @@
* =================================== */
$(function () {
- $('html').on('click.dropdown.data-api', clearMenus)
+ $('html')
+ .on('click.dropdown.data-api', clearMenus)
$('body')
.on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() })
- .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+ .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle)
+ .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
})
}(window.jQuery); \ No newline at end of file