开发者问题收集

Jquery 和 Google Tag Manager

2015-11-17
30913

我在网站上实施 Google Tag Manager 时遇到了一些问题。我有一个 Google 代码,当我在网站上尝试它时,它会产生 大量 javascript 冲突。

因此,我尝试将代码放在一个单独的文件中,以便逐步执行并观察不同脚本的行为。

因此,这是我的非常简单的 HTML 页面:

<!DOCTYPE html>
<html>
<head>
    <title>Titre</title>
</head>
<body>
    <!-- Google Tag Manager -->
    <noscript>
    <iframe src="http://www.googletagmanager.com/ns.html?id=GTM-XXXXXX" height="0" width="0" style="display:none;visibility:hidden"></iframe>
    </noscript>
    <script type="text/javascript">
        dataLayer = [{'uid':'12'}];
        (function(w,d,s,l,i){
            w[l]=w[l]||[];
            w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});
            var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';
            j.async=true;
            j.src='//www.googletagmanager.com/gtm.js?id='+i+dl;
            f.parentNode.insertBefore(j,f);
        })(window,document,'script','dataLayer','GTM-XXXXXX');
    </script>
    <!-- End Google Tag Manager -->
    hello
</body>
</html>

并且这个页面在 JS 控制台中返回错误:

Uncaught ReferenceError: jQuery is not defined

好吧,这是意料之外的,jQuery 在这里做什么?我甚至没有在 body 标签上声明它,Google 需要 jQuery 吗?

因此,这很奇怪,第二件事,当我在浏览器上加载后查看生成的 HTML 页面时:

<body>
... Long stuff here
<script type="text/javascript" id="" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
... some other stuff here
</body>

这是什么样的魔法?为什么 Google 在我的页面底部添加了 jquery 内容,为什么我的控制台显示 jQuery 错误?

非常感谢您提供的任何信息,我完全迷路了…… 祝您有美好的一天!

3个回答

我终于找到了解决方案,正如另一个问题中所说,jQuery 是由 googletagmanager 注入的,并且由配置 google 标签管理器的 Web 代理机构进行配置。

因此,如果您遇到同样的问题,请致电您的 Web 代理机构...

如果您已经自行配置了标签管理器,请在 Google 标签管理器界面上检查您的设置。

Hammerbot
2015-11-19

Google Tag Manager 论坛上的 Simo Ahava 回答了此类问题:

为什么可能未定义 jQuery

基本上,他说 GTM 默认不会加载 jQuery。

即使您的页面确实加载了它,使用它的 GTM 标记也可能会在页面加载 jQuery 之前触发。

您可以让 jQuery 代码等待库加载,也可以在自定义 HTML 标记内加载它。

Aaron
2017-02-15

如前所述,GTM 可能会在页面的 jQuery 加载之前加载。这意味着,如果您在通过 GTM 注入的脚本中使用 jQuery,则可能会生成“Uncaught ReferenceError:jQuery 未定义”,具体取决于浏览器资源加载策略。

也就是说,您必须保证 jQuery 在 GTM 脚本 之前 加载。您可以通过以下任一方式执行此操作:

  1. 控制脚本的加载顺序
  2. 使用 hack,例如使用 setInterval 循环,直到 jQUery 可用:
var func = function() {
    if (jQuery) {  
        clearInterval(timer);
        // do your stuff
    }
}
var timer = setInterval(func, 1000);
Anoyz
2017-12-06