Events
Il CMP emette eventi del DOM sul document (CustomEvent). Compatibili con qualunque tag manager, script analytics, RUM tool, bridge nativo.
document.addEventListener('avacy:consent-saved', (e) => {
console.log(e.detail);
});
Niente import necessari, niente ready-pattern: gli eventi continuativi (
avacy:consent-saved,avacy:cpc-*,avacy:language-changed,avacy:banner-hidden) sono fired on demand, quindi un listener registrato in qualunque momento riceve quelli successivi.⚠️ Gli eventi one-shot di boot (
avacy:ready,avacy:banner-shown { layer: 'first' }) vengono fired una volta al termine dell'init. Un listener registrato dopo quel momento li perde. Se devi reagire a "il CMP è pronto" tardi nel flow, usawindow.Avacy.getData()?.core?.ready(snapshot sincrono) invece di aspettare l'evento.
Eventi disponibili
| Event name | Fires when | detail shape |
|---|---|---|
avacy:ready | Core ready + banner (eventualmente) mountato | {} |
avacy:consent-saved | Consent scritto nello store | { type, timestamp } |
avacy:banner-shown | Banner first-layer mountato | { layer: 'first' } |
avacy:banner-hidden | Banner first-layer unmountato | { reason: 'consent' | 'destroy' } |
avacy:cpc-opened | CPC (second-layer) aperto | {} |
avacy:cpc-closed | CPC chiuso | {} |
avacy:language-changed | Lingua attiva cambiata | { lang, prev } |
avacy:ready
detail: {}
Emesso una volta, dopo che l'init del CMP ha completato e l'UI è (eventualmente) mountata. Rie-emesso dopo ogni reload().
document.addEventListener('avacy:ready', () => {
console.log('CMP ready', window.Avacy.version);
});
avacy:consent-saved
detail: {
type: 'AcceptAll' | 'RejectAll' | 'CloseBanner' | 'Personalized';
timestamp: number; // ms epoch
}
Emesso ogni volta che un consenso viene scritto nello store (banner click, CPC save, acceptAll/rejectAll/triggerConsent API).
document.addEventListener('avacy:consent-saved', (e) => {
console.log('user saved:', e.detail.type, 'at', new Date(e.detail.timestamp));
// Per accedere alle choices dettagliate:
const consent = window.Avacy.getConsent();
console.log(consent.choices);
});
💡 Detail volutamente minimale (plain JSON). Per il dettaglio delle scelte, chiama
getConsent()dentro il handler.
avacy:banner-shown
detail: { layer: 'first' }
Emesso quando l'avacy-banner (first-layer) viene mountato. Tipicamente: al boot (se nessun consenso valido) e dopo reload().
document.addEventListener('avacy:banner-shown', () => {
pushToDataLayer({ event: 'cmp_shown' });
});
avacy:banner-hidden
detail: { reason: 'consent' | 'destroy' }
Emesso quando l'avacy-banner viene unmountato.
reason: 'consent'— utente ha scelto, il banner sparisce naturalmentereason: 'destroy'— chiamatoreload()(destroy + remount imminente)
document.addEventListener('avacy:banner-hidden', (e) => {
if (e.detail.reason === 'consent') pushToDataLayer({ event: 'cmp_dismissed' });
});
avacy:cpc-opened
detail: {}
Emesso quando il Consent Preference Center (second-layer) viene aperto, indipendentemente dal call site (click banner, click shield, chiamata API).
document.addEventListener('avacy:cpc-opened', () => {
pushToDataLayer({ event: 'cmp_cpc_open' });
});
avacy:cpc-closed
detail: {}
Speculare a cpc-opened: emesso alla chiusura del CPC.
avacy:language-changed
detail: { lang: string; prev: string }
Emesso dopo che la lingua attiva è cambiata (autoLanguage detection o changeLanguage(lang) API).
document.addEventListener('avacy:language-changed', (e) => {
console.log(`lang ${e.detail.prev} → ${e.detail.lang}`);
});
Pattern d'uso comuni
Inviare consenso a GA4 / GTM
document.addEventListener('avacy:consent-saved', (e) => {
if (typeof gtag !== 'function') return;
const c = window.Avacy.getConsent();
if (!c.ready || !c.valid) return;
const p = c.purposes.tcf ?? {};
gtag('consent', 'update', {
ad_storage: p[1] ? 'granted' : 'denied',
analytics_storage: p[2] ? 'granted' : 'denied',
personalization_storage: p[3] ? 'granted' : 'denied',
ad_user_data: p[1] ? 'granted' : 'denied',
ad_personalization: p[3] ? 'granted' : 'denied',
});
});
Bridge per WebView nativa
document.addEventListener('avacy:consent-saved', (e) => {
if (window.Android) {
window.Android.sendConsent(JSON.stringify(e.detail));
} else if (window.webkit?.messageHandlers?.CMPWebInterface) {
window.webkit.messageHandlers.CMPWebInterface.postMessage({
command: 'consent',
values: JSON.stringify(e.detail),
});
}
});
💡 Per casi enterprise come questo, considera invece un build variant con uno storage provider custom — vedi Tier 2 advanced.