1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- define([
- 'jquery'
- ], function ($) {
- 'use strict';
- /**
- * @return {Object}
- * @constructor
- */
- function KeyboardHandler() {
- var body = $('body'),
- focusState = false,
- tabFocusClass = '_keyfocus',
- productsGrid = '[data-container="product-grid"]',
- catalogProductsGrid = $(productsGrid),
- CODE_TAB = 9;
- /**
- * Handle logic, when onTabKeyPress fired at first.
- * Then it changes state.
- */
- function onFocusInHandler() {
- focusState = true;
- body.addClass(tabFocusClass)
- .off('focusin.keyboardHandler', onFocusInHandler);
- }
- /**
- * Handle logic to remove state after onTabKeyPress to normal.
- */
- function onClickHandler() {
- focusState = false;
- body.removeClass(tabFocusClass)
- .off('click', onClickHandler);
- }
- /**
- * Tab key onKeypress handler. Apply main logic:
- * - call differ actions onTabKeyPress and onClick
- */
- function smartKeyboardFocus() {
- $(document).on('keydown keypress', function (event) {
- if (event.which === CODE_TAB && !focusState) {
- body
- .on('focusin.keyboardHandler', onFocusInHandler)
- .on('click', onClickHandler);
- }
- });
- // ARIA support for catalog grid products
- if (catalogProductsGrid.length) {
- body.on('focusin.gridProducts', productsGrid, function () {
- if (body.hasClass(tabFocusClass)) {
- $(this).addClass('active');
- }
- });
- body.on('focusout.gridProducts', productsGrid, function () {
- $(this).removeClass('active');
- });
- }
- }
- /**
- * Attach smart focus on specific element.
- * @param {jQuery} element
- */
- function handleFocus(element) {
- element.on('focusin.emulateTabFocus', function () {
- focusState = true;
- body.addClass(tabFocusClass);
- element.off();
- });
- element.on('focusout.emulateTabFocus', function () {
- focusState = false;
- body.removeClass(tabFocusClass);
- element.off();
- });
- }
- return {
- apply: smartKeyboardFocus,
- focus: handleFocus
- };
- }
- return new KeyboardHandler;
- });
|