Skip to main content

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, usa window.Avacy.getData()?.core?.ready (snapshot sincrono) invece di aspettare l'evento.

Eventi disponibili

Event nameFires whendetail shape
avacy:readyCore ready + banner (eventualmente) mountato{}
avacy:consent-savedConsent scritto nello store{ type, timestamp }
avacy:banner-shownBanner first-layer mountato{ layer: 'first' }
avacy:banner-hiddenBanner first-layer unmountato{ reason: 'consent' | 'destroy' }
avacy:cpc-openedCPC (second-layer) aperto{}
avacy:cpc-closedCPC chiuso{}
avacy:language-changedLingua 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 naturalmente
  • reason: 'destroy' — chiamato reload() (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.