Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.16 KB | None | 0 0
  1. var sectioningSelector = 'article,aside,main,nav,section'
  2.  
  3. var map = {
  4. 'A': (el) => {
  5. return el.hasAttribute('href') ? 'link' : undefined
  6. },
  7. 'AREA': (el) => {
  8. return el.hasAttribute('href') ? 'link' : undefined
  9. },
  10. 'ARTICLE': 'article',
  11. 'ASIDE': 'complimentary',
  12. 'BUTTON': 'button',
  13. 'DATALIST': 'listbox',
  14. 'DD': 'definition',
  15. 'DETAILS': 'group',
  16. 'DIALOG': 'dialog',
  17. 'DL': 'list',
  18. 'DT': 'listitem',
  19. 'FIGURE': 'figure',
  20. 'FOOTER': (el) => {
  21. return !el.closest(sectioningSelector) ? 'contentinfo' : undefined
  22. },
  23. 'FORM': 'form',
  24. 'H1': 'heading',
  25. 'H2': 'heading',
  26. 'H3': 'heading',
  27. 'H4': 'heading',
  28. 'H5': 'heading',
  29. 'H6': 'heading',
  30. 'HEADER': (el) => {
  31. return !el.closest(sectioningSelector) ? 'banner' : 'undefined'
  32. },
  33. 'HR': 'seperator',
  34. 'IMG': (el) => {
  35. return (el.getAtttribute("alt") !== '') ? 'img': 'undefined'
  36. },
  37. 'INPUT': (el) => {
  38. let type = el.type
  39.  
  40. if (type === 'checkbox') {
  41. return 'checkbox'
  42. }
  43. if (type === 'number') {
  44. return 'spinbutton'
  45. }
  46. if (type === 'range') {
  47. return 'slider'
  48. }
  49. if (type === 'reset' || type === 'submit' || type === 'image' || type === 'button') {
  50. return 'button'
  51. }
  52. if (el.hasAttribute('list')) {
  53. if (type === 'text'
  54. || type === 'search'
  55. || type === 'tel'
  56. || type === 'url'
  57. || type=== 'email'
  58. ) {
  59. return 'combobox'
  60. }
  61. } else {
  62. if (type === 'email' || type === 'url' || type === 'text' || type=== 'tel') {
  63. return 'textbox'
  64. }
  65. if (type === 'search') {
  66. return 'searchbox'
  67. }
  68. }
  69. },
  70. 'LI': (el) => {
  71. var tagName = el.parentElement.tagName;
  72. return (tagName === 'OL' || tagName === 'UL') ? 'listitem' : undefined
  73. },
  74. 'LINK': (el) => { return el.hasAttribute('href') ? 'link' : undefined },
  75. 'MAIN': 'main',
  76. 'MATH': 'math',
  77. 'MENU': (el) => { return el.getAttribute('type') === 'context' ? 'menu' : undefined },
  78. 'MENUITEM': (el) => {
  79. var type = el.getAttribute('type')
  80. if (type === 'command') {
  81. return 'menuitem'
  82. }
  83. if (type === 'checkbox') {
  84. return 'menuitemcheckbox'
  85. }
  86. if (type === 'radio') {
  87. return 'menuitemradio'
  88. }
  89. },
  90. 'NAV': 'navigation',
  91. 'OL': 'list',
  92. 'OPTGROUP': 'group',
  93. 'OPTION': (el) => {
  94. el.matches('select,optgroup,datalist>option') ? 'option' : undefined
  95. },
  96. 'OUTPUT': 'status',
  97. 'PROGRESS': 'progressbar',
  98. 'SECTION': 'region',
  99. 'SELECT': 'listbox',
  100. 'SUMMARY': 'button',
  101. 'TABLE': 'table',
  102. 'TEXTAREA': 'textbox',
  103. 'TBODY': 'rowgroup',
  104. 'THEAD': 'rowgroup',
  105. 'TFOOT': 'rowgroup',
  106. 'TD': 'cell',
  107. 'TH': 'rowheader',
  108. 'TR': 'row',
  109. 'UL': 'list'
  110. }
  111. var mo = new MutationObserver((mutations) => {
  112. mutations.forEach((record) => {
  113. record.addedNodes.forEach((node) => {
  114. if (node.nodeType === 1 && !node.hasAttribute('role')){
  115. var key = node.nodeName,
  116. val = map[key]
  117. if (val) {
  118. if (typeof val === 'function') {
  119. val = val(node)
  120. }
  121. node.setAttribute('role', val)
  122. }
  123. }
  124. })
  125. })
  126. });
  127. mo.observe(document.documentElement, {
  128. childList: true,
  129. subtree: true
  130. })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement