При создании любого компонента на странице (даже одного), каждый раз происходит инициализация модуля UIManager. Этот модуль делает следующее:
Для управления фокусом, у Webix контролов (Button, Text, и т.д.), формы и тулбара предусмотрены 2 противоположных метода:
$$("toolbar").focus(); // устанавливает фокус на тулбаре
$$("toolbar").blur(); // убирает фокус с тулбара
$$("form").focus(); // устанавливает фокус на первый фокусируемый элемент формы
Если вызвать метод focus() для формы или тулбара, то в качестве параметра можно передать название необходимого контрола. В этом случае, фокус будет установлен на указанный контрол, а не на форму или тулбар:
$$("form").focus("text1");
// устанавливает фокус на контрол text с названием "text1"
У модуля UIManager есть несколько методов, которые принимают ID нужных виджетов:
Чтобы установить фокус на компонент данных, необходимо вызвать для него метод setFocus(), а затем применить метод select(), чтобы сделать фокус видимым:
Устанавливаем фокус на виджет с ID "books"
webix.ui({ id: "books", view: "list" });
webix.UIManager.setFocus("books"); // устанавливает фокус
$$("books").select($$("books").getFirstId()); // делает фокус видимым
У каждого компонента Webix есть пара событий onFocus и onBlur, с помощью которых можно управлять фокусом компонента:
$$("datatable1").attachEvent("onFocus", function(current_view, prev_view){
// параметр current_view - это таблица
});
$$("datatable1").attachEvent("onBlur", function(prev_view){
// параметр prev_view - это таблица
});
Кроме этих двух событий, у Webix есть глобальное событие onFocusChange, которое срабатывает каждый раз, когда фокус перемещается с одного компонента к другому. Следующий код получает ID компонента на котором находится фокус и выводит его через консоль:
webix.attachEvent("onFocusChange", function(current_view, prev_view){
console.log("focused: " + (!current_view ? "null" : current_view.config.id));
});
Виджеты, которые находятся в фокусе, подписаны на события следующих клавиш и их сочетаний:
Информацию о глобальной навигации по вкладкам смотрите в соответствующей части текущей статьи.
Чтобы активировать горячие клавиши для навигации внутри компонентов данных (datatable и list), необходимо задать их свойству navigation значение true:
Компоненты данных реагируют на нажатие клавиш со стрелками следующим образом:
При нажатии на клавиши со стрелками "left", "right" и "Enter", компоненты c иерархическими данными (например Tree, Treetable и Grouplist) будут реагировать по своему:
Если ни один из элементов не выбран, фокус будет установлен на первый видимый элемент виджета.
Редакторы внутри компонентов данных реагируют при нажатии на следующие клавиши:
Такие контролы как combo, richselect, multiselect, multicombo, datepicker, daterangepicker и colorpicker подписаны на нажатие следующих клавиш:
В глобальный порядок перехода по вкладкам включена только первая вкладка/радиокнопка. Чтобы переключаться между элементами внутри этих контролов, необходимо использовать следующие клавиши:
Горячие клавиши для этих контролов активируются только если поле ввода или регулятор слайдера находятся в фокусе:
Кнопки виджета Carousel можно выделить и они входят в порядок перемещения фокуса по вкладкам. Помимо этого, если иконки виджета находятся в фокусе, они реагируют на нажатие по таким клавишам:
Если дата не выбрана, фокус будет установлен на первое число месяца.
Если calendar отображается в режиме выбора времени, то клавиши со стрелками "left" и "right" позволяют управлять часами, а клавиши со стрелками "up" и "down" - минутами.
Если ни одна из ячеек не выбрана, фокус будет установлен на первую видимую ячейку.
Обратите внимание, что если перевести фокус на один из контролов выбора цвета, то:
Вы можете определить собственные горячие клавиши, которые будут вызывать событие onClick. Название клавиши ("enter" или "space") необходимо указывать через свойство hotkey виджета:
{ view: "button", click: doOnClick, hotkey: "enter" }
Related sample: Hotkeys for Buttons
Функция-обработчик doOnClick будет выполнятся как при клике по самой кнопке, так и при нажатии на клавишу "enter".
Вы можете комбинировать клавиши при помощи знаков “+” или “-”:
{ view: "button", click: doOnClick, hotkey: "enter-shift" }
Учитывайте, что такая опция предусмотрена только для простых контролов (кнопки и инпуты). Для контролов с множественным выбором это не работает.
Для создания собственных горячих клавиш, у библиотеки предусмотрен метод addHotKey. Это метод вызывается из объекта UIManager и принимает два обязательных параметра:
Вы можете комбинировать клавиши при помощи знаков “+” или “-”.
Вы можете сделать горячие клавиши глобальными. Это значит, что они будут вызывать обработчик независимо от компонента.
webix.UIManager.addHotKey("Ctrl+V", function(){
webix.message("Ctrl+V for any");
});
Чтобы привязать горячую клавишу к определенному экземпляру виджета, необходимо предать его ID в качестве третьего параметра методу addHotKey().
Чтобы привязать горячую клавишу ко всем экземплярам виджета, необходимо передать название этого виджета (вместо ID) в качестве третьего параметра методу addHotKey().
// горячие клавиши для компонента с ID "details"
webix.UIManager.addHotKey("Ctrl+Enter", function(){
console.log("Ctrl+Enter for details");
return false;
}, $$("details")); // только для компонента list с ID "details"
// горячие клавиши для всех экземпляров виджета на странице
webix.UIManager.addHotKey("Ctrl+Space", function(){
console.log("Ctrl+Space is detected for list");
}, "list");
Related sample: Basic Use of Editors
Для удаления горячих клавиш, у библиотеки предусмотрен метод removeHotKey. Он принимает название горячей клавиши в качестве обязательного параметра.
// добавляем горячую клавишу
webix.UIManager.addHotKey("Ctrl+Space", function(){ ... }, "list");
// удаляем все горячие клавиши с указанным сочетанием
webix.UIManager.removeHotKey("Ctrl+Space");
Вы можете указать обработчик горячей клавиши в качестве второго параметра, чтобы удалить только эту горячую клавишу:
// удаляем горячую клавишу с указанным обработчиком
webix.UIManager.removeHotKey("up", my_function);
Чтобы удалить горячую клавишу из конкретного экземпляра виджета, необходимо указать его ID в качестве третьего параметра.
Чтобы удалить горячую клавишу из всех экземпляров виджета, необходимо указать его название (вместо ID) в качестве третьего параметра:
// удаляем горячую клавишу для компонента с ID "details"
webix.UIManager.removeHotKey("up", null, $$("details"));
// удаляем горячую клавишу для всех экземпляров компонента list на странице
webix.UIManager.removeHotKey("up", null, "list");
В примере ниже, клавиша Enter открывает соответствующий элемент с ID "details".
Но перед этим, необходимо проверить, чтобы эта клавиша не была связана с клавишами Ctrl, Shift и Alt:
Клавиша "Enter" в действии
$$("books").attachEvent("onKeyPress", function(code, e){
if (code === 13 && !e.ctrlKey && !e.shiftKey && !e.altKey) {
$$("details").getParentView().expand("details");
return false;
}
});
Для работы с этим событием необходимо знать коды тех клавиш, которые можно использовать в модуле UIManager:
Вы можете перемещаться между элементами приложения при помощи клавиши Tab и сочетания Shift+Tab. Все виджеты и их кликабельные элементы находятся в порядке перехода по вкладкам.
При переходе к виджету, фокус переместится на его активную область. Это может быть выбранный элемент, активная вкладка или радиокнопка, или же целый виджет (например инпут или кнопка). В случае компонентов данных, фокус перейдет к их первому видимому элементу.
Все кликабельные элементы виджета (кнопки, иконки, инпуты и т.д.) также находятся в порядке перехода по вкладкам.
Через методы модуля UIManager можно получить объект следующего/предыдущего виджета в порядке перехода по вкладкам:
Все эти методы принимают ID нужного виджета в качестве аргумента.
Давайте возьмем за пример изображение выше и посмотрим, как эти методы будут работать для контрола text с ID "year".
var prev = webix.UIManager.getPrev($$("year")); // возвращает объект поля "title"
var next = webix.UIManager.getNext($$("year")); // возвращает объект поля "rank"
var top = webix.UIManager.getTop($$("year")); // возвращает объект "layout"
Наверх