自动执行匿名函数中的Javascript google analytics

时间:2017-08-21 21:05:54

标签: javascript google-analytics

我试图在自动执行的匿名函数中编写一些自定义javascript。此自定义JavaScript需要与加载Google Analytics库时创建的全局Google Analytics ga功能进行互动。以下代码位于加载库的页面的<head>中:

<script>
    (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', 'UA-XXXXXXXX-X', 'auto');
</script>

在页面底部,我的自定义javascript已加载。这是代码:

(function($, MutationObserver, shippingMethods, ga) {

    function triggerPageview(path) {
        ga('send', 'pageview', path);
    }

})(jQuery, MutationObserver, shippingMethods, ga);

我发现当前代码无法成功触发网页浏览。如果我从参数中删除ga,则仅会触发网页浏览,如下所示:

(function($, MutationObserver, shippingMethods) {

    function triggerPageview(path) {
        ga('send', 'pageview', path);
    }

})(jQuery, MutationObserver, shippingMethods);

上面的代码有效,第一个例子没有。我假设这是我误解了自执行匿名函数的这些参数应该如何工作的误解。我猜测在执行自执行功能时,ga的值在加载外部Google Analytics库之前是一些值。但是,我认为在加载库并更新ga后,我的函数中的ga也会更新。这不是真的吗?

我在触发网页浏览之前记录了ga的值,首先与传入的ga进行比较:

(function($, MutationObserver, shippingMethods, ga) {

    function triggerPageview(path) {
        console.log(ga);
        ga('send', 'pageview', path);
    }

})(jQuery, MutationObserver, shippingMethods, ga);

此日志:

ƒ (){
    (i[r].q=i[r].q||[]).push(arguments)}

然后没有ga参数:

(function($, MutationObserver, shippingMethods) {

    function triggerPageview(path) {
        console.log(ga);
        ga('send', 'pageview', path);
    }

})(jQuery, MutationObserver, shippingMethods);

此日志:

ƒ (a){J(1);Z.D.apply(Z,[arguments])}

所以,看来我肯定是在误解某些东西。有人能解释一下这里发生了什么吗?什么是&#34;适当的&#34;如何在我自己的自定义代码中引用全局?

当我将ga传递给我的函数时,它是否正在复制&#34;复制&#34; ga的当前值,而不是指全局ga变量?

1 个答案:

答案 0 :(得分:0)

我想我回答了自己的问题。如果我错了,请纠正我,但要根据这里的文档:

https://developers.google.com/analytics/devguides/collection/analyticsjs/how-analyticsjs-works

我认为Google Analytics会在加载库后重新定义ga命令。所以我的函数仍然引用最初定义的ga方法,但全局ga已被重新定义。在这种情况下,似乎最好不要传递ga参数,而只是总是引用window.ga