Скрипт читает собственный data-id, определяет текущий домен через location.hostname и делает запрос к API конфигурации. Если data-id отсутствует, инициализация прерывается.
cmp.js, замените только src. Механика data-id и доменного запроса остаётся такой же.
Что происходит дальше
cmp.jsполучает конфигурацию баннера.- С CDN загружаются сканер сервисов
trackers.jsи интерфейс баннераbanner.js. - Вызывается
window.SoglasiusBannerInit(cfg)и поднимается объектwindow.SoglasiusCMP.
Пример подключения скрипта
<script src="https://cdn.soglasius.ru/cmp.js" data-id="YOUR_CMP_ID" defer></script>
Модуль активирует отложенные скрипты, заменяя <script type="text/plain"> на обычный executable script, когда категория или сервис получили разрешение.
Категории CMP
Всегда активна. Активация категории вызывается сразу при инициализации.
Включается после согласия пользователя либо сразу, если разрешён запуск до consent.
Работает по той же схеме, что и statistic, и обновляет
readyState.marketing.
Примеры разметки
<script type="text/plain" data-cmp-required="1">
console.log("Всегда доступный код");
</script>
<script type="text/plain" data-cmp-category="statistic">
ym(12345678, "init", { clickmap: true, trackLinks: true });
</script>
<script type="text/plain" data-cmp-service="Yandex.Metrika">
console.log("Код сервиса Yandex.Metrika");
</script> После инициализации модуль создаёт глобальный объект с текущим consent-state, картой готовности категорий и удобными подписками на события.
| Поле / метод | Назначение |
|---|---|
| version | Версия JS-модуля. |
| type | Тип интеграции. В script-версии устанавливается как script. |
| domain | Домен проекта из ответа конфигурации. |
| projectId | ID проекта из конфигурации. |
| consent |
Текущий объект согласия { necessary, statistic, marketing }
|
| readyState |
Готовность категорий и сервисов: necessary, statistic, marketing, services
|
| getConsent() | Возвращает текущее состояние consent. |
| setConsent(status, options) |
Меняет состояние согласия в модуле и генерирует события, если
silent !== true.
|
| onConsentChange(fn) | Подписка на смену consent через callbacks. |
| onCategoryReady(category, fn) | Вызывает fn, когда категория активирована. |
| onServiceReady(service, fn) | Вызывает fn, когда активируется конкретный сервис. |
setConsent() в публичном API меняет только состояние на клиенте и события.
Сохранение cookies и отправка consent на сервер выполняются внутренним
submitConsent() при пользовательском выборе в баннере.
Пример использования
window.SoglasiusCMP.onCategoryReady("statistic", () => {
console.log("Статистические скрипты уже можно запускать");
});
window.SoglasiusCMP.onServiceReady("Yandex.Metrika", () => {
console.log("Сервис Yandex.Metrika активирован");
});
window.SoglasiusCMP.onConsentChange((next, prev) => {
console.log("Consent changed", { prev, next });
});
const consent = window.SoglasiusCMP.getConsent();
console.log(consent.statistic);
onCategoryReady() и onServiceReady()
выполняют callback сразу, без ожидания DOM-событий.
tracker.js создаёт объект window.SoglasiusCookieScanner, который баннер использует для списка сервисов, найденных cookie и отложенных скриптов.
| Метод / поле | Назначение |
|---|---|
| categoryLabels | Названия категорий, используемые сканером. |
| getConfiguredServices() | Возвращает сервисы из services и UF_SERVICES после нормализации и удаления дублей по id. |
| getServices() | Возвращает настроенные и найденные сервисы, включая auto-detect по cookie и отложенным скриптам. |
| getAvailableServices() | Возвращает только сервисы, у которых на странице найдены cookie или связанные скрипты. |
| hasService(id) | Проверяет, есть ли сервис в конфигурации. |
| isServiceAvailable(id) | Проверяет, найден ли сервис на текущей странице. |
| scanCookies() | Возвращает имена cookie, доступные через document.cookie. |
Автообнаружение
Сканер сопоставляет текущие cookie с масками из cookies, ищет
отложенные скрипты script[type="text/plain"][data-cmp-service] и
активные внешние скрипты по script_patterns. Cookie, которые не
попали ни в один настроенный сервис, добавляются как сервисы категории
other.
HttpOnly не попадут в scanCookies() и не могут быть
удалены клиентским скриптом.
Модуль рассылает нативные CustomEvent-события на document. Это удобно для интеграций, которым не нужен прямой вызов методов CMP.
SoglasiusConsentChanged
Содержит detail: { next, prev }. Вызывается при изменении
consent через setConsent() без silent: true.
SoglasiusCategoryEnabled
Содержит detail: { category }. Вызывается после активации
deferred-скриптов категории.
SoglasiusServiceEnabled
Содержит detail: { service }. Вызывается после активации
deferred-скриптов сервиса.
SoglasiusTrackerReady
Содержит detail: { services }. Вызывается из
tracker.js после создания SoglasiusCookieScanner.
Пример использования
document.addEventListener("SoglasiusConsentChanged", (event) => {
console.log(event.detail.next, event.detail.prev);
});
document.addEventListener("SoglasiusCategoryEnabled", (event) => {
console.log("Category enabled:", event.detail.category);
});
document.addEventListener("SoglasiusServiceEnabled", (event) => {
console.log("Service enabled:", event.detail.service);
}); | Cookie | Назначение |
|---|---|
soglasius_consent |
JSON с полями necessary, statistic,
marketing.
|
soglasius_hash |
Hash из ответа sendConsent/, привязанный к серверной записи согласия.
|
soglasius_disabled_services |
JSON-массив идентификаторов сервисов, которые пользователь отключил индивидуально. |
Логика хранения на клиенте
UF_PERIOD = "session" сохраняет consent до конца сессии браузера.
UF_PERIOD = "days" использует UF_STORAGE_TIME как срок жизни cookies.
UF_PERIOD = "always" не сохраняет решение в cookie, поэтому баннер будет переинициализироваться на новых визитах.
Если soglasius_hash оказался строкой "null", модуль очищает cookies и запускает инициализацию заново.
Основная логика баннера полностью управляется ответом getConfig. Ниже поля, которые напрямую влияют на поведение модуля.
| Поле | Как влияет |
|---|---|
UF_ACTIVE |
Включает или полностью выключает инициализацию баннера. |
UF_TRIGGER / UF_TRIGGER_TIMER |
Определяют момент показа: onload, scroll,
click или timer.
|
UF_PERIOD / UF_STORAGE_TIME |
Управляют временем хранения согласия и hash-cookie. |
UF_ALLOW_SCRIPTS_BEFORE_CONSENT |
Если значение "1", statistic и
marketing активируются сразу до выбора пользователя.
|
UF_SHOW_SETTINGS |
Показывает или скрывает иконку повторного открытия настроек. |
UF_URL_MASK |
Позволяет не показывать CMP на определённых путях сайта. |
UF_LAYOUT / UF_POSITION / UF_ANIMATION |
Управляют раскладкой баннера, положением на экране и анимацией появления. |
UF_SERVICES / services |
Список cookie-сервисов для отображения в настройках, сканирования cookie и управления отложенными скриптами по data-cmp-service. |
UF_CONTROL_LEVEL |
Если равно categories, скрывает детализацию сервисов и оставляет управление только категориями. |
UF_FORCE_CONSENT |
Включает принудительный режим: баннер открывается как модальное окно, блокирует прокрутку страницы и делает остальной контент inert до выбора пользователя или закрытия. |
UF_TITLE, UF_DESCRIPTION, UF_POLICY, UF_ACCEPT... |
Тексты интерфейса, кнопок и ссылки на policy. |
UF_BG_COLOR, UF_ACCEPT_BG_COLOR, UF_BORDER_RADIUS... |
Влияют на CSS переменные внутри Shadow DOM и позволяют кастомизировать внешний вид без внешнего CSS. |
Что делать
- Подключайте CMP как можно раньше в документе, чтобы сторонние теги не успевали стартовать до инициализации модуля.
-
Для аналитики и маркетинга используйте
data-cmp-categoryилиdata-cmp-service, а не таймауты. -
Для скриптов конкретного сервиса указывайте одновременно
data-cmp-categoryиdata-cmp-service, если сервис принадлежит к управляемой категории. -
В
cookiesперечисляйте все известные cookie сервиса и используйте маски вроде_ym_*для технических cookie с динамическими именами. -
Подписывайтесь на
onCategoryReady()или DOM-события, если интеграция зависит от момента активации. -
Для обязательных скриптов используйте
data-cmp-required="1".
Что учитывать
- UI баннера живёт в Shadow DOM, поэтому прямые CSS-стили по внешним селекторам не сработают.
-
UF_ALLOW_SCRIPTS_BEFORE_CONSENT = "1"фактически даёт полный consent ещё до выбора пользователя. -
setConsent()сам по себе не сохраняет согласие на сервер и не пишет cookies. - Клиентское удаление cookie работает только для cookie, доступных JavaScript и установленных на домене/path, которые браузер разрешает перезаписать.
- Если вы хотите жёсткую привязку логики к UI, ориентируйтесь на конфиг-поля, а не на внутренние DOM-узлы баннера.