Commit bc0cf36d authored by Mark Otto's avatar Mark Otto
Browse files

grunt

parent 6d64afe5
Showing with 26 additions and 29 deletions
+26 -29
...@@ -62,6 +62,7 @@ var Button = function ($) { ...@@ -62,6 +62,7 @@ var Button = function ($) {
Button.prototype.toggle = function toggle() { Button.prototype.toggle = function toggle() {
var triggerChangeEvent = true; var triggerChangeEvent = true;
var addAriaPressed = true;
var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0]; var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0];
if (rootElement) { if (rootElement) {
...@@ -86,10 +87,13 @@ var Button = function ($) { ...@@ -86,10 +87,13 @@ var Button = function ($) {
} }
input.focus(); input.focus();
addAriaPressed = false;
} }
} }
this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE)); if (addAriaPressed) {
this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE));
}
if (triggerChangeEvent) { if (triggerChangeEvent) {
$(this._element).toggleClass(ClassName.ACTIVE); $(this._element).toggleClass(ClassName.ACTIVE);
......
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
...@@ -150,7 +150,6 @@ var Collapse = function ($) { ...@@ -150,7 +150,6 @@ var Collapse = function ($) {
$(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING); $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING);
this._element.style[dimension] = 0; this._element.style[dimension] = 0;
this._element.setAttribute('aria-expanded', true);
if (this._triggerArray.length) { if (this._triggerArray.length) {
$(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true); $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true);
...@@ -202,8 +201,6 @@ var Collapse = function ($) { ...@@ -202,8 +201,6 @@ var Collapse = function ($) {
$(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW); $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW);
this._element.setAttribute('aria-expanded', false);
if (this._triggerArray.length) { if (this._triggerArray.length) {
$(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false); $(this._triggerArray).addClass(ClassName.COLLAPSED).attr('aria-expanded', false);
} }
...@@ -269,7 +266,6 @@ var Collapse = function ($) { ...@@ -269,7 +266,6 @@ var Collapse = function ($) {
Collapse.prototype._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { Collapse.prototype._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {
if (element) { if (element) {
var isOpen = $(element).hasClass(ClassName.SHOW); var isOpen = $(element).hasClass(ClassName.SHOW);
element.setAttribute('aria-expanded', isOpen);
if (triggerArray.length) { if (triggerArray.length) {
$(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen); $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);
......
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
...@@ -25,10 +25,11 @@ var Dropdown = function ($) { ...@@ -25,10 +25,11 @@ var Dropdown = function ($) {
var JQUERY_NO_CONFLICT = $.fn[NAME]; var JQUERY_NO_CONFLICT = $.fn[NAME];
var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key
var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key
var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key
var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key
var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key
var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)
var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + '|' + ARROW_DOWN_KEYCODE + '|' + ESCAPE_KEYCODE + '|' + SPACE_KEYCODE); var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + '|' + ARROW_DOWN_KEYCODE + '|' + ESCAPE_KEYCODE);
var Event = { var Event = {
HIDE: 'hide' + EVENT_KEY, HIDE: 'hide' + EVENT_KEY,
...@@ -37,24 +38,21 @@ var Dropdown = function ($) { ...@@ -37,24 +38,21 @@ var Dropdown = function ($) {
SHOWN: 'shown' + EVENT_KEY, SHOWN: 'shown' + EVENT_KEY,
CLICK: 'click' + EVENT_KEY, CLICK: 'click' + EVENT_KEY,
CLICK_DATA_API: 'click' + EVENT_KEY + DATA_API_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
}; };
var ClassName = { var ClassName = {
BACKDROP: 'dropdown-backdrop',
DISABLED: 'disabled', DISABLED: 'disabled',
SHOW: 'show' SHOW: 'show'
}; };
var Selector = { var Selector = {
BACKDROP: '.dropdown-backdrop',
DATA_TOGGLE: '[data-toggle="dropdown"]', DATA_TOGGLE: '[data-toggle="dropdown"]',
FORM_CHILD: '.dropdown form', FORM_CHILD: '.dropdown form',
ROLE_MENU: '[role="menu"]', MENU: '.dropdown-menu',
ROLE_LISTBOX: '[role="listbox"]',
NAVBAR_NAV: '.navbar-nav', 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)'
}; };
/** /**
...@@ -101,14 +99,12 @@ var Dropdown = function ($) { ...@@ -101,14 +99,12 @@ var Dropdown = function ($) {
return false; return false;
} }
// set the backdrop only if the dropdown menu will be opened // if this is a touch-enabled device we add extra
// empty mouseover listeners to the body's immediate children;
// only needed because of broken event delegation on iOS
// https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) { if ('ontouchstart' in document.documentElement && !$(parent).closest(Selector.NAVBAR_NAV).length) {
$('body').children().on('mouseover', '*', $.noop);
// if mobile we use a backdrop because click events don't delegate
var dropdown = document.createElement('div');
dropdown.className = ClassName.BACKDROP;
$(dropdown).insertBefore(this);
$(dropdown).on('click', Dropdown._clearMenus);
} }
this.focus(); this.focus();
...@@ -153,7 +149,7 @@ var Dropdown = function ($) { ...@@ -153,7 +149,7 @@ var Dropdown = function ($) {
}; };
Dropdown._clearMenus = function _clearMenus(event) { Dropdown._clearMenus = function _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; return;
} }
...@@ -169,7 +165,7 @@ var Dropdown = function ($) { ...@@ -169,7 +165,7 @@ var Dropdown = function ($) {
continue; continue;
} }
if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'focusin') && $.contains(parent, event.target)) { if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {
continue; continue;
} }
...@@ -179,10 +175,10 @@ var Dropdown = function ($) { ...@@ -179,10 +175,10 @@ var Dropdown = function ($) {
continue; continue;
} }
// remove backdrop only if the dropdown menu will be hidden // if this is a touch-enabled device we remove the extra
var backdrop = $(parent).find(Selector.BACKDROP)[0]; // empty mouseover listeners we added for iOS support
if (backdrop) { if ('ontouchstart' in document.documentElement) {
backdrop.parentNode.removeChild(backdrop); $('body').children().off('mouseover', '*', $.noop);
} }
toggles[i].setAttribute('aria-expanded', 'false'); toggles[i].setAttribute('aria-expanded', 'false');
...@@ -203,7 +199,7 @@ var Dropdown = function ($) { ...@@ -203,7 +199,7 @@ var Dropdown = function ($) {
}; };
Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {
if (!REGEXP_KEYDOWN.test(event.which) || /input|textarea/i.test(event.target.tagName)) { if (!REGEXP_KEYDOWN.test(event.which) || /button/i.test(event.target.tagName) && event.which === SPACE_KEYCODE || /input|textarea/i.test(event.target.tagName)) {
return; return;
} }
...@@ -217,7 +213,7 @@ var Dropdown = function ($) { ...@@ -217,7 +213,7 @@ var Dropdown = function ($) {
var parent = Dropdown._getParentFromElement(this); var parent = Dropdown._getParentFromElement(this);
var isActive = $(parent).hasClass(ClassName.SHOW); var 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) { if (event.which === ESCAPE_KEYCODE) {
var toggle = $(parent).find(Selector.DATA_TOGGLE)[0]; var toggle = $(parent).find(Selector.DATA_TOGGLE)[0];
...@@ -269,7 +265,7 @@ var Dropdown = function ($) { ...@@ -269,7 +265,7 @@ var Dropdown = function ($) {
* ------------------------------------------------------------------------ * ------------------------------------------------------------------------
*/ */
$(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.CLICK_DATA_API, Selector.DATA_TOGGLE, Dropdown.prototype.toggle).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) { $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).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, function (e) {
e.stopPropagation(); e.stopPropagation();
}); });
......
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
...@@ -284,6 +284,7 @@ var Modal = function ($) { ...@@ -284,6 +284,7 @@ var Modal = function ($) {
if (this._isShown && this._config.keyboard) { if (this._isShown && this._config.keyboard) {
$(this._element).on(Event.KEYDOWN_DISMISS, function (event) { $(this._element).on(Event.KEYDOWN_DISMISS, function (event) {
if (event.which === ESCAPE_KEYCODE) { if (event.which === ESCAPE_KEYCODE) {
event.preventDefault();
_this5.hide(); _this5.hide();
} }
}); });
......
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment