mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2026-03-13 10:22:08 +08:00
48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
|
|
const ION_FOCUSED = 'ion-focused';
|
|
const ION_FOCUSABLE = 'ion-focusable';
|
|
const FOCUS_KEYS = ['Tab', 'ArrowDown', 'Space', 'Escape', ' ', 'Shift', 'Enter', 'ArrowLeft', 'ArrowRight', 'ArrowUp'];
|
|
|
|
export const startFocusVisible = () => {
|
|
|
|
let currentFocus: Element[] = [];
|
|
let keyboardMode = true;
|
|
|
|
const doc = document;
|
|
const setFocus = (elements: Element[]) => {
|
|
currentFocus.forEach(el => el.classList.remove(ION_FOCUSED));
|
|
elements.forEach(el => el.classList.add(ION_FOCUSED));
|
|
currentFocus = elements;
|
|
};
|
|
const pointerDown = () => {
|
|
keyboardMode = false;
|
|
setFocus([]);
|
|
};
|
|
|
|
doc.addEventListener('keydown', ev => {
|
|
keyboardMode = FOCUS_KEYS.includes(ev.key);
|
|
if (!keyboardMode) {
|
|
setFocus([]);
|
|
}
|
|
});
|
|
|
|
doc.addEventListener('focusin', ev => {
|
|
if (keyboardMode && ev.composedPath) {
|
|
const toFocus = ev.composedPath().filter((el: any) => {
|
|
if (el.classList) {
|
|
return el.classList.contains(ION_FOCUSABLE);
|
|
}
|
|
return false;
|
|
}) as Element[];
|
|
setFocus(toFocus);
|
|
}
|
|
});
|
|
doc.addEventListener('focusout', () => {
|
|
if (doc.activeElement === doc.body) {
|
|
setFocus([]);
|
|
}
|
|
});
|
|
doc.addEventListener('touchstart', pointerDown);
|
|
doc.addEventListener('mousedown', pointerDown);
|
|
};
|