Support pour les iframes

Les iframes intégrées sur votre site peuvent utiliser les commandes fournies par la CMP API. Pour cela, elles doivent effectuer des appels à la "frame" parente (ou à une frame ancêtre) sur laquelle la CMP est chargée, en envoyant les commandes sous forme de message grâce à la fonction postMessage().

La frame vers laquelle effectuer l'appel peut être déterminée par l'ancêtre en cherchant la frame enfant .frames["__tcfapiLocator"].

Envoyer une commande

Le message à envoyer doit avoir le format ci-dessous où l'objet __tcfapiCall contient les informations de la commande à exécuter. command et parameter sont identiques aux paramètres passés à la fonction __tcfapi(), et callId est un ID unique à déterminer.

{
	__tcfapiCall: {
		command: *command*, // name of the command to execute
		version: 2, // version of the TCF specification
		parameter: *parameter*, // parameter to be passed to the command function
		callId: *uniqueId* // unique call ID
	}
}

Récupérer le résultat de la commande

Avant d'envoyer des messages, l'iframe doit mettre en place une fonction JavaScript à exécuter lorsqu'un message est renvoyé en retour. Pour cela, elle doit tracer l'évènement message avec la fonction window.addEventListener(). De cette façon, elle récupèrera et pourra traiter le résultat de la commande contenu dans __tcfapiReturn.

La fonction window.addEventListener() est différente de la commande addEventListener, qui est propre à la CMP API.

function processMessage(event) {
	if (event && event.data && event.data.__tcfapiReturn && event.data.__tcfapiReturn.success) {
		console.log(event.data.__tcfapiReturn.returnValue);
	}
}
window.addEventListener('message', processMessage);

Lorsqu'une commande est envoyée, le message renvoyé en retour (event.data) contient l'objet __tcfapiReturn avec le résultat de la commande. returnValue et success sont identiques aux paramètres passés à la callback de la fonction __tcfapi(), et callId correspond à l'ID de l'appel d'origine (__tcfapiCall).

{
    __tcfapiReturn: {
        returnValue: *returnValue*, // result of the command
        success: *boolean*, // true if the call to the command was successful
        callId: *uniqueId* // call ID sent in the __tcfapiCall
    }
}

Vous trouverez ci-dessous un exemple de script qui émule l'API __tcfapi() dans une iframe.

Il localise la trame ancêtre exécutant le CMP, exécute le postMessage et écoute le message de retour et transmet ses valeurs au rappel.

En clair, les scripts de l'iframe fonctionneront comme si la CMP y était chargée directement.

<script>
    !function(){let a=window,c;const o={};for(;a;){try{if(a.frames.__tcfapiLocator){c=a;break}}catch(a){}if(a===window.top)break;a=a.parent}window.__tcfapi=function(a,t,n,e){c?(t={__tcfapiCall:{command:a,parameter:e,version:t,callId:e=Math.random()+""}},o[e]=n,c.postMessage(t,"*")):n({msg:"CMP not found"},!1)},window.addEventListener("message",function(a){let t={};try{t="string"==typeof a.data?JSON.parse(a.data):a.data}catch(a){}var n=t.__tcfapiReturn;n&&"function"==typeof o[n.callId]&&(o[n.callId](n.returnValue,n.success),o[n.callId]=null)},!1)}();
</script>

Dernière mise à jour