Скрипт читает собственный data-id, определяет текущий домен через location.hostname и делает запрос к API конфигурации. Если data-id отсутствует, инициализация прерывается.
cmp.js, замените только src. Механика data-id и доменного запроса остаётся такой же.
Что происходит дальше
cmp.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-событий.
Модуль рассылает нативные CustomEvent-события на document. Это удобно для интеграций, которым не нужен прямой вызов методов CMP.
SoglasiusConsentChanged
Содержит detail: { next, prev }. Вызывается при изменении
consent через setConsent() без silent: true.
SoglasiusCategoryEnabled
Содержит detail: { category }. Вызывается после активации
deferred-скриптов категории.
SoglasiusServiceEnabled
Содержит detail: { service }. Вызывается после активации
deferred-скриптов сервиса.
Пример использования
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/, привязанный к серверной записи согласия.
|
Логика хранения на клиенте
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_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, а не таймауты. -
Подписывайтесь на
onCategoryReady()или DOM-события, если интеграция зависит от момента активации. -
Для обязательных скриптов используйте
data-cmp-required="1".
Что учитывать
- UI баннера живёт в Shadow DOM, поэтому прямые CSS-стили по внешним селекторам не сработают.
-
UF_ALLOW_SCRIPTS_BEFORE_CONSENT = "1"фактически даёт полный consent ещё до выбора пользователя. -
setConsent()сам по себе не сохраняет согласие на сервер и не пишет cookies. - Если вы хотите жёсткую привязку логики к UI, ориентируйтесь на конфиг-поля, а не на внутренние DOM-узлы баннера.