通过在头部附加脚本加载页面后加载Google Analytics并不总是有效

fre*_*hie 25 javascript jquery google-analytics

在欧盟,有一项cookie法律要求您在用户表示同意后加载第三方脚本,例如点击,滚动或导航.所以我通过执行在文档加载后调用的函数来加载3个脚本.这是代码:

在此输入图像描述

问题是它并不总是有效,也不总是失败.我看到了会话和活动,但我也知道有一些事实是访问不会触发脚本,因为当我在其他几台计算机上自己测试时,并非所有活动都保存在分析中.

我应该在功能中修复它以使其始终有效?

Far*_*rlo 11

$(document).ajaxComplete(function() {
        var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-XXXXX-X']);
      _gaq.push(['_trackPageview']);

       var loadGoogleAnalytics = function(){
         var ga = document.createElement('script');
           ga.type = 'text/javascript';
           ga.async = true;
           ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

           var s = document.getElementsByTagName('script')[0];
           s.parentNode.insertBefore(ga, s);
        }
    });
Run Code Online (Sandbox Code Playgroud)

  • 那么,当完成任何ajax时,此函数将设置loadGoogleAnalytics函数吗?这是没有道理的。 (2认同)

wjv*_*der 6

如果你看看这篇文章,你可以稍微修改它来实现你想要的:

<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

   var loadGoogleAnalytics = function(){
     var ga = document.createElement('script');
       ga.type = 'text/javascript';
       ga.async = true;
       ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

       var s = document.getElementsByTagName('script')[0];
       s.parentNode.insertBefore(ga, s);
    }
</script>
Run Code Online (Sandbox Code Playgroud)

然后loadGoogleAnalytics()只要用户同意您的 Cookie 使用显示时调用


小智 5

其他回应似乎针对的是旧有的ga.js,而您的问题似乎针对的是analytics.js(当前)。

稍微研究analytics.js代码段,您可以轻松找到答案(如下所示,格式更漂亮):

(function(i, s, o, g, r, a, m) {
  i["GoogleAnalyticsObject"] = r;
  (i[r] =
    i[r] ||
    function() {
      (i[r].q = i[r].q || []).push(arguments);
    }), (i[r].l = 1 * new Date());
  (a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]);
  a.async = 1;
  a.src = g;
  m.parentNode.insertBefore(a, m);
})(
  window,
  document,
  "script",
  "https://www.google-analytics.com/analytics.js",
  "ga"
);

ga("create", "UA-XXXXX-Y", "auto");
ga("send", "pageview");
Run Code Online (Sandbox Code Playgroud)

诀窍很简单:Google创建一个全局变量GoogleAnalyticsObject,该变量是表示全局GoogleAnalytics名称的字符串。您可以看到默认情况下是"ga"

因此,在加载时,您需要创建两个全局变量:GoogleAnalyticsObject(它是一个字符串)和window [GoogleAnalyticsObject](是一个函数(仅累积事件,我猜是在加载lib时替换了此函数))。然后,当您的用户接受cookie时,就可以加载lib了:)


Leo*_*ira 4

您可以尝试使用这个对我来说效果很好的功能:

function loadGoogleAnalytics(trackingId) {
                var deferred = $q.defer();

                function loadScript() {
                    var scriptId = 'google-analytics';

                    if (document.getElementById(scriptId)) {
                        deferred.resolve();
                        return;
                    }

                    var s = document.createElement('script');
                    s.id = scriptId;
                    s.innerText = "(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');ga('create', '" + trackingId + "', 'auto');";

                    // most browsers
                    s.onload = initGA();
                    // IE 6 & 7
                    s.onreadystatechange = function () {
                        if (this.readyState == 'complete') {
                            initGA();
                        }
                    }

                    document.getElementsByTagName('head')[0].appendChild(s);
                }

                $window.initGA = function () {
                    deferred.resolve();
                }

                loadScript();

                return deferred.promise;
            }
Run Code Online (Sandbox Code Playgroud)