Skip to content

Instantly share code, notes, and snippets.

@wanderer20
Created January 4, 2024 11:46
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wanderer20/380342567f952bd83ccabb9838137d84 to your computer and use it in GitHub Desktop.
Save wanderer20/380342567f952bd83ccabb9838137d84 to your computer and use it in GitHub Desktop.
event-manager.js
/**
* Класс для менеджера событий (целей)
* @constructor
*/
function EventManager() {
this.init();
this.initEvents();
}
/**
* Инициализация
*/
EventManager.prototype.init = function () {
window['dataLayer'] = window['dataLayer'] || [];
this.modalFormAreasLastCall = [];
this.yandexCounter = 6255490;
}
/**
* Инициализация событий
*/
EventManager.prototype.initEvents = function () {
var self = this;
$(document).on('mouseleave', function (e) {
if (typeof window.mediator !== 'undefined') {
window.mediator.publish('onWindowMouseLeave', e);
}
});
BX.ready(function () {
// Хардкод для настройки аспро
arAllcorp3Options['THEME']['USE_FORMS_GOALS'] = 'Y';
});
// Обработка аспровских целей или кастомных для аспро
BX.addCustomEvent('onCounterGoals', function (data) {
if (typeof data === "object" && typeof data['goal'] !== "undefined") {
// Если сработала цель на добавление в корзину
if (data['goal'] === 'goal_basket_add') {
self.push(
'event_add_to_cart_card',
'В корзину (карточка)',
'Использование',
'Карточки товара',
'MYVCARTKART'
);
}
// Обработка открытия формы
if (data['goal'].indexOf('goal_modal_webform_open') !== -1) {
var formId = parseInt(data['goal']
.replace(/goal_modal_webform_open/g, '')
.replace(/_/g, ''));
if (typeof window.project !== 'undefined') {
var forms = window.project.getFormsData();
if (!isNaN(formId) && typeof forms[formId] !== 'undefined') {
switch (forms[formId]['code']) {
case 'aspro_allcorp3_callback_s1':
if (typeof self.modalFormAreasLastCall[formId] !== "undefined" &&
self.modalFormAreasLastCall[formId]['area'] !== ''
) {
switch (self.modalFormAreasLastCall[formId]['area']) {
case 'header':
// Открытие формы "Заказать звонок" в шапке
self.push(
'event_header_callback',
'Ссылка',
'Заказать звонок',
'Шапка сайта',
'SSHAPZVON'
);
break;
case 'right_sidebar':
// Открытие формы "Заказать звонок" из сайдбара
self.push(
'event_forms_side_block',
'Сайт',
'Клик',
'Сайдбар с формами',
'SIDEFORMS'
);
break;
}
}
break;
case 'aspro_allcorp3_question_s1':
if (typeof self.modalFormAreasLastCall[formId] !== "undefined" &&
self.modalFormAreasLastCall[formId]['area'] !== ''
) {
switch (self.modalFormAreasLastCall[formId]['area']) {
case 'header':
// Открытие формы "Задать вопрос"/"Подать заявку" в шапке
self.push(
'event_header_get_in_order',
'Ссылка',
'Подать заявку',
'Шапка сайта',
'SSHAPNAPIS'
);
break;
case 'right_sidebar':
// Открытие формы "Задать вопрос"/"Подать заявку" из сайдбара
self.push(
'event_forms_side_block',
'Сайт',
'Клик',
'Сайдбар с формами',
'SIDEFORMS'
);
break;
}
}
break;
case 'aspro_allcorp3_feedback_s1':
if (typeof self.modalFormAreasLastCall[formId] !== "undefined" &&
self.modalFormAreasLastCall[formId]['area'] !== ''
) {
switch (self.modalFormAreasLastCall[formId]['area']) {
case 'right_sidebar':
// Открытие формы "Оставить отзыв" из сайдбара
self.push(
'event_forms_side_block',
'Сайт',
'Клик',
'Сайдбар с формами',
'SIDEFORMS'
);
break;
}
}
break;
case 'aspro_allcorp3_question_on_exit':
self.push(
'exit_banner_click',
'Форма',
'Клик',
'Сквозное',
'EXITBANNER'
);
break;
}
}
}
}
// Обработка успешной отправки формы
if (data['goal'].indexOf('goal_webform_success') !== -1) {
var formId = parseInt(data['goal']
.replace(/goal_webform_success/g, '')
.replace(/_/g, ''));
if (typeof window.project !== 'undefined') {
var forms = window.project.getFormsData();
if (!isNaN(formId) && typeof forms[formId] !== 'undefined') {
switch (forms[formId]['code']) {
case 'aspro_allcorp3_question_s1':
// Обработка результата формы "Задать вопрос"/"Подать заявку"
if (typeof self.modalFormAreasLastCall[formId] !== "undefined" &&
self.modalFormAreasLastCall[formId]['area'] !== ''
) {
switch (self.modalFormAreasLastCall[formId]['area']) {
case 'header':
// Обработка результата формы "Задать вопрос"/"Подать заявку" из шапки
self.push(
'event_header_form_send_message',
'Форма',
'Подать заявку',
'Шапка сайта',
'SSHAPNAPISSUCCESS'
);
break;
case 'product_detail_buy_block':
// Обработка результата формы "Задать вопрос" на карточке товара
self.push(
'event_card_ask_question',
'Задать вопрос (карточка)',
'Использование',
'Карточки товара',
'MYZADATVOPRKART'
);
break;
case 'contact_sticky_panel':
// Обработка результата формы "Задать вопрос" на странице контакты
self.push(
'event_contacts_write_to_us',
'Написать нам (контакты)',
'Использование',
'Контактов',
'NAPISATNAMCONTACTS'
);
break;
}
}
break;
case 'aspro_allcorp3_garant_sale_s1':
// Обработка результата формы "Гарантия лучшей цены"
self.push(
'event_card_get_in_offer',
'Форма Гарантия лучшей цены (карточка)',
'Использование',
'Карточки товара',
'POLUCHITPREDLKART'
);
break;
case 'aspro_allcorp3_cashback_s1':
// Обработка результата формы "Запрос на консультацию по компенсации"
self.push(
'event_cashback',
'Форма Запрос на консультацию по компенсации',
'Использование',
'Форма',
'cashback-form'
);
break;
case 'aspro_allcorp3_callback_s1':
// Обработка результата формы "Заказать звонок"
if (typeof self.modalFormAreasLastCall[formId] !== "undefined" &&
self.modalFormAreasLastCall[formId]['area'] !== ''
) {
switch (self.modalFormAreasLastCall[formId]['area']) {
case 'header':
// Обработка результата формы "Заказать звонок" из шапки
self.push(
'event_form_callback_success',
'Форма',
'Заказать звонок',
'Шапка сайта',
'FSHAPZVON'
);
break;
}
}
break;
}
}
}
}
}
})
// Обработка изменения сравнения
BX.addCustomEvent('OnCompareChange', function (result) {
if (typeof result['data']['action'] !== 'undefined') {
var action = result['data']['action'];
// Добавление в сравнение
if (action === 'ADD_TO_COMPARE_LIST') {
self.push(
'event_add_to_compare',
'Добавить к сравнению (карточка)',
'Использование',
'Карточки товара',
'MYDOBKSRAVKART'
);
}
}
});
// Клик по табам
$(document).on('click', '[data-toggle="tab"]', function (e) {
var $btnTab = $(e.currentTarget);
var href = $btnTab.attr('href');
if (typeof href !== 'undefined') {
switch (href) {
case '#calc':
// Клик по табу "Лизинг"
self.push(
'event_card_tab_lising_click',
'Взаимодействие с элементами владки лизинга (карточка)',
'Использование',
'Карточки товара',
'INTERACTLIZING'
);
break;
case '#delivery':
// Клик по табу Доставка
self.push(
'event_card_tab_delivery_click',
'Доставка-tabs (карточка)',
'Использование',
'Карточки товара',
'TABSDOSTAVKART'
);
break;
case '#char':
// Клик по табу Характеристики
self.push(
'event_card_tab_characteristics',
'Характеристики-tabs (карточка)',
'Использование',
'Карточки товара',
'TABSXARAKTKART'
);
break;
case '#reference':
// Клик по табу Референс
self.push(
'event_card_tab_reference',
'Референс-tabs (карточка)',
'Использование',
'Карточки товара',
'REFERENCECLICK'
);
break;
}
}
})
// Клик по номера телефонов и email
$(document).on('click', 'a[href^="tel:"], a[href^="mailto:"]', function (e) {
var $link = $(e.currentTarget);
var isFooter = $link.closest('footer').length > 0;
var isHeader = $link.closest('header').length > 0;
if (isHeader) {
// Клик по телефонам и емейл в шапке
self.push(
'event_header_phone_email_click',
'Клик по телефонам и email',
'Клик',
'Шапка сайта',
'KSHAPCONTACTS'
);
}
if (isFooter) {
// Клик по телефонам и емейл в подвале
self.push(
'event_footer_contacts_click',
'Клик по телефонам и email',
'Клик',
'Подвал сайта',
'PODVALCONTACTS'
);
}
});
// Взаимодействие с любым элементом меню
$(document).on('click', 'a.header-menu__link', function (e) {
self.push(
'event_header_menu_links',
'Ссылка элемент меню',
'Меню',
'Шапка сайта',
'INTERACTMENUSHAP'
);
});
// Клик по кнопке подробнее
$(document).on('click', '.more-char-link', function (e) {
var $moreLink = $(e.currentTarget);
// В карточке товара
if ($moreLink.closest('.catalog-detail__previewtext').length > 0) {
self.push(
'event_card_learn_more',
'Узнать подробнее (карточка)',
'Использование',
'Карточки товара',
'MYYZNPODROBKART'
);
}
});
// Клик по корзине в шапке
$(document).on('click', 'header a[href="/cart/"]', function (e) {
self.push(
'event_header_to_cart',
'Ссылка',
'Перейти в корзину',
'Шапка сайта',
'SSHAPKORZ'
);
});
// Клик по переключателю поиска в шапке сайта
$(document).on('click', '[data-ajax-load-block="HEADER_TOGGLE_SEARCH"]', function (e) {
});
// Успешное взаимодействие с поиском (отправка)
$(document).on('submit', 'form.search', function (e) {
self.push(
'event_header_search_interactions',
'Форма',
'Поиск товара',
'Шапка сайта',
'FSHAPPOISK'
);
});
// Клики по кнопкам, вызывающие модальные окна с формами
// TODO: проблема с повторным открытием формы (не срабатывает, берется старая область - это ошибка)
$(document).on('click', '[data-event="jqm"][data-param-id]', function (e) {
var $modalBtn = $(e.currentTarget);
var formId = $modalBtn.attr('data-param-id');
var formName = $modalBtn.attr('data-name');
var area = '';
// Заносим область
// Если это блок купить из карточки товара
if ($modalBtn.closest('.catalog-detail__buy-block').length > 0) {
area = 'product_detail_buy_block';
}
// Если это правый сайдбар
if ($modalBtn.closest('.right-sidebar-wrapper').length > 0) {
area = 'right_sidebar';
}
// Если это шапка
if ($modalBtn.closest('header').length > 0) {
area = 'header';
}
if ($modalBtn.closest('.contacts__sticky-panel').length > 0) {
area = 'contact_sticky_panel'
}
// Сброс для этой формы значений
self.modalFormAreasLastCall[formId] = {};
// Заносим откуда была вызвана форма в пул
var lastCall = {
'form_id' : formId,
'form_name' : formName,
'area' : area,
};
self.modalFormAreasLastCall[formId] = lastCall;
BX.onCustomEvent('onFormModalCallButtonClick', lastCall);
})
// Клики по кнопкам вызова модальных окон с формой из блока с калькулятором лизинга
$(document).on('click', '.mainDisconts__wrap [data-event="jqm"]', function (e) {
BX.onCustomEvent('onInteractiveLeasingCalc');
});
// Взаимодействие с любым элементом с калькулятором лизинга
BX.addCustomEvent('onInteractiveLeasingCalc', function () {
self.push(
'event_card_lising_interactions',
'Лизинг (карточка)',
'Использование',
'Карточки товара',
'MYLIZINGKART'
);
});
$(document).on('click', '[data-yandex-metrica-event-click]', function (e) {
var $element = $(e.currentTarget);
var event = $element.attr('data-yandex-metrica-event-click');
if (event) {
self.yandexMetricaPushEvent(event);
}
});
}
/**
* Кастомный пуш в dataLayer
*
* @param event
* @param eventCategory
* @param eventAction
* @param eventLabel
* @param yandexPurpose
*/
EventManager.prototype.push = function (event, eventCategory, eventAction, eventLabel, yandexPurpose) {
window['dataLayer'].push({
'event' : event,
'eC' : eventCategory,
'eA' : eventAction,
'eL' : eventLabel,
'ym' : yandexPurpose
})
if (yandexPurpose) {
this.yandexMetricaPushEvent(yandexPurpose);
}
}
EventManager.prototype.yandexMetricaPushEvent = function (event) {
ym(this.yandexCounter, 'reachGoal', event);
}
window.eventManager = new EventManager();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment