Les scénarios suivants représentent certaines des erreurs les plus courantes observées lors de l'implémentation de GPT. Bien que de telles implémentations puissent sembler fonctionner correctement avec la
de GPT, il n'est pas garanti qu'ils continuent à le faire à l'avenir. Dans
dans les cas les plus extrêmes, ces mises en œuvre peuvent entraîner des interruptions imprévisibles de la diffusion des annonces.
Elles sont considérées comme des implémentations non compatibles.
Chaque scénario inclut une suggestion d'approche pour résoudre le problème affiché.
Notez que cette liste n'est pas exhaustive, mais elle devrait vous aider à identifier les types de problèmes qui peuvent nécessiter une attention particulière.
De plus, selon votre implémentation, vous devrez peut-être rechercher tous les endroits où
ces modifications peuvent être nécessaires sur votre site.
Erreurs fréquentes
Scénario 1: Utiliser des copies non officielles de bibliothèques JavaScript GPT
Description générale du cas d'utilisation |
Hébergement de gpt.js, pubads_impl.js ou de toute bibliothèque qu'ils chargent à partir de vos propres serveurs, ou chargement de ces fichiers à partir d'une source non officielle.
|
Exemple d'extrait de code avec erreur |
// Incorrect: Accessing these files from an unofficial source
<script async src="https://www.example.com/tag/js/gpt.js"></script>
|
Suggestions pour corriger l'erreur |
// Correct: Access these files from a Google domain
<script src="https://securepubads.g.doubleclick.net/tag/js/gpt.js" crossorigin="anonymous" async></script>
// Also correct, if using Limited Ads
<script src="https://pagead2.googlesyndication.com/tag/js/gpt.js" async></script>
|
Scénario 2 : Utilisation des écouteurs de la balise de script gpt.js
Description du cas d'utilisation général |
Supposons que l'API GPT est prête à être appelée lorsque le fichier JavaScript
gpt.js est chargé correctement, car certaines parties de l'API sont fournies par
pubads_impl.js . S'appuyer de quelque manière que ce soit (y compris à des frameworks) sur l'API
à partir des écouteurs d'événements associés au tag de script est donc incorrecte.
|
Exemple d'extrait de code avec erreur |
var tag = document.createElement('script');
tag.type = 'text/javascript';
tag.src = (useSSL ? 'https:' : 'http:') +
'//www.googletagservices.com/tag/js/gpt.js';
// Incorrect: Attaching a callback to the script's onload event.
tag.onload = callback;
var node = document.getElementsByTagName('script')[0];
node.parentNode.insertBefore(tag, node);
|
Suggestions de solutions pour corriger l'erreur |
// Make sure that googletag.cmd exists.
window.googletag = window.googletag || {};
googletag.cmd = googletag.cmd || [];
// Correct: Queueing the callback on the command queue.
googletag.cmd.push(callback);
|
Explication / Description du correctif |
googletag.cmd conserve une liste de commandes qui seront exécutées dès que GPT
est prêt. Il s'agit de la bonne méthode pour vous assurer que votre rappel est exécuté une fois le tag GPT chargé.
|
Scénario 3: Vérifier l'objet googletag pour savoir si GPT est prêt
Description du cas d'utilisation général |
Étant donné que l'API GPT peut ne pas être prête lors du chargement du fichier JavaScript gpt.js
ou lorsque l'objet googletag est défini, en vérifiant s'il est
l'API GPT n'est pas fiable.
|
Exemple d'extrait de code avec erreur |
// Incorrect: Relying on the presence of the googletag object
// as a check for the GPT API.
if (typeof googletag != 'undefined') {
functionProcessingGPT();
}
|
Suggestions de solutions pour corriger l'erreur |
// Correct: Relying on googletag.apiReady as a check for the GPT API.
if (window.googletag && googletag.apiReady) {
functionProcessingGPT();
}
|
Explication/Description de la correction |
GPT renseigne l'indicateur booléen googletag.apiReady dès que l'API est prête à être appelée afin que vous puissiez effectuer des assertions fiables.
|
Scénario 4: utiliser une syntaxe de code obscurci
Description générale du cas d'utilisation |
Si vous vous appuyez sur la syntaxe précise du code de la bibliothèque GPT minifiée, vous rencontrerez presque certainement des erreurs. Veuillez limiter votre utilisation à l'API décrite dans le guide de référence de l'API, car nous modifions continuellement le fonctionnement interne de GPT pour l'améliorer en permanence.
Par exemple, une exigence courante consiste à détecter quand PubAdsService est entièrement chargé pour appeler refresh() .
|
Exemple d'extrait de code avec erreur |
// Incorrect: Relying on an obfuscated property.
if (googletag.pubads().a != null) {
functionProcessingGPT();
}
|
Suggestions de solutions pour corriger l'erreur |
// Correct: Relying on public GPT API methods
// (i.e. googletag.pubadsReady in this case).
if(window.googletag && googletag.pubadsReady) {
functionProcessingGPT();
}
|
Explication / Description du correctif |
Seule l'API publique peut être utilisée. Pour savoir si PubAdsService est entièrement chargé, nous utilisons une valeur booléenne googletag.pubadsReady.
|
Scénario 5 : Écrasement d'une fonction ou d'une variable de GPT
Description du cas d'utilisation général |
Les cas d'utilisation basés sur le remplacement d'une fonction ou d'une variable par les tags GPT peuvent cesser à tout moment
car ce cas d'utilisation n'est pas pris en charge. Les modifications de timing dans les éléments internes de GPT peuvent entraîner ce type de comportement incorrect en cas de panne.
|
Exemple d'extrait de code avec erreur |
// Incorrect: Haphazardly overwriting a googletag.* property.
googletag.cmd = [];
|
Suggestions de solutions pour corriger l'erreur |
// Correct: Never overwrite googletag.* properties if they already exist.
// Always check before assigning to them.
googletag.cmd = googletag.cmd || [];
|
Scénario 6: Ordre incorrect des appels aux tags GPT
Description du cas d'utilisation général |
Les conditions de course peuvent entraîner des pannes à mesure que les composants internes de GPT évoluent. Un ensemble d'instructions mal ordonné qui était fonctionnel en raison de délais d'exécution spécifiques risque de ne plus fonctionner à l'avenir.
|
Exemple d'extrait de code avec erreur |
// Incorrect: Setting page-level key-value targeting after calling
// googletag.enableServices().
googletag.enableServices();
googletag.defineSlot(...);
googletag.pubads().setTargeting(e, a);
|
Suggestions de solutions pour corriger l'erreur |
// Correct: Setting page-level key-value targeting before calling
// googletag.enableServices().
googletag.pubads().setTargeting(e, a);
googletag.defineSlot(...);
googletag.enableServices();
|
Explication / Description du correctif |
Évitez les conditions de concurrence en veillant à respecter le timing habituel des tags GPT. Voici quelques exemples d'ordres partiels valides :
-
Define-Enable-Display
- Définir des paramètres au niveau de la page
- Définir les emplacements
- enableServices()
- Slots d'affichage
-
Activer la définition d'affichage
- Définir les paramètres au niveau de la page
- enableServices()
- Définir les emplacements
- Emplacements d'écran
|
Scénario 7 : Utilisation incorrecte des fermetures et du champ d'application des variables JavaScript
Description générale du cas d'utilisation |
Hypothèses incorrectes concernant le champ d'application des variables JavaScript et la valeur des variables capturées dans la fonction transmise à googletag.cmd.push .
|
Exemple d'extrait de code avec erreur |
// Incorrect: Variable x is declared outside the anonymous function
// but referenced within it.
for (var x = 0; x < slotCount; x++) {
window.googletag.cmd.push(
function(){
// If GPT is not yet loaded, this code will be executed subsequently when
// the command queue is processed. Every queued function will use the last value
// assigned to x (most likely slotCount).
// This is because the function closure captures the reference to x,
// not the current value of x.
window.googletag.display(slot[x]);
})
}
}
|
Suggestions de solutions pour corriger l'erreur |
window.googletag.cmd.push(
function(){
// Correct: We both declare and reference x inside the context of the function.
for (var x = 0; x < slotCount; x++){
window.googletag.display(slot[x]);
}
}
)
|
Explication / Description du correctif |
En JavaScript, les fermetures capturent les variables par référence plutôt que par valeur. Cela signifie
que si une variable est réaffectée, sa nouvelle valeur sera utilisée lorsque la fonction
la fermeture qui l'a capturée est exécutée ultérieurement. Ainsi, le comportement du code dans la fermeture
peut changer selon que le rappel est exécuté immédiatement ou retardé.
Dans le cas d'un tag Google Publisher Tag chargé de manière asynchrone, selon la vitesse à laquelle le tag
les rappels de la file d'attente de commandes
peuvent s'exécuter immédiatement ou non. Lors de
par exemple, le comportement des commandes en file d'attente est modifié.
Pour éviter tout problème, le code doit être écrit sans supposer que les fonctions placées dans la file d'attente de commandes s'exécutent immédiatement. Vous devez également faire attention aux règles de portée de JavaScript.
|
Scénario 8: Déplacer des conteneurs d'emplacements dans le DOM après avoir appelé "display"
Description générale du cas d'utilisation |
Déplacer ou insérer des conteneurs d'emplacements dans le DOM après avoir appelé l'affichage peut entraîner un refoulement indésirable et un comportement imprévisible dans GPT.
|
Exemple d'extrait de code avec erreur |
// Incorrect: Moving slot containers after calling display
googletag.defineSlot("/1234/travel/asia", [728, 90], "div-gpt-ad-123456789-0");
googletag.enableServices();
googletag.display("div-gpt-ad-123456789-0");
...
// Inserting another element before the slot container, pushing the slot container down the page.
document.body.insertBefore(someOtherElement, document.getElementById("div-gpt-ad-123456789-0"));
|
Suggestions pour corriger l'erreur |
// Correct: Make any DOM order changes before calling display
document.body.insertBefore(someOtherElement, document.getElementById("div-gpt-ad-123456789-0"));
...
googletag.defineSlot("/1234/travel/asia", [728, 90], "div-gpt-ad-123456789-0");
googletag.enableServices();
googletag.display("div-gpt-ad-123456789-0");
|
Scénario 9: Remplacer les API de navigateur
Description générale du cas d'utilisation |
L'écrasement (également appelé "monkey patching" ou "polyfilling") des API de navigateur n'est pas compatible avec GPT.
Cette pratique peut endommager les scripts tiers tels que GPT de manière inattendue.
|
Exemple d'extrait de code avec erreur |
// Incorrect: Overwriting window.fetch
const { fetch: originalFetch } = window;
window.fetch = (...args) => {
console.log('Fetching!');
return originalFetch(resource, config);
};
|
Suggestions de solutions pour corriger l'erreur |
// Correct: Avoid making changes to browser APIs.
// If you need custom logic, consider leaving the browser API intact.
const myFetch = (...args) => {
console.log('Fetching!');
return window.fetch(...args);
}
|