aboutsummaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
authorJacob Thornton <[email protected]>2012-05-17 00:23:11 -0700
committerJacob Thornton <[email protected]>2012-05-17 00:23:11 -0700
commita7b49a7d92a0efa640179b775e309002afc50390 (patch)
tree3169a2ee9655cb30cf30a99098bb6ca92ea288ea /js
parent10c6db4b14e5eb26bd663996233e3ac3075d5cb4 (diff)
downloadbootstrap-a7b49a7d92a0efa640179b775e309002afc50390.tar.xz
bootstrap-a7b49a7d92a0efa640179b775e309002afc50390.zip
nearly everything working with activedescendant... then decide it's wrong.
Diffstat (limited to 'js')
-rw-r--r--js/.jshintrc1
-rw-r--r--js/bootstrap-dropdown.js84
2 files changed, 71 insertions, 14 deletions
diff --git a/js/.jshintrc b/js/.jshintrc
index bbac349e8..0f064a0b4 100644
--- a/js/.jshintrc
+++ b/js/.jshintrc
@@ -4,6 +4,7 @@
"laxbreak" : true,
"browser" : true,
"debug" : true,
+ "devel" : true,
"boss" : true,
"expr" : true,
"asi" : true
diff --git a/js/bootstrap-dropdown.js b/js/bootstrap-dropdown.js
index ec0588dc1..84560642f 100644
--- a/js/bootstrap-dropdown.js
+++ b/js/bootstrap-dropdown.js
@@ -27,6 +27,7 @@
* ========================= */
var toggle = '[data-toggle="dropdown"]'
+ , active = 'aria-active'
, Dropdown = function (element) {
var $el = $(element).on('click.dropdown.data-api', this.toggle)
$('html').on('click.dropdown.data-api', function () {
@@ -41,34 +42,87 @@
, toggle: function (e) {
var $this = $(this)
, $parent
- , selector
, isActive
if ($this.is('.disabled, :disabled')) return
- selector = $this.attr('data-target')
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
- }
-
- $parent = $(selector)
- $parent.length || ($parent = $this.parent())
+ $parent = getParent($this)
isActive = $parent.hasClass('open')
clearMenus()
- if (!isActive) $parent.toggleClass('open')
+ if (!isActive) {
+ $parent.toggleClass('open')
+ $this.focus()
+ }
return false
}
+ , keydown: function (e) {
+ var $this = $(this)
+ , $items
+ , $active
+ , $parent
+ , index
+
+ if (e.keyCode == 27) return $this.click()
+
+ if (!/(38|40|13)/.test(e.keyCode)) return
+
+ e.preventDefault()
+ e.stopPropagation()
+
+ if ($this.is('.disabled, :disabled')) return
+
+ $parent = getParent($this)
+
+ $parent.hasClass('open') || $this.click()
+
+ $items = $('[role=menu] li:not(.divider)', $parent)
+
+ if (!$items.length) return
+
+ index = $items.index($items.filter('#' + active))
+
+ $items
+ .eq(index)
+ .attr('id', '')
+
+ if (e.keyCode == 38 && index > 0) index-- // up
+ else if (e.keyCode == 40 && index < $items.length - 1) index++ // down
+ else if (e.keyCode == 13 && ~index) return $items.eq(index).find('a').click() // enter
+
+ if (!~index) index = 0
+
+ $items
+ .eq(index)
+ .attr('id', active)
+ }
+
}
function clearMenus() {
- $(toggle).parent().removeClass('open')
+ getParent($(toggle))
+ .removeClass('open')
+ .find('#' + active)
+ .attr('id', '')
+ }
+
+ 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 +145,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, Dropdown.prototype.keydown)
})
}(window.jQuery); \ No newline at end of file