اجتناب از اشتباهات رایج در اجرا

سناریوهای زیر برخی از رایج ترین اشتباهات مشاهده شده در هنگام اجرای GPT را نشان می دهد. اگرچه به نظر می‌رسد چنین پیاده‌سازی‌هایی با نسخه فعلی GPT به خوبی کار می‌کنند، اما تضمینی وجود ندارد که در آینده به این کار ادامه دهند. در شدیدترین موارد، این پیاده‌سازی‌ها ممکن است باعث شود سرویس تبلیغات به روش‌های غیرقابل پیش‌بینی شکسته شود. آنها پیاده سازی های پشتیبانی نشده در نظر گرفته می شوند.

هر سناریو شامل یک رویکرد پیشنهادی برای رفع مشکل نشان داده شده است.

توجه داشته باشید که این فهرست فهرست کاملی از مسائل بالقوه را نشان نمی‌دهد، اما انتظار می‌رود به عنوان راهنمای مفیدی برای شناسایی انواع مسائلی که ممکن است نیاز به رسیدگی داشته باشند، باشد.

علاوه بر این، بسته به اجرای خود، ممکن است لازم باشد همه مکان هایی را که ممکن است چنین تغییراتی در سایت شما ضروری باشد، جستجو کنید.

اشتباهات رایج

سناریو 1: استفاده از کپی های غیر رسمی از کتابخانه های جاوا اسکریپت GPT

شرح مورد استفاده سطح بالا میزبانی gpt.js، pubads_impl.js، یا هر کتابخانه ای که آنها از سرورهای خود بارگیری می کنند، یا بارگیری این فایل ها از یک منبع غیر رسمی.
نمونه کد کد با خطا
// Incorrect: Accessing these files from an unofficial source
<script async src="https://www.example.com/tag/js/gpt.js"></script>
راه های پیشنهادی برای رفع خطا
// 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>

سناریو 2: تکیه بر شنوندگان تگ اسکریپت gpt.js

شرح مورد استفاده سطح بالا فرض اینکه GPT API آماده فراخوانی در هنگام بارگیری فایل جاوا اسکریپت gpt.js است، اشتباه است، زیرا برخی از بخش‌های API توسط فایل pubads_impl.js ارائه می‌شوند. بنابراین اتکا به هر طریقی (از جمله چارچوب ها) بر API از درون شنوندگان رویداد متصل به تگ اسکریپت نادرست است.
نمونه کد کد با خطا
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);
راه های پیشنهادی برای رفع خطا
// 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);
توضیح / شرح اصلاح googletag.cmd فهرستی از دستورات را نگه می دارد که به محض آماده شدن GPT اجرا می شوند. این روش صحیحی برای اطمینان از اجرای تماس شما در هنگام بارگیری GPT است.

سناریو 3: بررسی شی googletag برای اطلاع از آماده بودن GPT

شرح مورد استفاده سطح بالا از آنجا که ممکن است GPT API هنگام بارگیری فایل جاوا اسکریپت gpt.js یا زمانی که شی googletag تعریف شده است آماده نباشد، بررسی آن شی برای دیدن اینکه آیا GPT API در دسترس است قابل اعتماد نیست.
نمونه کد کد با خطا
// Incorrect: Relying on the presence of the googletag object
// as a check for the GPT API.
if (typeof googletag != 'undefined') {
 functionProcessingGPT();
}
راه های پیشنهادی برای رفع خطا
// Correct: Relying on googletag.apiReady as a check for the GPT API.
if (window.googletag && googletag.apiReady) {
 functionProcessingGPT();
}
توضیح / شرح اصلاح به محض اینکه API برای فراخوانی آماده شد، GPT پرچم بولین googletag.apiReady را پر می کند تا بتوانید ادعاهای قابل اعتمادی داشته باشید.

سناریوی 4: تکیه بر نحو کد مبهم

شرح مورد استفاده سطح بالا اگر به نحو دقیق کد کتابخانه GPT کوچک شده تکیه می کنید، تقریباً مطمئناً شکستگی را تجربه خواهید کرد. لطفاً استفاده خود را به API مستند شده در راهنمای مرجع API محدود کنید، زیرا ما به طور مداوم در حال تغییر عملکرد داخلی GPT برای بهبودهای مداوم هستیم.
به عنوان مثال، یک نیاز رایج این است که تشخیص دهیم که چه زمانی PubAdsService به طور کامل بارگذاری شده است تا بتوان refresh() را فراخوانی کرد.
نمونه کد کد با خطا
// Incorrect: Relying on an obfuscated property.
if (googletag.pubads().a != null) {
 functionProcessingGPT();
}
راه های پیشنهادی برای رفع خطا
// Correct: Relying on public GPT API methods
// (i.e. googletag.pubadsReady in this case).
if(window.googletag && googletag.pubadsReady) {
 functionProcessingGPT();
}
توضیح / شرح اصلاح فقط می توان به API عمومی اعتماد کرد. در صورت تشخیص اینکه PubAdsService به طور کامل بارگیری شده است، یک مقدار منطقی googletag.pubadsReady داریم.

سناریوی 5: رونویسی هر تابع یا متغیر GPT

شرح مورد استفاده سطح بالا موارد استفاده بر اساس رونویسی هر تابع یا متغیری که توسط GPT استفاده می‌شود ممکن است در هر زمانی خراب شود زیرا این مورد پشتیبانی نمی‌شود. تغییرات زمان‌بندی در قسمت‌های داخلی GPT ممکن است این نوع رفتار نادرست را با شکستگی نشان دهد.
نمونه کد کد با خطا
// Incorrect: Haphazardly overwriting a googletag.* property.
googletag.cmd = [];
راه های پیشنهادی برای رفع خطا
// Correct: Never overwrite googletag.* properties if they already exist.
// Always check before assigning to them.
googletag.cmd = googletag.cmd || [];

سناریو 6: ترتیب دادن اشتباه تماس ها به GPT

شرح مورد استفاده سطح بالا شرایط مسابقه ممکن است با تکامل اجزای داخلی GPT باعث شکستگی شود. مجموعه‌ای از اظهارات که به‌طور نادرست ترتیب داده شده‌اند و به دلیل زمان‌بندی‌های خاص در اجرا کاربردی بوده‌اند، ممکن است در آینده عملیاتی نشوند.
نمونه کد کد با خطا
// Incorrect: Setting page-level key-value targeting after calling
// googletag.enableServices().
googletag.enableServices();
googletag.defineSlot(...);
googletag.pubads().setTargeting(e, a);
راه های پیشنهادی برای رفع خطا
// Correct: Setting page-level key-value targeting before calling
// googletag.enableServices().
googletag.pubads().setTargeting(e, a);
googletag.defineSlot(...);
googletag.enableServices();
توضیح / شرح اصلاح با اطمینان از رعایت زمان بندی معمول GPT از شرایط مسابقه اجتناب کنید. نمونه سفارشات جزئی معتبر عبارتند از:
  • Define-Enable-Display
    1. تنظیمات سطح صفحه را تعریف کنید
    2. اسلات ها را تعریف کنید
    3. enableServices()
    4. اسلات نمایش
  • Enable-Define-Display
    1. تنظیمات سطح صفحه را تعریف کنید
    2. enableServices()
    3. اسلات ها را تعریف کنید
    4. اسلات نمایش

سناریوی 7: استفاده نادرست از بسته شدن و محدوده متغیر جاوا اسکریپت

شرح مورد استفاده سطح بالا مفروضات نادرست در مورد محدوده متغیر جاوا اسکریپت و مقدار متغیرهای ثبت شده در تابع به googletag.cmd.push ارسال شده است.
نمونه کد کد با خطا
// 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]);
  })
 }
}
راه های پیشنهادی برای رفع خطا
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]);
  }
 }
)
توضیح / شرح اصلاح

در جاوا اسکریپت، بسته‌ها متغیرها را با مرجع و نه با مقدار می‌گیرند. این بدان معناست که اگر متغیری دوباره تخصیص داده شود، زمانی که بسته شدن تابعی که بعداً آن را گرفته است، از مقدار جدید آن استفاده خواهد شد. بنابراین رفتار کد در بسته شدن ممکن است بسته به اینکه پاسخ تماس بلافاصله اجرا شود یا با تأخیر تغییر کند.

در مورد GPT بارگیری ناهمزمان، بسته به سرعت بارگیری تماس‌های GPT در صف فرمان ممکن است بلافاصله اجرا شوند یا خیر. در مثال قبلی، این رفتار دستورات در صف را تغییر می دهد.

برای جلوگیری از هر گونه مشکل، کد باید بدون این فرض نوشته شود که توابع قرار داده شده در صف فرمان بلافاصله اجرا می شوند، و باید در مورد قوانین محدوده جاوا اسکریپت دقت شود.

سناریوی 8: جابجایی ظروف شکاف در DOM پس از نمایش فراخوانی

شرح مورد استفاده سطح بالا جابجایی یا قرار دادن ظروف شکاف در DOM پس از فراخوانی صفحه نمایش می تواند منجر به جریان مجدد نامطلوب و رفتار غیرقابل پیش بینی در GPT شود.
نمونه کد کد با خطا
// 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"));
راه های پیشنهادی برای رفع خطا
// 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");

سناریو 9: بازنویسی APIهای مرورگر

شرح مورد استفاده سطح بالا بازنویسی (معروف به اصلاح میمون، چند پر کردن) APIهای مرورگر در GPT پشتیبانی نمی‌شود. این عمل پتانسیل شکستن اسکریپت های شخص ثالث مانند GPT را به روش های غیرمنتظره دارد.
نمونه کد کد با خطا
// Incorrect: Overwriting window.fetch
const { fetch: originalFetch } = window;
window.fetch = (...args) => {
 console.log('Fetching!');
 return originalFetch(resource, config);
};
راه های پیشنهادی برای رفع خطا
// 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);
}