避免在嵌入式JS模块中与Google Analytics发生全局冲突

时间:2017-09-05 09:49:24

标签: javascript google-analytics

我们为电子商务网站所有者的客户提供可以嵌入其网站的JS模块。它基本上是<script src=...>,他们在HTML中加载我们的JavaScript并在结帐时显示我们的用户界面,类似于this

现在,因为我正在独立加载Google Analytics模块(根据their docs):

<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','https://www.google-analytics.com/analytics.js','ga');

// ...
</script>

我冒着与托管网站自己的Google Analytics模块发生冲突的风险。

即使我按照renaming the ga object说明操作:

<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','analytics');
</script>

(请注意'analytics'更改)

它仍有风险,因为它取决于i['GoogleAnalyticsObject']=r位,技术上window['GoogleAnalyticsObject']=customGlobalName。加载analytics.js脚本时,它会在window['GoogleAnalyticsObject']中查找全局名称并使用它。但这意味着我会覆盖托管网站的window['GoogleAnalyticsObject']值,即使它默认为ga

我看到他们的gtag.js,他们允许更好的方式renaming the gtag object,但它仍处于alpha阶段:(。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

没有必要拥有多个单独的ga对象(如果ga名称由其他脚本占用,则可以重命名),因为您可以使用跟踪器名称创建跟踪器对象的单独实例:

ga('create', 'UA-XXXXX-Y', 'auto', 'embeddableJSmoduleTracker');

然后使用相应名称

为所有通话添加前缀
ga('embeddableJSmoduleTracker.set','userId','abcde');
ga('embeddableJSmoduleTracker.send', 'pageview');

跟踪器名称确保所有跟踪器实例都有自己的配置(只需确保您不会忘记名称前缀或者您将写入默认跟踪器)。

为了尽量减少干扰,您还可以考虑使用custom cookie name(必须在创建跟踪器时设置)。