JavaScript加载订单导致问题

Ada*_*dam 4 javascript jquery

我在标题中有一个JS文件(这是针对Google DFP广告管理系统),另一个是JS文件 </body>

我发现如果标题JS文件没有加载到底部之前我在Chrome控制台中收到此错误:

 Uncaught TypeError: Object #<Object> has no method 'defineSlot' 
Run Code Online (Sandbox Code Playgroud)

defineSlot在第一个脚本中定义.这个问题只发生在大约每10页刷新一次,所以大部分时间都可以.

我想就如何处理这个问题提出建议.以下是2个脚本:

标题脚本:

<script type='text/javascript'>
var googletag = googletag || {};
googletag.cmd = googletag.cmd || [];
(function() {
    var gads = document.createElement('script');
    gads.async = true;
    gads.type = 'text/javascript';
    var useSSL = 'https:' == document.location.protocol;
    gads.src = (useSSL ? 'https:' : 'http:') + 
    '//www.googletagservices.com/tag/js/gpt.js';
    var node = document.getElementsByTagName('script')[0];
    node.parentNode.insertBefore(gads, node);
})();
</script>

<script type='text/javascript'>
googletag.cmd.push(function() {
    googletag.pubads().enableAsyncRendering();
    slot1 = googletag.defineSlot('/21848415/GoneGlobal_Square', [250, 250], 'doubleClickSquareIndex-250-250').addService(googletag.pubads());
    slot2 = googletag.defineSlot('/21848415/GoneGlobal_Skyscraper', [160, 600], 'doubleClickSkyscraperIndex-160-600').addService(googletag.pubads());
    slot3 = googletag.defineSlot('/21848415/GoneGlobal_Leaderboard', [728, 90], 'doubleClickLeaderboardIndex-728-90').addService(googletag.pubads());
    slot4 = googletag.defineSlot('/21848415/GoneGlobal_Leaderboard', [728, 90], 'doubleClickLeaderboardHeaderInternal-728-90').addService(googletag.pubads());
    slot5 = googletag.defineSlot('/21848415/GoneGlobal_SmallSquare', [200, 200], 'doubleClickSmallSquareHeaderExternal-200-200').addService(googletag.pubads());
    googletag.enableServices();
});
</script>
Run Code Online (Sandbox Code Playgroud)

下面是第二个脚本 - 这只是它的一部分(很长):

$(function() {
    ///////////////////////// Double Click AD Variables
    var slot1 = googletag.defineSlot('/21848415/GoneGlobal_Square', [250, 250], 'doubleClickSquareIndex-250-250');
    var slot2 = googletag.defineSlot('/21848415/GoneGlobal_Skyscraper', [160, 600], 'doubleClickSkyscraperIndex-160-600');
    var slot3 = googletag.defineSlot('/21848415/GoneGlobal_Leaderboard', [728, 90], 'doubleClickLeaderboardIndex-728-90');
    var slot4 = googletag.defineSlot('/21848415/GoneGlobal_Leaderboard', [728, 90], 'doubleClickLeaderboardHeaderInternal-728-90');
    var slot5 = googletag.defineSlot('/21848415/GoneGlobal_SmallSquare', [200, 200], 'doubleClickSmallSquareHeaderExternal-200-200');
)};
Run Code Online (Sandbox Code Playgroud)

有没有办法阻止脚本运行另一个方法/函数加载?

我可以创建某种依赖吗?

如何确保顶部JS在底部之前加载?

Mat*_*per 5

此处的其他解决方案可能有效,但真正的问题与您使用DFP的方式有关.

DFP广告管理系统是异步加载的,因此在执行导致错误的脚本时,页面上不存在defineSlot方法.

您的所有DFP代码都应包含在googletag.cmd.push包装器中,该包装器将存储命令,直到加载DFP,然后以正确的顺序执行它们.

只需包装任何类似的DFP代码,都应修复错误:

googletag.cmd.push(function() {
    // Double Click AD Variables

});
Run Code Online (Sandbox Code Playgroud)