Häufige Fehler bei der Implementierung vermeiden

In den folgenden Szenarien werden einige der häufigsten Fehler beschrieben, die bei der Implementierung von GPTs auftreten. Solche Implementierungen funktionieren zwar mit der aktuellen GPT-Version einwandfrei zu funktionieren, können jedoch nicht garantieren, dass sie dies auch in Zukunft tun. Im schlimmsten Fall können solche Implementierungen dazu führen, dass die Anzeigenbereitstellung unvorhersehbar unterbrochen wird. Sie gelten als nicht unterstützte Implementierungen.

Jedes Szenario enthält einen Vorschlag zur Behebung des angezeigten Problems.

Diese Liste ist keine vollständige Liste potenzieller Probleme, sondern dient als Hilfe bei der Identifizierung von Problemtypen, die möglicherweise behoben werden müssen.

Je nach Implementierung musst du eventuell prüfen, wo solche Änderungen auf deiner Website erforderlich sind.

Häufige Fehler

Szenario 1: Inoffizielle Kopien der GPT-JavaScript-Bibliotheken verwenden

Allgemeine Beschreibung des Anwendungsfalls gpt.js, pubads_impl.js oder andere Bibliotheken hosten, die von Ihren eigenen Servern geladen werden, oder diese Dateien aus einer inoffiziellen Quelle laden.
Beispiel für ein Code-Snippet mit Fehler
// Incorrect: Accessing these files from an unofficial source
<script async src="https://www.example.com/tag/js/gpt.js"></script>
Vorschläge zur Fehlerbehebung
// Correct: Access these files from a Google domain
<script async src="https://securepubads.g.doubleclick.net/tag/js/gpt.js"></script>
// Also correct, if using Limited Ads
<script async src="https://pagead2.googlesyndication.com/tag/js/gpt.js"></script>

Szenario 2: gpt.js-Skript-Tag-Listener verwenden

Allgemeine Beschreibung des Anwendungsfalls Angenommen, die GPT API kann aufgerufen werden, wenn die JavaScript-Datei gpt.js falsch geladen wird, da einige Teile der API von der Datei pubads_impl.js bereitgestellt werden. Daher ist es falsch, sich in irgendeiner Weise (einschließlich Frameworks) von Ereignis-Listenern aus auf die API zu verlassen, die an das Skript-Tag angehängt sind.
Beispiel für ein Code-Snippet mit Fehler
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);
Vorschläge zur Fehlerbehebung
// 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);
Erläuterung / Beschreibung der Lösung googletag.cmd unterhält eine Liste von Befehlen, die ausgeführt werden, sobald GPT bereit ist. So stellen Sie sicher, dass Ihr Callback ausgeführt wird, wenn das GPT geladen wurde.

Szenario 3: googletag-Objekt überprüfen, um festzustellen, ob GPT bereit ist

Allgemeine Beschreibung des Anwendungsfalls Die GPT API ist möglicherweise nicht bereit, wenn die JavaScript-Datei gpt.js geladen wird oder wenn das googletag-Objekt definiert ist. Daher ist es nicht zuverlässig, mit diesem Objekt zu prüfen, ob die GPT API verfügbar ist.
Beispiel für ein Code-Snippet mit Fehler
// Incorrect: Relying on the presence of the googletag object
// as a check for the GPT API.
if (typeof googletag != 'undefined') {
 functionProcessingGPT();
}
Vorschläge zur Fehlerbehebung
// Correct: Relying on googletag.apiReady as a check for the GPT API.
if (window.googletag && googletag.apiReady) {
 functionProcessingGPT();
}
Erläuterung / Beschreibung der Lösung Von GPT wird das boolesche Flag googletag.apiReady eingefügt, sobald die API aufgerufen werden kann, sodass Sie zuverlässige Assertions erstellen können.

Szenario 4: Verschleierte Codesyntax verwenden

Allgemeine Beschreibung des Anwendungsfalls Wenn Sie sich auf die genaue Syntax des reduzierten GPT-Bibliothekscodes verlassen, werden höchstwahrscheinlich Fehler auftreten. Verwenden Sie bitte nur die API, die im API-Referenzhandbuch dokumentiert ist. Wir ändern die Funktionsweise von GPT ständig, um sie kontinuierlich zu verbessern.
Eine gängige Anforderung besteht beispielsweise darin, zu ermitteln, wann PubAdsService vollständig geladen ist, um refresh() aufzurufen.
Beispiel für ein Code-Snippet mit Fehler
// Incorrect: Relying on an obfuscated property.
if (googletag.pubads().a != null) {
 functionProcessingGPT();
}
Vorschläge zur Fehlerbehebung
// Correct: Relying on public GPT API methods
// (i.e. googletag.pubadsReady in this case).
if(window.googletag && googletag.pubadsReady) {
 functionProcessingGPT();
}
Erläuterung / Beschreibung der Lösung Nur die öffentliche API kann als zuverlässiger Dienst genutzt werden. Um festzustellen, ob PubAdsService vollständig geladen ist, verwenden wir den booleschen Wert googletag.pubadsReady.

Szenario 5: Überschreiben einer Funktion oder Variable von GPT

Allgemeine Beschreibung des Anwendungsfalls Anwendungsfälle, die auf dem Überschreiben einer von GPT verwendeten Funktionen oder Variablen basieren, können jederzeit fehlerhaft sein, da dies kein unterstützter Anwendungsfall ist. Durch Änderungen am Timing in den internen GPTs kann dieses fehlerhaftes Verhalten bei Ausfällen hervorgerufen werden.
Beispiel für ein Code-Snippet mit Fehler
// Incorrect: Haphazardly overwriting a googletag.* property.
googletag.cmd = [];
Vorschläge zur Fehlerbehebung
// Correct: Never overwrite googletag.* properties if they already exist.
// Always check before assigning to them.
googletag.cmd = googletag.cmd || [];

Szenario 6: Falsche Reihenfolge der GPT-Aufrufe

Allgemeine Beschreibung des Anwendungsfalls Wenn sich die internen Strukturen von GPTs weiterentwickeln, können Race-Bedingungen zu Fehlern führen. Ein falsch geordneter Satz von Anweisungen, die aufgrund bestimmter Zeiten in der Ausführung funktionsfähig waren, bleiben in Zukunft möglicherweise nicht mehr funktionsfähig.
Beispiel für ein Code-Snippet mit Fehler
// Incorrect: Setting page-level key-value targeting after calling
// googletag.enableServices().
googletag.enableServices();
googletag.defineSlot(...);
googletag.pubads().setTargeting(e, a);
Vorschläge zur Fehlerbehebung
// Correct: Setting page-level key-value targeting before calling
// googletag.enableServices().
googletag.pubads().setTargeting(e, a);
googletag.defineSlot(...);
googletag.enableServices();
Erläuterung / Beschreibung der Lösung Vermeiden Sie Race-Bedingungen, indem Sie das übliche Timing von GPTs einhalten. Beispiele für gültige Teilanordnungen sind:
  • Define-Enable-Display
    1. Einstellungen auf Seitenebene festlegen
    2. Slots definieren
    3. enableServices()
    4. Anzeigeflächen
  • Display-Definition aktivieren
    1. Einstellungen auf Seitenebene festlegen
    2. enableServices()
    3. Slots definieren
    4. Anzeigeflächen

Szenario 7: Falsche Verwendung von Schließungen und der Umfangsbestimmung von JavaScript-Variablen

Allgemeine Beschreibung des Anwendungsfalls Falsche Annahmen in Bezug auf den Umfang von JavaScript-Variablen und den Wert von Variablen, die in der an googletag.cmd.push übergebenen Funktion erfasst wurden.
Beispiel für ein Code-Snippet mit Fehler
// 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]);
  })
 }
}
Vorschläge zur Fehlerbehebung
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]);
  }
 }
)
Erläuterung / Beschreibung der Lösung

In JavaScript werden Variablen anhand von Verweisen und nicht nach Wert erfasst. Wenn also eine Variable neu zugewiesen wird, wird ihr neuer Wert verwendet, wenn der Funktionsabschluss, der sie erfasst hat, später ausgeführt wird. Daher kann sich das Verhalten des Codes im Closure ändern, je nachdem, ob der Callback sofort oder verzögert ausgeführt wird.

Im Fall eines asynchron geladenen GPT können die Callbacks, je nachdem, wie schnell GPT in der Befehlswarteschlange geladen wird, sofort ausgeführt werden oder nicht. Im obigen Beispiel ändert sich dadurch das Verhalten der in die Warteschlange gestellten Befehle.

Um Probleme zu vermeiden, sollte Code so geschrieben werden, dass nicht davon ausgegangen wird, dass Funktionen in der Befehlswarteschlange sofort ausgeführt werden. Die Bereichsregeln von JavaScript sollten außerdem mit Vorsicht behandelt werden.

Szenario 8: Slot-Container innerhalb des DOMs nach dem Aufrufen von „display“ verschieben

Allgemeine Beschreibung des Anwendungsfalls Das Verschieben oder Einfügen von Slot-Containern in das DOM, nachdem die Display-Anzeige aufgerufen wurde, kann zu unerwünschtem Reflow und unvorhersehbarem Verhalten in GPT führen.
Beispiel für ein Code-Snippet mit Fehler
// 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"));
Vorschläge zur Fehlerbehebung
// 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");