Created
January 4, 2024 11:46
-
-
Save wanderer20/380342567f952bd83ccabb9838137d84 to your computer and use it in GitHub Desktop.
event-manager.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Класс для менеджера событий (целей) | |
* @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