is-natively-focusable.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import AbstractVirtualNode from '../../core/base/virtual-node/abstract-virtual-node';
  2. import { getNodeFromTree, querySelectorAll } from '../../core/utils';
  3. import focusDisabled from './focus-disabled';
  4. /**
  5. * Determines if an element is focusable without considering its tabindex
  6. * @method isNativelyFocusable
  7. * @memberof axe.commons.dom
  8. * @instance
  9. * @param {HTMLElement|VirtualNode} el The HTMLElement
  10. * @return {Boolean} True if the element is in the focus order but wouldn't be
  11. * if its tabindex were removed. Else, false.
  12. */
  13. function isNativelyFocusable(el) {
  14. const vNode = el instanceof AbstractVirtualNode ? el : getNodeFromTree(el);
  15. if (!vNode || focusDisabled(vNode)) {
  16. return false;
  17. }
  18. switch (vNode.props.nodeName) {
  19. case 'a':
  20. case 'area':
  21. if (vNode.hasAttr('href')) {
  22. return true;
  23. }
  24. break;
  25. case 'input':
  26. return vNode.props.type !== 'hidden';
  27. case 'textarea':
  28. case 'select':
  29. case 'summary':
  30. case 'button':
  31. return true;
  32. case 'details':
  33. return !querySelectorAll(vNode, 'summary').length;
  34. }
  35. return false;
  36. }
  37. export default isNativelyFocusable;