UNPKG

3.05 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4var aria = aria || {};
5
6aria.Utils = aria.Utils || {};
7
8/**
9 * @desc Set focus on descendant nodes until the first focusable element is
10 * found.
11 * @param element
12 * DOM node for which to find the first focusable descendant.
13 * @returns
14 * true if a focusable element is found and focus is set.
15 */
16aria.Utils.focusFirstDescendant = function (element) {
17 for (var i = 0; i < element.childNodes.length; i++) {
18 var child = element.childNodes[i];
19 if (aria.Utils.attemptFocus(child) || aria.Utils.focusFirstDescendant(child)) {
20 return true;
21 }
22 }
23 return false;
24};
25
26/**
27 * @desc Find the last descendant node that is focusable.
28 * @param element
29 * DOM node for which to find the last focusable descendant.
30 * @returns
31 * true if a focusable element is found and focus is set.
32 */
33
34aria.Utils.focusLastDescendant = function (element) {
35 for (var i = element.childNodes.length - 1; i >= 0; i--) {
36 var child = element.childNodes[i];
37 if (aria.Utils.attemptFocus(child) || aria.Utils.focusLastDescendant(child)) {
38 return true;
39 }
40 }
41 return false;
42};
43
44/**
45 * @desc Set Attempt to set focus on the current node.
46 * @param element
47 * The node to attempt to focus on.
48 * @returns
49 * true if element is focused.
50 */
51aria.Utils.attemptFocus = function (element) {
52 if (!aria.Utils.isFocusable(element)) {
53 return false;
54 }
55 aria.Utils.IgnoreUtilFocusChanges = true;
56 try {
57 element.focus();
58 } catch (e) {}
59 aria.Utils.IgnoreUtilFocusChanges = false;
60 return document.activeElement === element;
61};
62
63aria.Utils.isFocusable = function (element) {
64 if (element.tabIndex > 0 || element.tabIndex === 0 && element.getAttribute('tabIndex') !== null) {
65 return true;
66 }
67
68 if (element.disabled) {
69 return false;
70 }
71
72 switch (element.nodeName) {
73 case 'A':
74 return !!element.href && element.rel !== 'ignore';
75 case 'INPUT':
76 return element.type !== 'hidden' && element.type !== 'file';
77 case 'BUTTON':
78 case 'SELECT':
79 case 'TEXTAREA':
80 return true;
81 default:
82 return false;
83 }
84};
85
86/**
87 * 触发一个事件
88 * mouseenter, mouseleave, mouseover, keyup, change, click 等
89 * @param {Element} elm
90 * @param {String} name
91 * @param {*} opts
92 */
93aria.Utils.triggerEvent = function (elm, name) {
94 var eventName = void 0;
95
96 if (/^mouse|click/.test(name)) {
97 eventName = 'MouseEvents';
98 } else if (/^key/.test(name)) {
99 eventName = 'KeyboardEvent';
100 } else {
101 eventName = 'HTMLEvents';
102 }
103 var evt = document.createEvent(eventName);
104
105 for (var _len = arguments.length, opts = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
106 opts[_key - 2] = arguments[_key];
107 }
108
109 evt.initEvent.apply(evt, [name].concat(opts));
110 elm.dispatchEvent ? elm.dispatchEvent(evt) : elm.fireEvent('on' + name, evt);
111
112 return elm;
113};
114
115aria.Utils.keys = {
116 tab: 9,
117 enter: 13,
118 space: 32,
119 left: 37,
120 up: 38,
121 right: 39,
122 down: 40,
123 esc: 27
124};
125
126exports.default = aria.Utils;
\No newline at end of file