Die folgenden Szenarien stellen einige der häufigsten Fehler dar, die bei der Implementierung von GPT auftreten. Auch wenn solche Implementierungen mit der aktuellen Version der GPTs offenbar funktionieren, kann nicht garantiert werden, dass sie auch weiterhin funktionieren. Im Extremfall können diese Implementierungen dazu führen, dass die Anzeigenbereitstellung auf unvorhersehbare Weise unterbrochen wird.
Sie gelten als nicht unterstützte Implementierungen.
Jedes Szenario enthält einen vorgeschlagenen Ansatz zur Behebung des dargestellten Problems.
Beachten Sie, dass diese Liste keine vollständige Liste potenzieller Probleme darstellt.
soll aber als Orientierungshilfe bei der Identifizierung der Probleme dienen,
berücksichtigt werden muss.
Abhängig von Ihrer Implementierung müssen Sie unter Umständen
für Ihre Website erforderlich sein können.
Häufige Fehler
Szenario 1: Verwendung inoffizieller Kopien von GPT-JavaScript-Bibliotheken
Allgemeine Beschreibung des Anwendungsfalls |
Sie hosten gpt.js, pubads_impl.js oder Bibliotheken, die sie von Ihren eigenen Servern laden, oder
und laden diese Dateien
aus einer inoffiziellen Quelle.
|
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 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>
|
Szenario 2: Auf gpt.js-Script-Tag-Listener vertrauen
Allgemeine Beschreibung des Anwendungsfalls |
Die Annahme, dass die GPT API bereit zum Aufrufen ist, wenn die JavaScript-Datei gpt.js geladen wird, ist falsch, da einige Teile der API von der Datei pubads_impl.js bereitgestellt werden. Es ist daher nicht zulässig, die API in irgendeiner Weise (einschließlich Frameworks) über Ereignis-Listener zu verwenden, die an das Script-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 Korrektur |
googletag.cmd verwaltet eine Liste von Befehlen, die ausgeführt werden, sobald GPT ausgeführt wird.
ist bereit. Dies ist die korrekte Methode, um sicherzustellen, dass Ihr Callback ausgeführt wird, nachdem GPT geladen wurde.
|
Szenario 3: Über das googletag-Objekt prüfen, ob GPT bereit ist
Allgemeine Beschreibung des Anwendungsfalls |
Da die GPT API möglicherweise nicht bereit ist, wenn die JavaScript-Datei gpt.js geladen oder das googletag -Objekt definiert wird, ist es nicht zuverlässig, dieses Objekt zu prüfen, um festzustellen, 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 Fehlerbehebung |
GPT füllt das boolesche Flag aus
googletag.apiReady aktualisieren, sobald
kann die API aufgerufen werden,
damit Sie zuverlässige Assertions erstellen können.
|
Szenario 4: Verschlüsselte Codesyntax verwenden
Allgemeine Beschreibung des Anwendungsfalls |
Wenn Sie auf die genaue Syntax des minimierten GPT-Bibliothekscodes angewiesen sind, kommt es fast mit Sicherheit zu Fehlern. Bitte beschränken Sie die Nutzung auf die API, die im API-Referenzhandbuch dokumentiert ist. Wir ändern das Innere von GPT ständig, um es weiter zu verbessern.
Eine gängige Anforderung besteht z. B. darin zu erkennen,
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 Korrektur |
Es kann nur die öffentliche API verwendet werden. Wenn Sie herausfinden möchten, ob PubAdsService
vollständig geladen, haben wir einen booleschen Wert
googletag.pubadsReady ist nicht zulässig.
|
Szenario 5: Überschreiben einer Funktion oder Variablen von GPT
Allgemeine Beschreibung des Anwendungsfalls |
Anwendungsfälle, die auf dem Überschreiben einer von GPT verwendeten Funktion oder Variablen basieren, können jederzeit fehlschlagen, da dies nicht unterstützt wird. Timingänderungen in den internen GPT-Strukturen können zu dieser Art von Fehlverhalten führen.
|
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 von Aufrufen an GPT
Allgemeine Beschreibung des Anwendungsfalls |
Die Race-Bedingungen können zu Fehlern führen, wenn sich die internen Strukturen von GPTs weiterentwickeln. Ein falsch
eine geordnete Reihe von Anweisungen, die aufgrund bestimmter Timings in der Ausführung funktionierten.
möglicherweise in Zukunft nicht mehr betriebsbereit sind.
|
Beispiel für ein Code-Snippet mit einem 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 Korrektur |
Vermeiden Sie Race-Bedingungen, indem Sie das übliche Timing von GPT einhalten. Beispiele für gültige teilweise Ordnungen:
-
Define-Enable-Display
- Einstellungen auf Seitenebene festlegen
- Slots definieren
- enableServices()
- Anzeigeflächen
-
Enable-Define-Display
- Einstellungen auf Seitenebene festlegen
- enableServices()
- Slots definieren
- Display-Slots
|
Szenario 7: Falsche Verwendung von Schließungen und der Gültigkeit von JavaScript-Variablen
Allgemeine Beschreibung des Anwendungsfalls |
Falsche Annahmen zum Geltungsbereich von JavaScript-Variablen und zum Wert von Variablen
in der Funktion erfasst, die an googletag.cmd.push übergeben wird.
|
Beispiel für ein Code-Snippet mit einem 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 Fehlerbehebung |
In JavaScript erfassen Closures Variablen anhand von Referenzen und nicht nach Wert. Das bedeutet,
Wenn eine Variable neu zugewiesen wird, wird ihr neuer Wert verwendet, wenn die Funktion
die ihn erfasst hat,
wird später ausgeführt. Das Verhalten des Codes im Closure kann sich also ändern, je nachdem, ob der Rückruf sofort oder verzögert ausgeführt wird.
Bei einem asynchron geladenen GPT hängt davon ab, wie schnell GPT
Callbacks in der Befehlswarteschlange können sofort ausgeführt werden oder nicht. Im vorherigen Beispiel ändert sich dadurch das Verhalten der Befehle in der Warteschlange.
Um Probleme zu vermeiden, sollte Code ohne die Annahme geschrieben werden, dass
in der Befehlswarteschlange wird sofort ausgeführt.
die Umfangsregeln von JavaScript.
|
Szenario 8: Slot-Container innerhalb des DOMs verschieben, nachdem „display“ aufgerufen wurde
Allgemeine Beschreibung des Anwendungsfalls |
Das Verschieben oder Einfügen von Slot-Containern im DOM nach dem Aufruf von display kann zu
und unvorhersehbares Verhalten
in den GPTs enthalten.
|
Beispiel für ein Code-Snippet mit einem 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");
|
Szenario 9: Browser-APIs überschreiben
Allgemeine Beschreibung des Anwendungsfalls |
Das Überschreiben (Affen-Patching, Polyfilling) von Browser-APIs wird in GPT nicht unterstützt.
Diese Vorgehensweise kann dazu führen, dass Skripts von Drittanbietern wie GPT auf unerwartete Weise beschädigt werden.
|
Beispiel für ein Code-Snippet mit einem Fehler |
// Incorrect: Overwriting window.fetch
const { fetch: originalFetch } = window;
window.fetch = (...args) => {
console.log('Fetching!');
return originalFetch(resource, config);
};
|
Vorschläge zur Fehlerbehebung |
// 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);
}
|