JS-события
Скрипты шаблона общаются через собственную шину событий EventHandler (файл assets/js/libs/event.js). Подписка на события позволяет реагировать на корзину, формы и подгрузку контента, а также менять параметры AJAX-запросов — без правки файлов шаблона.
Как подписаться
Подписывайтесь в файле assets/js/custom.js шаблона: он подключается последним и не перезаписывается при обновлении — подробнее в разделе «Свои скрипты и стили».
EventHandler.register(['FormHandler', 'action'], function (params) {
console.log('Отправлена форма', params.type, params.data);
});- Имя события состоит из двух частей: источник и событие. Их передают массивом
['FormHandler', 'action']или строкой через вертикальную черту:'FormHandler|action'. - Обработчик получает один объект с параметрами события.
- Обработчики вызываются в порядке регистрации.
EventHandler.fire()возвращает значение последнего обработчика — так работают настраивающие событияajax::optionsиdata::<действие>. - Если в момент события на него ещё никто не подписан, шина запоминает событие и вызовет обработчик сразу при подписке. Поэтому подписка из
custom.jsне пропустит события, которые сработали при загрузке страницы, — например, первыйinitScripts. - Ошибка внутри обработчика перехватывается и выводится в консоль, но прерывает вызов следующих обработчиков этого события.
<script> в контенте страницы выполнится раньше, и EventHandler в нём ещё не будет определён. Пишите подписки в custom.js или оборачивайте их в document.addEventListener('DOMContentLoaded', …).Список событий
| Событие | Когда срабатывает | Параметры |
|---|---|---|
MainHandler | initScripts | После инициализации скриптов шаблона в блоке: при загрузке страницы (для всей страницы) и после каждой подгрузки контента | parent — jQuery-элемент блока |
AjaxHandler | content | После вставки на страницу HTML, полученного по AJAX: каталог, фильтр, всплывающие окна, формы, корзина | node — jQuery-элемент; иногда type, content |
AjaxHandler | content:<тип> | Перед вставкой содержимого AJAX-области этого типа | type, parent, content |
AjaxHandler | action | После выполнения действия по кнопке с атрибутом data-ajaxaction: cart:add, cart:setquantity, favorite:trigger, compare:trigger и другие | type — действие, button, data — отправленные данные, res — ответ сервера |
AjaxHandler | data::<действие> | Перед отправкой действия на сервер. Верните объект — отправятся эти данные; верните 'prevent' — действие отменится | action, button |
AjaxHandler | ajax::options | Перед каждым AJAX-запросом шаблона. Верните объект — он будет добавлен к настройкам $.ajax | data, options, type, иногда url |
AjaxHandler | counters | При обновлении счётчиков в шапке: корзина, избранное, сравнение | id, type, value |
FormHandler | action | После отправки любой AJAX-формы шаблона | node, type — тип формы, например form:callback, data — поля формы, result — ответ |
FormHandler | <тип формы> | То же для конкретной формы, например FormHandler | form:callback | node, data, result |
BasketHandler | action | Изменение количества на странице корзины | type — add2cart или removeFromCart, products, data |
OrderHandler | action | Шаги оформления заказа | type — checkout или purchase, products, data: id, price, tax, delivery |
PageHandler | action | Поиск по сайту | type: 'search', node, query |
PopupHandler | close | Закрытие всплывающего окна | — |
LocationHandler | suggest | Показ подсказок при вводе города | data, node |
Встроенная аналитика шаблона (цели Яндекс Метрики, электронная коммерция, пиксель VK) сама подписана на события action всех источников. Ваши обработчики работают параллельно с ней.
Примеры
Свой плагин на подгружаемом контенте
Каталог, фильтр и всплывающие окна подгружаются по AJAX. Чтобы ваш код работал и в подгруженных блоках, инициализируйте его в initScripts — внутри переданного блока, а не во всём документе:
EventHandler.register(['MainHandler', 'initScripts'], function (params) {
params.parent.find('[data-my-tooltip]').each(function () {
$(this).attr('title', $(this).data('my-tooltip'));
});
});Своя аналитика по отправке формы
EventHandler.register(['FormHandler', 'form:callback'], function (params) {
// params.data — поля формы, params.result — ответ сервера
if (typeof window.myAnalytics === 'object') {
window.myAnalytics.track('callback_request');
}
});Реакция на добавление в корзину
EventHandler.register(['AjaxHandler', 'action'], function (params) {
if (params.type === 'cart:add') {
console.log('Товар добавлен', params.data, params.res);
}
});Данные и проверка перед своим действием
Обработчик data::<действие> решает, что отправить на сервер. Верните объект вида { 'действие': параметры } — отправится он; верните 'prevent' — действие отменится; ничего не верните — шаблон возьмёт параметры из атрибута data-params.
EventHandler.register(['AjaxHandler', 'data::promo:coupon'], function (params) {
var email = $('#promo-email').val();
if (!email) {
PopupHandler.error('Укажите e-mail');
return 'prevent';
}
return { 'promo:coupon': { email: email } };
});data::cart:add, data::cart:setquantity, data::favorite:trigger, data::compare:trigger, data::compare:clear, data::subscribe:delete и data::cookies:night. Так как учитывается ответ последнего обработчика, ваш обработчик заменит встроенный — и корзина, избранное или счётчики перестанут работать правильно. Для своих проверок используйте свои действия, а на встроенные реагируйте через AjaxHandler | action.Заголовок для всех AJAX-запросов
EventHandler.register(['AjaxHandler', 'ajax::options'], function (params) {
return {
headers: { 'X-Client-Version': '2' }
};
});ajax::options учитывается ответ только последнего обработчика. Подписывайтесь на это событие в одном месте. Демонстрационный обработчик ajax::options с console.log в стандартном custom.js лучше удалить: он пишет в консоль каждый запрос.Своя кнопка с AJAX-действием
Любой элемент с атрибутом data-ajaxaction отправляет действие на сервер по клику, а поле или список — при изменении. Параметры передаются в атрибуте data-params строкой JSON. Ответ на своё действие формируется в PHP-событии onAjaxResult:
<button type="button" class="btn" data-ajaxaction="promo:coupon" data-params='{"code":"SPRING"}'>
Получить купон
</button>Если в ответе есть message, шаблон покажет всплывающее окно — успешное при success: true. Кнопки в подгруженном по AJAX контенте подключаются автоматически.
Полезные объекты шаблона
| Вызов | Что делает |
|---|---|
PopupHandler.success(text, title) | Всплывающее окно с сообщением об успехе. |
PopupHandler.error(text, title) | Всплывающее окно с ошибкой. |
MainHandler.initScripts($block) | Инициализирует скрипты шаблона (слайдеры, формы, кнопки действий) в блоке, который вы вставили на страницу сами. |
EventHandler.fire(['MyHandler', 'event'], params) | Отправляет своё событие — удобно, чтобы связать несколько своих скриптов. |