Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

remove dropdown.js reliance on roles and fix keyboard navigation #21535

Merged
merged 24 commits into from
Apr 13, 2017
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
ab2fc63
Dropdown: remove dependency to role="menu", role="listbox" a and li e…
pvdlg May 22, 2016
425d156
Merge branch 'twbs/v4-dev' into dropdown-keyboard
pvdlg Dec 29, 2016
c4867cf
Merge branch 'twbs/v4-dev' into dropdown-keyboard
pvdlg Jan 4, 2017
67958f3
Merge conflict
pvdlg Jan 4, 2017
eb84c03
Update dropdown unit test to new markup
pvdlg Jan 6, 2017
4c2f544
Merge branch 'twbs/v4-dev' into dropdown-keyboard
pvdlg Jan 6, 2017
a85b80f
Merge branch 'twbs/v4-dev' into dropdown-keyboard
pvdlg Jan 15, 2017
8da2815
Merge branch 'twbs/v4-dev' into dropdown-keyboard
pvdlg Jan 16, 2017
9daf681
Fix test to retrieve the proper item instead of it's parent
pvdlg Jan 21, 2017
59f438b
Merge branch 'twbs/v4-dev' into dropdown-keyboard
pvdlg Jan 21, 2017
1a783a4
Add unit test for keyboard navigation
pvdlg Jan 21, 2017
4448ca0
Refactor test to event and async
pvdlg Jan 21, 2017
ef2181f
Harmonize document.activeElement comparison
pvdlg Jan 21, 2017
1cdd0d1
Merge branch 'twbs/v4-dev' into dropdown-keyboard
pvdlg Jan 22, 2017
403f55f
Fix spacebar key in Firefox for button elements
pvdlg Jan 22, 2017
4ab576a
Fixes #21941
pvdlg Feb 8, 2017
f5cc591
Merge branch 'twbs/v4-dev' into dropdown-keyboard
pvdlg Mar 19, 2017
fe72daf
Merge branch 'v4-dev' into dropdown-keyboard
pvdlg Apr 8, 2017
d3fbebe
Merge branch 'v4-dev' into dropdown-keyboard
pvdlg Apr 9, 2017
025ddb1
Merge branch 'v4-dev' into dropdown-keyboard
pvdlg Apr 10, 2017
81e12d5
Indent
pvdlg Apr 12, 2017
208e038
Merge branch 'v4-dev' into dropdown-keyboard
pvdlg Apr 12, 2017
2f94166
Merge branch 'v4-dev' into dropdown-keyboard
pvdlg Apr 12, 2017
6301fab
Merge branch 'v4-dev' into dropdown-keyboard
patrickhlauke Apr 13, 2017
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 14 additions & 15 deletions js/src/dropdown.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,11 @@ const Dropdown = (($) => {
const JQUERY_NO_CONFLICT = $.fn[NAME]
const ESCAPE_KEYCODE = 27 // KeyboardEvent.which value for Escape (Esc) key
const SPACE_KEYCODE = 32 // KeyboardEvent.which value for space key
const TAB_KEYCODE = 9 // KeyboardEvent.which value for tab key
const ARROW_UP_KEYCODE = 38 // KeyboardEvent.which value for up arrow key
const ARROW_DOWN_KEYCODE = 40 // KeyboardEvent.which value for down arrow key
const RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)
const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}|${SPACE_KEYCODE}`)
const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you change the indent please ?


const Event = {
HIDE : `hide${EVENT_KEY}`,
Expand All @@ -37,8 +38,8 @@ const Dropdown = (($) => {
SHOWN : `shown${EVENT_KEY}`,
CLICK : `click${EVENT_KEY}`,
CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`,
FOCUSIN_DATA_API : `focusin${EVENT_KEY}${DATA_API_KEY}`,
KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`
KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,
KEYUP_DATA_API : `keyup${EVENT_KEY}${DATA_API_KEY}`
}

const ClassName = {
Expand All @@ -51,11 +52,9 @@ const Dropdown = (($) => {
BACKDROP : '.dropdown-backdrop',
DATA_TOGGLE : '[data-toggle="dropdown"]',
FORM_CHILD : '.dropdown form',
ROLE_MENU : '[role="menu"]',
ROLE_LISTBOX : '[role="listbox"]',
MENU : '.dropdown-menu',
NAVBAR_NAV : '.navbar-nav',
VISIBLE_ITEMS : '[role="menu"] li:not(.disabled) a, '
+ '[role="listbox"] li:not(.disabled) a'
VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled)'
}


Expand Down Expand Up @@ -163,7 +162,8 @@ const Dropdown = (($) => {
}

static _clearMenus(event) {
if (event && event.which === RIGHT_MOUSE_BUTTON_WHICH) {
if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||
event.type === 'keyup' && event.which !== TAB_KEYCODE)) {
return
}

Expand All @@ -180,7 +180,7 @@ const Dropdown = (($) => {
}

if (event && (event.type === 'click' &&
/input|textarea/i.test(event.target.tagName) || event.type === 'focusin')
/input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE)
&& $.contains(parent, event.target)) {
continue
}
Expand Down Expand Up @@ -217,7 +217,7 @@ const Dropdown = (($) => {
}

static _dataApiKeydownHandler(event) {
if (!REGEXP_KEYDOWN.test(event.which) ||
if (!REGEXP_KEYDOWN.test(event.which) || /button/i.test(event.target.tagName) && event.which === SPACE_KEYCODE ||
/input|textarea/i.test(event.target.tagName)) {
return
}
Expand All @@ -232,8 +232,8 @@ const Dropdown = (($) => {
const parent = Dropdown._getParentFromElement(this)
const isActive = $(parent).hasClass(ClassName.SHOW)

if (!isActive && event.which !== ESCAPE_KEYCODE ||
isActive && event.which === ESCAPE_KEYCODE) {
if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) ||
isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {

if (event.which === ESCAPE_KEYCODE) {
const toggle = $(parent).find(Selector.DATA_TOGGLE)[0]
Expand Down Expand Up @@ -278,9 +278,8 @@ const Dropdown = (($) => {

$(document)
.on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)
.on(Event.KEYDOWN_DATA_API, Selector.ROLE_MENU, Dropdown._dataApiKeydownHandler)
.on(Event.KEYDOWN_DATA_API, Selector.ROLE_LISTBOX, Dropdown._dataApiKeydownHandler)
.on(`${Event.CLICK_DATA_API} ${Event.FOCUSIN_DATA_API}`, Dropdown._clearMenus)
.on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)
.on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)
.on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle)
.on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {
e.stopPropagation()
Expand Down
Loading