Tránh các lỗi triển khai phổ biến

Các trường hợp sau đây trình bày một số lỗi phổ biến nhất quan sát thấy khi triển khai GPT. Mặc dù có vẻ như những cách triển khai như vậy sẽ hoạt động tốt với phiên bản GPT hiện tại, nhưng chúng tôi không đảm bảo rằng những cách triển khai đó sẽ tiếp tục hoạt động hiệu quả trong tương lai. Trong các trường hợp đặc biệt nhất, những cách triển khai này có thể làm gián đoạn việc phân phát quảng cáo theo những cách ngoài dự đoán. Chúng được coi là cách triển khai không được hỗ trợ.

Mỗi tình huống bao gồm một phương pháp đề xuất để khắc phục vấn đề đã trình bày.

Xin lưu ý rằng danh sách này không liệt kê đầy đủ vấn đề tiềm ẩn, nhưng sẽ là hướng dẫn hữu ích giúp xác định các loại vấn đề có thể cần giải quyết.

Hơn nữa, tuỳ thuộc vào cách triển khai, bạn có thể cần phải tìm kiếm tất cả những vị trí cần thay đổi như vậy trong trang web của mình.

Lỗi thường gặp

Trường hợp 1: Sử dụng bản sao không chính thức của thư viện GPT JavaScript

Nội dung mô tả trường hợp sử dụng cấp cao Lưu trữ gpt.js, pubads_impl.js hoặc bất kỳ thư viện nào mà chúng tải từ máy chủ của riêng bạn hoặc tải các tệp này từ một nguồn không chính thức.
Đoạn mã mẫu có lỗi
// Incorrect: Accessing these files from an unofficial source
<script async src="https://www.example.com/tag/js/gpt.js"></script>
Cách khắc phục lỗi được đề xuất
// 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>

Trường hợp 2: Dựa vào trình nghe thẻ tập lệnh gpt.js

Nội dung mô tả trường hợp sử dụng cấp cao Giả sử API GPT đã sẵn sàng để được gọi khi tệp JavaScript gpt.js được tải là không chính xác, vì một số phần của API được cung cấp bởi tệp pubads_impl.js. Do đó, việc dựa vào bất kỳ cách nào (bao gồm cả khung) trên API từ bên trong trình nghe sự kiện được đính kèm với thẻ tập lệnh là điều không chính xác.
Đoạn mã mẫu có lỗi
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);
Cách khắc phục lỗi được đề xuất
// 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);
Giải thích / nội dung mô tả về bản sửa lỗi googletag.cmd có một danh sách các lệnh sẽ chạy ngay khi GPT sẵn sàng. Đây là cách chính xác để đảm bảo lệnh gọi lại của bạn sẽ chạy khi GPT đã tải.

Trường hợp 3: Kiểm tra đối tượng googletag để biết liệu GPT đã sẵn sàng hay chưa

Nội dung mô tả trường hợp sử dụng cấp cao Vì API GPT có thể chưa sẵn sàng khi tệp JavaScript gpt.js được tải hoặc khi đối tượng googletag được xác định, việc kiểm tra đối tượng đó để xem liệu API GPT có sẵn có không đáng tin cậy hay không.
Đoạn mã mẫu có lỗi
// Incorrect: Relying on the presence of the googletag object
// as a check for the GPT API.
if (typeof googletag != 'undefined') {
 functionProcessingGPT();
}
Cách khắc phục lỗi được đề xuất
// Correct: Relying on googletag.apiReady as a check for the GPT API.
if (window.googletag && googletag.apiReady) {
 functionProcessingGPT();
}
Giải thích / nội dung mô tả về bản sửa lỗi GPT sẽ điền cờ boolean googletag.apiReady ngay khi API sẵn sàng được gọi để bạn có thể đưa ra các câu nhận định đáng tin cậy.

Trường hợp 4: Dựa vào cú pháp mã bị làm rối mã nguồn

Nội dung mô tả trường hợp sử dụng cấp cao Nếu bạn đang dựa vào cú pháp chính xác của mã thư viện GPT đã rút gọn, gần như chắc chắn bạn sẽ gặp lỗi. Vui lòng chỉ sử dụng API có trong Hướng dẫn tham khảo API vì chúng tôi liên tục thay đổi cơ chế hoạt động nội tại của GPT để liên tục cải tiến.
Ví dụ: một yêu cầu phổ biến là phát hiện thời điểm PubAdsService được tải đầy đủ để gọi refresh().
Đoạn mã mẫu có lỗi
// Incorrect: Relying on an obfuscated property.
if (googletag.pubads().a != null) {
 functionProcessingGPT();
}
Cách khắc phục lỗi được đề xuất
// Correct: Relying on public GPT API methods
// (i.e. googletag.pubadsReady in this case).
if(window.googletag && googletag.pubadsReady) {
 functionProcessingGPT();
}
Giải thích / nội dung mô tả về bản sửa lỗi Chỉ có thể dựa vào API công khai. Trong trường hợp phát hiện xem PubAdsService có được tải đầy đủ hay không, chúng tôi có giá trị boolean là googletag.pubadsReady.

Trường hợp 5: Ghi đè bất kỳ chức năng hoặc biến nào của GPT

Nội dung mô tả trường hợp sử dụng cấp cao Những trường hợp sử dụng dựa trên việc ghi đè bất kỳ chức năng hoặc biến nào mà GPT sử dụng có thể bị lỗi bất cứ lúc nào vì đây không phải là trường hợp sử dụng được hỗ trợ. Thay đổi về thời gian trong nội bộ GPT có thể làm hiển thị loại hành vi không chính xác này do các sự cố gián đoạn.
Đoạn mã mẫu có lỗi
// Incorrect: Haphazardly overwriting a googletag.* property.
googletag.cmd = [];
Cách khắc phục lỗi được đề xuất
// Correct: Never overwrite googletag.* properties if they already exist.
// Always check before assigning to them.
googletag.cmd = googletag.cmd || [];

Trường hợp 6: Sắp xếp sai thứ tự các lệnh gọi đến GPT

Nội dung mô tả trường hợp sử dụng cấp cao Điều kiện tranh đấu có thể tạo ra sự cố khi các thành phần bên trong của GPT phát triển. Một tập hợp câu lệnh có thứ tự không chính xác và đang hoạt động do có thời gian cụ thể trong quá trình thực thi có thể sẽ không hoạt động trong tương lai.
Đoạn mã mẫu có lỗi
// Incorrect: Setting page-level key-value targeting after calling
// googletag.enableServices().
googletag.enableServices();
googletag.defineSlot(...);
googletag.pubads().setTargeting(e, a);
Cách khắc phục lỗi được đề xuất
// Correct: Setting page-level key-value targeting before calling
// googletag.enableServices().
googletag.pubads().setTargeting(e, a);
googletag.defineSlot(...);
googletag.enableServices();
Giải thích / nội dung mô tả về bản sửa lỗi Tránh các tình huống tương tranh bằng cách đảm bảo tuân thủ thời gian thông thường của GPT. Ví dụ về thứ tự một phần hợp lệ bao gồm:
  • Xác định – Bật chế độ hiển thị
    1. Xác định các chế độ cài đặt cấp trang
    2. Xác định khung giờ
    3. enableServices()
    4. Vùng hiển thị
  • Bật-Xác định-Hiển thị
    1. Xác định các chế độ cài đặt cấp trang
    2. enableServices()
    3. Xác định khung giờ
    4. Vùng hiển thị

Trường hợp 7: Sử dụng sai mục đích đóng cửa và phạm vi biến JavaScript

Nội dung mô tả trường hợp sử dụng cấp cao Các giả định không chính xác về phạm vi biến JavaScript và giá trị của các biến được thu thập trong hàm được chuyển đến googletag.cmd.push.
Đoạn mã mẫu có lỗi
// 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]);
  })
 }
}
Cách khắc phục lỗi được đề xuất
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]);
  }
 }
)
Giải thích / nội dung mô tả về bản sửa lỗi

Trong JavaScript, lệnh đóng ghi lại các biến theo tham chiếu thay vì theo giá trị. Điều này có nghĩa là nếu một biến được chỉ định lại, thì giá trị mới của biến đó sẽ được sử dụng khi hàm đóng đã thu thập biến đó được thực thi sau đó. Do đó, hành vi của mã trong trạng thái đóng có thể thay đổi tuỳ thuộc vào việc lệnh gọi lại được thực thi ngay lập tức hay bị trì hoãn.

Trong trường hợp GPT tải không đồng bộ, tuỳ thuộc vào tốc độ tải GPT, các lệnh gọi lại trên hàng đợi lệnh có thể thực thi ngay lập tức hay không. Trong ví dụ trên, thao tác này sẽ thay đổi hành vi của các lệnh trong hàng đợi.

Để tránh mọi vấn đề, bạn nên viết mã mà không giả định rằng các hàm được đặt trên hàng đợi lệnh sẽ thực thi ngay lập tức. Đồng thời, bạn nên chú ý đến các quy tắc xác định phạm vi của JavaScript.

Trường hợp 8: Di chuyển các vùng chứa vị trí trong DOM sau khi gọi màn hình hiển thị

Nội dung mô tả trường hợp sử dụng cấp cao Việc di chuyển hoặc chèn các vùng chứa vị trí trong DOM sau khi gọi màn hình có thể dẫn đến việc chỉnh lại luồng không mong muốn và hành vi ngoài dự đoán trong GPT.
Đoạn mã mẫu có lỗi
// 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"));
Cách khắc phục lỗi được đề xuất
// 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");