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

时间:2017-08-21 10:18:58

标签: javascript jquery google-analytics

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

enter image description here

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

我应该在函数中修复什么才能让它一直工作?

8 个答案:

答案 0 :(得分: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);
        }
    });

答案 1 :(得分: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");

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

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

答案 2 :(得分: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;
            }

答案 3 :(得分:4)

如果您查看this帖子,可以稍微修改一下以达到您想要的效果:

<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>

然后只要用户同意您的Cookie使用显示

,就可以致电loadGoogleAnalytics()

答案 4 :(得分:4)

您可以尝试添加以下内容,而不是调用.innerHTML()

//...text above...
TheAnalyticsScript.text = ['ga-script-string', 'fb-script.string','hotjar.string'].join('\n');
$('body').append(TheAnalyticsScript);

如果有效,请告诉我。

答案 5 :(得分:3)

这是我对这个问题的选择。该解决方案只是将默认脚本修补为return函数,然后只有在获得同意后才添加script标记。看看:

// for GoogleAnalytics
var loadGA = (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();

  // call this function after receiving consent
  return function loadGA() {
    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');

// for Facebook
window.fbAsyncInit = function() {
  FB.init({
    appId: 'your-app-id',
    autoLogAppEvents: true,
    xfbml: true,
    version: 'v2.10'
  });
  FB.AppEvents.logPageView();
};

var loadFB = (function(d, s, id) {
  //- call this function after receiving consent
  return function loadFB() {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) {
      return;
    }
    js = d.createElement(s);
    js.id = id;
    js.src = "//connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
  }
}(document, 'script', 'facebook-jssdk'));

// for HotJar
var loadHJ = (function(h, o, t, j, a, r) {
  h.hj = h.hj || function() {
    (h.hj.q = h.hj.q || []).push(arguments)
  };
  h._hjSettings = {
    hjid: 1,
    hjsv: 5
  };

  return function loadHJ() {
    a = o.getElementsByTagName('head')[0];
    r = o.createElement('script');
    r.async = 1;
    r.src = t + h._hjSettings.hjid + j + h._hjSettings.hjsv;
    a.appendChild(r);
  }
})(window, document, '//static.hotjar.com/c/hotjar-', '.js?sv=');

// finally when you receive the consent
function onConsentReceived() {
  loadGA();
  loadFB();
  loadHJ();
}

//- meanwhile you can continue using ga(), hj() whatever here...

每个加载器都可以在其自己的script标记中,但要确保这些标记的顺序。

答案 6 :(得分:0)

考虑你的代码的作用,这个函数:

  1. 创建一个填充字符串的<script>元素
  2. 将其添加到<head>
  3. 请注意,<head>只能在初始加载时加载。根据浏览器的实现情况,可能会出现一些访问者的浏览器忽略您在页面加载完成后添加的<script>标记。

    如果我明白你想做什么事你想要的话:

    1. 加载没有跟踪脚本的页面
    2. 显示同意模式/弹出窗口
    3. 点击“同意”点击​​触发此功能页面重新加载
    4. 注意:许多欧盟网站在Cookie同意后重新加载页面,因为他们使用后端呈现将<script>标记跟踪添加到页面。通常单击“我同意cookie”,他们会存储agreed: true类型的cookie,用于更改其服务器发送的网页。

      如果您不关心重新加载:

      1. 在用户同意时设置Cookie
      2. 重新加载页面
      3. 让您的后端(php / node / ruby​​ / whatever)根据此cookie添加脚本标记
      4. 如果你照顾

        更改您的功能以运行跟踪代码,而不是将其添加到DOM。

        只需查看跟踪代码并将其分解为易于阅读的代码。例如,Ga代码实际上只是:

        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);
        

        然后

        function addTrackers() {
        
        // Execute the tracking things instead of adding them to the DOM
        
        }
        

答案 7 :(得分:0)

不是附加整个分析脚本,而是可以将其包含在内,但请删除以下行:

ga("send", "pageview");

然后,当用户接受cookie时,激活使用上面同一行发送信标的分析功能。除非被特别告知,否则Google Analytics实际上不会发送任何数据。这是做你正在尝试的最合乎逻辑的方式。