a11y.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import { get } from "lodash";
  2. export function handlePrevent(event: any) {
  3. event.stopPropagation();
  4. event.preventDefault();
  5. }
  6. export function isPrintableCharacter(string: string): RegExpMatchArray {
  7. return string.length === 1 && string.match(/\S/);
  8. }
  9. // set focus to the target item in item list
  10. export function setFocusToItem(itemNodes: HTMLElement[], targetItem: HTMLElement): void {
  11. for (let i = 0; i < itemNodes.length; i++) {
  12. if (itemNodes[i] === targetItem) {
  13. itemNodes[i].tabIndex = 0;
  14. itemNodes[i].focus();
  15. } else {
  16. itemNodes[i].tabIndex = -1;
  17. }
  18. }
  19. }
  20. // set focus to the first item in item list
  21. export function setFocusToFirstItem(itemNodes: HTMLElement[]): void {
  22. itemNodes.length > 0 && setFocusToItem(itemNodes, itemNodes[0]);
  23. }
  24. // set focus to the last item in item list
  25. export function setFocusToLastItem(itemNodes: HTMLElement[]): void {
  26. itemNodes.length > 0 && setFocusToItem(itemNodes, itemNodes[itemNodes.length-1]);
  27. }
  28. // set focus to the previous item in item list
  29. export function setFocusToPreviousMenuItem (itemNodes: HTMLElement[], currentItem: HTMLElement): void {
  30. let newMenuItem: HTMLElement, index: number;
  31. if (itemNodes.length > 0){
  32. if (currentItem === itemNodes[0]) {
  33. newMenuItem = itemNodes[itemNodes.length-1];
  34. } else {
  35. index = itemNodes.indexOf(currentItem);
  36. newMenuItem = itemNodes[index - 1];
  37. }
  38. setFocusToItem(itemNodes, newMenuItem);
  39. }
  40. }
  41. // set focus to the next item in item list
  42. export function setFocusToNextMenuitem (itemNodes: HTMLElement[], currentItem: HTMLElement): void {
  43. let newMenuItem: HTMLElement, index: number;
  44. if (itemNodes.length > 0){
  45. if (currentItem === itemNodes[itemNodes.length-1]) {
  46. newMenuItem = itemNodes[0];
  47. } else {
  48. index = itemNodes.indexOf(currentItem);
  49. newMenuItem = itemNodes[index + 1];
  50. }
  51. setFocusToItem(itemNodes, newMenuItem);
  52. }
  53. }
  54. export function findIndexByCharacter(itemList: HTMLElement[], curItem: HTMLElement, firstCharList: string[], char: string): number {
  55. let start: number, index: number;
  56. if (!itemList || !firstCharList || !char || char.length > 1) {
  57. return -1;
  58. }
  59. char = char.toLowerCase();
  60. // Get start index for search based on position of currentItem
  61. start = itemList.indexOf(curItem) + 1;
  62. if (start >= itemList.length) {
  63. start = 0;
  64. }
  65. // Check remaining menu items in the menu
  66. index = firstCharList.indexOf(char, start);
  67. // If not found in remaining menu items, check from beginning
  68. if (index === -1) {
  69. index = firstCharList.indexOf(char, 0);
  70. }
  71. return index >= 0 ? index : -1;
  72. }
  73. export function getAncestorNodeByRole(curElement: Element, role: string): Element {
  74. if (!curElement) {
  75. return null;
  76. }
  77. while (curElement.parentElement && get(curElement.parentElement, 'attributes.role.value', '') !== role){
  78. curElement = curElement.parentElement;
  79. }
  80. return curElement.parentElement;
  81. }
  82. // According to the Id, find the corresponding data-popupId element
  83. export function getMenuButton(focusableEle: NodeListOf<HTMLElement>, Id: string): HTMLElement{
  84. for (let i = 0; i < focusableEle.length; i++){
  85. const curAriDescribedby = focusableEle[i].attributes['data-popupId'];
  86. if (curAriDescribedby && curAriDescribedby.value === Id){
  87. return focusableEle[i];
  88. }
  89. }
  90. return null;
  91. }