is-focusable.js 959 B

123456789101112131415161718192021222324252627282930313233343536
  1. import focusDisabled from './focus-disabled';
  2. import isNativelyFocusable from './is-natively-focusable';
  3. import AbstractVirtualNode from '../../core/base/virtual-node/abstract-virtual-node';
  4. import { getNodeFromTree } from '../../core/utils';
  5. /**
  6. * Determines if an element is focusable
  7. * @method isFocusable
  8. * @memberof axe.commons.dom
  9. * @instance
  10. * @param {HTMLElement} el The HTMLElement
  11. * @return {Boolean} The element's focusability status
  12. */
  13. function isFocusable(el) {
  14. const vNode = el instanceof AbstractVirtualNode ? el : getNodeFromTree(el);
  15. if (vNode.props.nodeType !== 1) {
  16. return false;
  17. }
  18. if (focusDisabled(vNode)) {
  19. return false;
  20. } else if (isNativelyFocusable(vNode)) {
  21. return true;
  22. }
  23. // check if the tabindex is specified and a parseable number
  24. var tabindex = vNode.attr('tabindex');
  25. if (tabindex && !isNaN(parseInt(tabindex, 10))) {
  26. return true;
  27. }
  28. return false;
  29. }
  30. export default isFocusable;