Опубликовано: 12 июл 2021
Вы наверняка неоднократно видели и сами пользовались на различных сайтах тем, что называется "мега меню" - главное меню сайта с рядом подразделов и кучей ссылок внутри каждого раздела. Это могут быть разные категории товаров, подразделы контента, навигация внутри личного кабинета, разные дополнительные ссылки, такие как помощь, документация и т. п.
Насколько эффективно работает ваше меню? Ответ на этот вопрос может заключать в себе ряд исследований, которые должны прояснить, например, такие типичные подвопросы:
Посмотрев на эти вопросы, мы уже видим, что правильный сбор данных будет играть ключевую роль, и что это достаточно нетривиальная задача. По каждому событию клика нам нужно будет собирать не только текст ссылки, но и как минимум положение (порядок) ссылки внутри подменю, возможно заголовок этого подменю и название активного пункта верхней строчки меню. Отслеживание порядкового номера расположения ссылки нам пригодится, если мы решим поэксперементировать с этим порядком.
Если вам это кажется сложным, и вы ищите простое решение, то вполне можно воспользоваться визуальными инструментами, которые предлагают различные вендоры аналитических решений. Например, Яндекс Метрика имеет такие инструменты, как Карта Ссылок и Карта Кликов. Недостаток их заключается в том, что вы не можете выгрузить эти данные и автоматизировать аналитику или провести более детальные исследования, например, с применением a/b тестов.
Использование Google Tag Manager для отслеживания подобных событий имеет хорошо известные плюсы и минусы — его можно достаточно быстро реализовать и собрать необходимые данные, но устойчивость решения будет ограничена в том плане, что если разработчики что-то изменят в меню без вашего ведома, то оно может перестать работать.
Триггер для отслеживания клика по верхнему уровню меню может выглядеть так:
Trigger Type: Click - All Elements
Fires on: Click Element matches CSS selector div[data-qa="MainMenu"] span
В данном случае для примера мы предположили, что верхний уровень главного меню находится в DIV с атрибутом data-qa="MainMenu"
и каждый подпунт - это элемент span
.
Названия пункта меню мы можем передавать с помощью встроенной в GTM переменной Click Text
или же, если в пункте меню помимо текста также имеются иконки на которые пользователь может кликать, то с помощью кастомной переменной, возвращающей текст общего элемента span:
function() {
return {{Click Element}}.closest('span').textContent;
}
Триггер для отслеживания клика по ссылке внутреннего экрана меню может выглядеть так:
Trigger Type: Click - All Elements
Fires on: Click Element matches CSS selector div[data-qa="DesktopMenu"] div[data-qa="LinksBlock"] a, div[data-qa="DesktopMenu"] div[data-qa="LinksBlock"] a *, aside div[data-qa="LinksBlock"] a, aside div[data-qa="LinksBlock"] a *
Здесь для примера мы отслеживаем четыре типа кликов:
aside
)Естественно ваш код для параметра CSS selector
может заметно отличаться, поскольку он зависит от структуры меню внутри DOM.
Заголовок раздела подменю, названия активного верхнеуровнего меню и другие вспомогательные данные для данного события можно собирать с помощью таких javascript функций, как closest, parentNode, firstChild и т. п.
Так например, javascript переменная, передающая заголовок раздела подменю может выглядеть так:
function() {
return {{Click Element}}.closest('div[data-qa="LinksBlock"]').parentNode.firstChild.innerText.trim();
}
Для отслеживания положения пункта меню, нам нужно получить значение индекса данного элемента внутри его родительского элемента. Как это можно сделать подробно разобрано, к примеру, на stackoverflow. К сожалению на момент написания статьи GTM по прежнему не полностью поддерживает ECMASCRIPT_2015, и мы не можем использовать наиболее изящное решение
function() {
return [...{{Click Element}}.parentElement.children].indexOf({{Click Element}});
}
которое выдаст соответствующую ошибку.
Вместо этого мы можем создать отдельную javascript переменную-функцию getElementIndex
, которая будет возвращать индекс:
function() {
return function(node) {
var index = 0;
while ( (node = node.previousElementSibling) ) {
index++;
}
return index;
}
}
и использовать ее для получения порядкового номера элемента в другой javscript переменной, например так:
function() {
return {{getElementIndex}}({{Click Element}})+1;
}
Поскольку главное меню выглядит и используется по разному на декстопных мониторах и мобильных устройствах, вам может быть интересно сравнить данные кликов в разрезе мобильных и десктопных пользователей. Опциональный, но в тоже время интересный момент — если ваше меню оборачивается в различные контейнеры DIV для мобильной и десктопной версии, мы можем передавать переменную, которая будет индикатором того, использовалось ли меню в мобильной или десктопной версии. Для этого необходимо просто отслеживать какой DIV-контейнер был активным.
Например javascript переменная JSV MainMenu isDesktop
может выглядеть таким образом:
function() {
return Boolean({{Click Element}}.closest('div[data-qa="DesktopMenu"]'));
}
Затем мы можем преобразовать True
и False
в соответствующие значения desktopMenu
, mobileMenu
с помощью опции Format Value для данной переменой:
При этом необходимо убедиться, что в мобильной версии соответствующие функции поиска десктопного меню будут возвращать null
, например:
document.querySelector('aside div').closest('div[data-qa="DesktopMenu"]')
>> null
Теперь, когда у вас есть все данные в виде цифр, вы можете проводить любой сравнительный анализ и строить графики как в виде таблиц, так и на временных интервалах.
Дополнительно можно отслеживать аномальные изменения в данных по кликам, и при необходимости создать алерты для таких изменений.
Добавив к этому визуальную аналитику с помощью инструментов типа Вебвизор и Карта ссылок, вы будете иметь полное представление о том, как пользователи взаимодействуют с вашим главным меню.