|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- function hidden(node) {
- return node.style.display === 'none';
- }
-
- function visible(node) {
- while (node) {
- if (node === document.body) {
- break;
- }
-
- if (hidden(node)) {
- return false;
- }
-
- node = node.parentNode;
- }
-
- return true;
- }
-
- function focusable(node) {
- var nodeName = node.nodeName.toLowerCase();
- var tabIndex = parseInt(node.getAttribute('tabindex'), 10);
- var hasTabIndex = !isNaN(tabIndex) && tabIndex > -1;
-
- if (visible(node)) {
- if (['input', 'select', 'textarea', 'button'].indexOf(nodeName) > -1) {
- return !node.disabled;
- } else if (nodeName === 'a') {
- return node.getAttribute('href') || hasTabIndex;
- }
-
- return node.isContentEditable || hasTabIndex;
- }
- }
-
- export function getFocusNodeList(node) {
- var res = [].slice.call(node.querySelectorAll('*'), 0).filter(function (child) {
- return focusable(child);
- });
-
- if (focusable(node)) {
- res.unshift(node);
- }
-
- return res;
- }
- var lastFocusElement = null;
- export function saveLastFocusNode() {
- lastFocusElement = document.activeElement;
- }
- export function clearLastFocusNode() {
- lastFocusElement = null;
- }
- export function backLastFocusNode() {
- if (lastFocusElement) {
- try {
- // 元素可能已经被移动了
- lastFocusElement.focus();
- /* eslint-disable no-empty */
- } catch (e) {} // empty
-
- /* eslint-enable no-empty */
-
- }
- }
- export function limitTabRange(node, e) {
- if (e.keyCode === 9) {
- var tabNodeList = getFocusNodeList(node);
- var lastTabNode = tabNodeList[e.shiftKey ? 0 : tabNodeList.length - 1];
- var leavingTab = lastTabNode === document.activeElement || node === document.activeElement;
-
- if (leavingTab) {
- var target = tabNodeList[e.shiftKey ? tabNodeList.length - 1 : 0];
- target.focus();
- e.preventDefault();
- }
- }
- }
|