/**
* 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;
});
|