Все события уходят в сервис track и имеют общую структуру.
Ниже описано только поле data каждого события и условия, при которых оно возникает.
| Событие | Источник | Включается |
|---|---|---|
session | старт или перезапуск сессии | всегда |
page | rstat4('page') | вызовом |
page_loaded | window.load | всегда |
page_unload | beforeunload | browserEvents.unloadHandlers |
page_visibility | visibilitychange | browserEvents.visibilityHandlers |
activity | счётчик DOM-событий, раз в flushInterval | trackActivity |
scroll | прокрутка остановилась | trackActivity.scrollEvents |
link_click | клик по ссылке | trackClicks |
element_click | клик по любому элементу | trackClicks.allClicks |
form_submit | отправка формы | trackForms |
field_focus, field_blur, field_change, field_invalid | события полей | trackForms |
user_params | синхронизация с GA4 и Яндекс Метрикой | всегда |
rec_start, rec_batch | запись сессии | trackRecord или rstat4('record') |
Отправляется вместо события, которое инициировало старт сессии, а оно уходит следом.
data пустой, вся информация в блоке sess. Подробнее в разделе
Сессии.
{
"name": "session",
"data": {},
"sess": {
"pageNum": 0, "eventNum": 0, "num": 1,
"type": "organic", "engine": "google", "refhost": "google.com",
"marks": {}, "hasMarks": false, "start": 1757960000000
}
}
Библиотека не отправляет page сама, его вызывает сайт. В data попадает всё, что передано в
вызов. К событию добавляется блок perf с таймингами загрузки.
{
"name": "page",
"data": { "type": "category", "id": "2342344", "name": "Товары для дома" },
"perf": { "cs": 0, "ce": 0, "scs": -1, "rqs": 211, "rss": 1549, "rse": 1560, "dl": 1581, "di": 1812, "dc": -1 }
}
Уходит по window.load, data пустой, блок perf заполнен уже полностью.
{ "name": "page_loaded", "data": {}, "perf": { "...": "..." } }
Уходит по beforeunload при переходе на другую страницу или закрытии вкладки, data пустой.
Доставка через sendBeacon, поэтому событие успевает уйти.
{ "name": "page_unload", "data": {} }
Уходит по visibilitychange: пользователь переключил вкладку, свернул браузер или вернулся.
{
"name": "page_visibility",
"data": {
"hidden": 1, // 1 — вкладка скрыта, 0 — видима
"state": "hidden", // document.visibilityState
"dur": 48213 // сколько мс держалось предыдущее состояние
}
}
Счётчик DOM-событий накапливает статистику и раз в flushInterval секунд (по умолчанию 5)
отправляет её на сервер. Если за период действий не было, событие не уходит, но номер итерации
растёт. С zeroEvents: true отправляются и пустые периоды.
{
"name": "activity",
"data": {
"interval": 5, // период, секунд
"iteration": 65, // номер периода с момента загрузки страницы
"active": 4, // номер периода с активностью
"mousemove": 62,
"mousedown": 2,
"mouseup": 2,
"click": 2,
"wheel": 23,
"scroll": 22,
"keydown": 5,
"touchstart": 1
}
}
Считаются события: touchmove, touchstart, touchleave, touchenter, touchend,
touchcancel, click, mouseup, mousedown, mousemove, mousewheel, wheel, scroll,
keypress, keydown, keyup, resize, focus, blur. В data попадают только те, что
произошли за период. Описание событий есть на
developer.mozilla.org.
Уходит, когда прокрутка остановилась. data пустой, позиция в блоке scroll, который
добавляется и ко всем остальным пользовательским событиям.
{ "name": "scroll", "data": {}, "scroll": { "dh": 1148, "ch": 326, "to": 479, "cs": 100, "ms": 100 } }
Ищется ближайший <a> вверх от элемента, на который пришёлся клик. outbound — ссылка ведёт на
другой хост. Элементы с классом trackClicks.ignoreClass (по умолчанию rst-ignore) не отслеживаются.
{
"name": "link_click",
"data": {
"target": {
"tag": "span", // тег самого глубокого элемента под курсором
"type": "",
"name": "",
"ph": "", // placeholder
"cls": "menu-item", // class
"id": "",
"href": "",
"text": "Меню"
},
"href": "https://www.example.com/catalog/#menu",
"text": "Текст ссылки",
"outbound": false
}
}
Только при trackClicks: { allClicks: true }. Клики по ссылкам по-прежнему уходят как
link_click, element_click для них не отправляется.
{
"name": "element_click",
"data": {
"target": {
"tag": "input",
"type": "text",
"name": "city",
"ph": "Введите город прибытия",
"cls": "SearchWidget-input -to",
"id": "",
"href": "",
"text": ""
}
}
}
Четыре события с одинаковым набором параметров:
field_focus — каретка поставлена в поле;field_change — значение поля изменилось;field_blur — каретка покинула поле;field_invalid — поле не прошло браузерную валидацию при отправке формы.Параметры с префиксом e описывают поле, с префиксом f — форму, в которой оно находится.
{
"name": "field_change",
"data": {
"event": "change", // DOM-событие
"etag": "input", // тег элемента
"etype": "text", // атрибут type
"ename": "delivery_address", // атрибут name
"eph": "", // placeholder
"ecl": "form-field", // class
"eid": "", // id
"evalue": "", // значение, см. ниже
"fmthd": "post", // метод формы
"fact": "/checkout/purchase", // action формы
"fname": "order-form", // name формы
"fcls": "", // class формы
"fid": "order-form" // id формы
}
}
Если поле не внутри формы, вместо f* приходит "ferr": "Form element absent".
По умолчанию значения не отправляются, evalue пустой. Варианты:
trackForms: { trackValues: true } — значение уходит открытым текстом в evalue;trackForms: { encryptionKey: '...' } — значение шифруется в браузере публичным RSA-ключом
(WebCrypto RSA-OAEP) и уходит в evalue с eenc: 1. Если шифрование недоступно, значение
отбрасывается и приходит eenc: 0.События полей — одни из самых полезных для поиска проблем в формах: по цепочке
field_focus → field_change → field_invalid видно, где посетитель застрял.
{
"name": "form_submit",
"data": {
"event": "submit",
"fmthd": "post",
"fact": "/cart",
"fname": "cart",
"fcls": "cart-submit",
"fid": "cart-submit"
}
}
Если на странице есть GA4 или Яндекс Метрика, SDK получает их client id и отправляет внутреннее
событие user_params. Идентификаторы сохраняются в хранилище и далее приходят в блоке user
каждого сообщения как ga4ClientId и ymId.
{ "name": "user_params", "data": { "ga4ClientId": "2039255293.1537236640", "ymId": "1537242943246737376" } }
При старте записи уходит rec_start, затем буфер rrweb отправляется батчами rec_batch.
{ "name": "rec_start", "data": { "packed": 1, "masked": 1 } }
{ "name": "rec_batch", "data": { "seq": 3, "part": 1, "of": 2, "p": 1, "d": "[{\"type\":3,..." } }
d — фрагмент JSON-массива упакованных событий rrweb. Массив сериализуется целиком и режется на
части по maxBatchBytes символов. Сервер склеивает d по ключу (uid, lib.st, seq) в порядке
part (of — число частей), разбирает JSON и распаковывает каждое событие (p: 1 — fflate,
p: 0 — сырой JSON).
Запись сессии и identify не создают событий с scroll; остальные события пользователя
получают блок scroll с текущей позицией страницы.