UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

52 lines (50 loc) 1.83 kB
/** * DevExtreme (esm/__internal/core/utils/m_selectors.js) * Version: 25.2.3 * Build date: Fri Dec 12 2025 * * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ import domAdapter from "../../../core/dom_adapter"; import $ from "../../../core/renderer"; const focusableFn = (element, tabIndex) => { if (!visible(element)) { return false } const nodeName = element.nodeName.toLowerCase(); const isTabIndexNotNaN = !isNaN(tabIndex); const isDisabled = element.disabled; const isDefaultFocus = /^(input|select|textarea|button|object|iframe)$/.test(nodeName); const isHyperlink = "a" === nodeName; let isFocusable; const { isContentEditable: isContentEditable } = element; if (isDefaultFocus || isContentEditable) { isFocusable = !isDisabled } else if (isHyperlink) { isFocusable = element.href || isTabIndexNotNaN } else { isFocusable = isTabIndexNotNaN } return isFocusable }; function visible(element) { const $element = $(element); return $element.is(":visible") && "hidden" !== $element.css("visibility") && "hidden" !== $element.parents().css("visibility") } export const focusable = (index, element) => focusableFn(element, $(element).attr("tabIndex")); export const tabbable = (index, element) => { const tabIndex = $(element).attr("tabIndex"); return (isNaN(tabIndex) || tabIndex >= 0) && focusableFn(element, tabIndex) }; export const focused = $element => { const element = $($element).get(0); return domAdapter.getActiveElement(element) === element }; export default { focusable: focusable, tabbable: tabbable, focused: focused };