Здесь подробно рассказано о js коде States скриптов. О том как с ними работать в Elementor редакторе можно узнать здесь
States API доступно с помощью глобальной js переменной window.states. В этом объекте находятся 6 объектов для 6 состояний:
disabled- Отключено / Disabledselected- Выбрано / Selectedvisited- Посещено / Visitedcorrect- Корректно / Correctincorrect- Некорректно / Incorrect
А так же метод reset(el), который сбрасывает все состояния у переданного html элемента
Api
//Disabled состояние (сохраняется в оболочку) (работает по группе)
states.disabled.add('<group_name>') // включить элементы с группой
states.disabled.remove('<group_name>') // отключить элементы с группой
states.disabled.toggle('<group_name>') // переключить элементы с группой
states.disabled.reset(html_element) // отключить все группы у элемента
//Hidden состояние (сохраняется в оболочку) (работает по css селектору)
states.hidden.add('<selector>') // скрыть элементы по селектору
states.hidden.remove('<selector>') // показать элементы по селектору
states.hidden.toggle('<selector>') // переключить элементы по селектору
states.hidden.reset(html_element) // сбросить все селекторы из-за которых скрыт переданный элемент
//Selected состояние (не сохраняется в оболочку) (работает по элементу)
states.selected.select(html_element) // выбрать элемент
states.selected.reset(html_element) // сбросить выделение
//Visited состояние (сохраняется в оболочку) (работает по группе)
states.visited.visit(html_element) // отметить посещенный элемент. Если сам элемент не поддерживает visited состояние, то элемент ищется среди родительских
states.visited.reset(html_element) // сбросить visited состояние у всех групп элемента
//Correct состояние (сохраняется в оболочку) (работает по группе)
states.correct.add('<group_name>') //добавить состояние "корректно"
states.correct.remove('<group_name>') //отключить состояние "корректно"
states.correct.toggle('<group_name>') //переключить состояние "корректно"
states.correct.reset(html_element) // отключить все группы у элемента
//Incorrect состояние (сохраняется в оболочку) (работает по группе)
states.incorrect.add('<group_name>') //добавить состояние "некорректно"
states.incorrect.remove('<group_name>') //отключить состояние "некорректно"
states.incorrect.toggle('<group_name>') //переключить состояние "некорректно"
states.incorrect.reset(html_element) // отключить все группы у элемента
Основные классы
StateDefault
Базовый класс для сборки логики состояния. В нем есть свойство store со Store и elements с ElementsControllerBase. А так же методы:
constructor(stateName, elementsControllerName)- конструктор класса.StateName- имя состояния,elementsControllerName- один из двух дочерних классов ElementsControllerBase (group или selector )init- инициализация состояние. Восстановление активных состояний из оболочки и навешивание обработчиков событийresetInWidget(widgetId)- сброс состояния в виджетеreset(el)- сброс состояния на html элементе. Определяется в дочерних классах
StateApi
Добавляет к дефолтному классу набор методов для удобного взаимодействия с состоянием извне с помощью js кода.
Методы:
add(groupName)- активирует состояние у группыremove(groupName)- отключает состояние у группыtoggle(groupName)- переключает состояние у группыreset(el)- сбрасывает состояние у html элемента
StateVisited
Тот же StateDefault, только в инициализацию добавлен обработчик клика по виджету, чтобы активировать visited состояние. Подробнее про visited состояние здесь
Добавлен метод visit(el), который добавляет элементу visited состояние. Используется в обработчике клика по виджету, но может быть использовано напрямую.
Определен метод reset(el) для возможности сброса visited состояния
StateSelected
Тот же StateDefault, но кликнутым элементам с поддержкой этого состояния добавляется selected состояние. Подробнее про selected состояние здесь
Добавлен метод select(el), который добавляет элементу selected состояние. Используется в обработчике клика по виджету, но может быть использовано напрямую.
Определен метод reset(el) для возможности сброса selected состояния
StateDisabled
Тот же StateApi, только для отключенных элементов добавляется js обработчик отключающий нажатия. Данный обработчик нужен, так как невозможно добавить одному элементу два css свойства: cursor: not-allowed и pointer-events: none, поэтому второе правило заменено js кодом
Вспомогательные классы
Store
Класс для работы с данными в оболочке курсов. Данные сохраняются в переменной вида state<Statename>. Взаимодействие с классом происходит через свойство store в классе StateDefault и его дочерних классах
Класс обладает несколькими методами для работы с данными:
get- получает все данные о состоянии из оболочкиset- сохраняет данные состояния в оболочкуadd- добавляет группу в активныеremove- удаляет группу из активныхtoggle- переключает состояние у группыincludes- проверяет активно ли состояние для группы
ElementsControllerBase
На основе данных о состоянии из Store нужно обновлять состояние элементов на странице. Для этого предназначены классы ElementsControllerBase.
Конструктор класса требуется stateName - состояние, элементами которого будет управлять данный класс
Методы:
get(groupName)- возвращает все элементы, которые принадлежат группеgroupName. Должен быть определен в дочернем классеgetAll()- возвращает все элементы с поддержкой состояния. Должен быть определен в дочернем классеgetGroups(el)- возвращает массив с группами, к которым принадлежит элемент. Должен быть определен в дочернем классеaddState(el)- активирует состояниеremoveState(el)- отключает состояние
ElementsControllerGroup
Расширяет Base класс для работы с группами. Группа элементов объединяется общим id, который прописан в data атрибуте состояния. Например элемент <p data-state-disabled="elId group1 group2"></p> принадлежит к группам elId, group1 и group2. В одной группе может находиться множество элементов, и как раз для управления состоянием сразу множества элементов создан ElementsControllerGroup. Поддержка состояний и группы, к которым относится виджет задаются в секции States (Состояния), каждый виджет по умолчанию принадлежит к группе со своим id, чтобы всегда иметь возможность задавать состояние одному элементу
Методы:
get(groupName)- возвращает все элементы переданной группыgetAll()- возвращает все элементы с поддержкой состоянияgetGroups(el)- возвращает все группы элемента
ElementsControllerSelector
Html элементам под управлением данного класса состояние задается по css селектору. Так что здесь вместо групп используется css селектор и это главная особенность эт ого класса. В данный момент этот класс используется только для Hidden состояние и может быть задан с помощью js кода или действием "Скрыть/Показать" в триггерах
Состояния использующие этот контроллер, не должны содержать data атрибут. Любой элемент может получить состояние, если соответствует селектору.
Методы:
get(selector)- возвращает все массивы по селекторуgetAll()- возвращает все элементы, у которых активировано состояниеgetGroups(el)- возвращает все селекторы, по которым к элементу применено состояние