Библиотека ally.js предоставляет инструменты для управления фокусом и доступностью элементов интерфейса, что особенно важно при работе с редактируемыми ячейками в таблицах или интерактивных сетках данных. Редактируемые ячейки — это элементы, которые могут принимать пользовательский ввод, но при этом должны оставаться доступными для клавиатурного навигации и технологий вспомогательного доступа.
Ключевые задачи редактируемых ячеек:
role="gridcell", aria-selected и
aria-readonly).Редактируемая ячейка обычно представлена как <div>
или <td> с атрибутом tabindex="0", чтобы
сделать её фокусируемой. ally.js позволяет программно
управлять фокусом и проверять, доступен ли элемент для
взаимодействия:
import ally from 'ally.js';
const cell = document.querySelector('.editable-cell');
ally.focus.focusElement({ context: cell });
Метод focusElement гарантирует, что фокус перейдет
именно на указанный элемент, даже если в DOM присутствуют элементы с
tabindex="-1" или скрытые блоки.
Для сеток данных важно определять, какие ячейки доступны для
редактирования в текущий момент. ally.js предоставляет
функцию tabbable:
const editableCells = ally.query.tab({
context: document.querySelector('table'),
filter: '.editable-cell'
});
editableCells.forEach(cell => {
console.log(cell.textContent);
});
Особенности использования:
context ограничивает область поиска.filter позволяет выбрать только элементы с определённым
классом или атрибутом.Редактируемые ячейки часто требуют обработки клавиатуры: Enter для активации режима редактирования, Escape для выхода, стрелки для перемещения между ячейками.
cell.addEventListener('keydown', (event) => {
switch (event.key) {
case 'Enter':
cell.setAttribute('contenteditable', 'true');
ally.focus.focusElement({ context: cell });
break;
case 'Escape':
cell.removeAttribute('contenteditable');
break;
case 'ArrowRight':
moveFocusToNextCell(cell, 'right');
break;
case 'ArrowLeft':
moveFocusToNextCell(cell, 'left');
break;
}
});
Функция moveFocusToNextCell может использовать
ally.query.firstTabbable или
ally.query.nextTabbable, чтобы программно переходить между
ячейками:
function moveFocusToNextCell(current, direction) {
const nextCell = direction === 'right'
? ally.query.nextTabbable({ context: current.parentElement })
: ally.query.previousTabbable({ context: current.parentElement });
if (nextCell) ally.focus.focusElement({ context: nextCell });
}
В редактируемых таблицах ячейки могут становиться доступными или недоступными в зависимости от условий. ally.js позволяет проверять видимость и фокусируемость:
if (ally.maintain.hidden({ context: cell })) {
cell.setAttribute('aria-disabled', 'true');
} else {
cell.removeAttribute('aria-disabled');
}
Советы по использованию ARIA:
aria-readonly="true" для ячеек, которые нельзя
редактировать.aria-selected="true" для активной ячейки.role="gridcell" для всех ячеек внутри таблицы с
role="grid".Если данные загружаются динамически, фокусирование должно выполняться после добавления элемента в DOM:
async function addEditableCell(row, value) {
const newCell = document.createElement('td');
newCell.className = 'editable-cell';
newCell.textContent = value;
row.appendChild(newCell);
await ally.focus.focusElement({ context: newCell });
}
Метод focusElement корректно работает даже с
динамическими элементами, обеспечивая мгновенный доступ к
редактированию.
tabindex="0" только для интерактивных
ячеек. Остальные должны оставаться нефокусируемыми.contenteditable, aria-readonly,
aria-selected).ally.query.tabbable
перед программным фокусированием, чтобы избежать ошибок при скрытых или
заблокированных ячейках.Редактируемые ячейки часто используются в сложных интерфейсах, где есть модальные окна, всплывающие подсказки и фильтры. ally.js помогает:
tabbable и nextTabbable.Эта гибкость делает ally.js ключевым инструментом при реализации доступных и интерактивных редактируемых ячеек в современных веб-приложениях.