【问题标题】:Disable google tag manager according to the decision of single users (opt-out)根据单个用户的决定禁用谷歌标签管理器(选择退出)
【发布时间】:2016-08-31 08:13:09
【问题描述】:

在某些国家/地区(例如意大利),法律要求网站必须提供 disable/enable分析 cookie

例如:对于 Google 跟踪代码管理器。

I read this post covers this "opt-in/opt-out analytics topic"


但是我还有一个问题:

为什么我不能简单地读取包含用户偏好的 cookie 服务器端,如果我找到给定值(即“禁用”),设置一个属性以能够有条件地包含(或不)我的 JSP 页面中的 GTM 脚本

【问题讨论】:

  • 只是为了争论,如果我想选择加入分析跟踪怎么办?尽管我的“服务器端 cookie”另有说明,你怎么能说出来呢?毕竟,我可能是同一台计算机上的不同用户。顺便说一句,不幸的是,这需要标记为离题,因为它与编程无关。
  • 你是对的,但这是一个普遍的 cookie 问题,不仅是我的;)每次你基于 cookie 构建功能时,你都假设在那个浏览器后面总是同一个用户

标签: javascript jsp cookies server-side google-tag-manager


【解决方案1】:

需要指出的是,GTM 既不是跟踪工具,它本身也不会设置任何 cookie。

更多编程相关,GTM 代码不能基于 cookie 禁用自身,因为需要加载 GTM 以检查 cookie 是否存在。

Cookie 仅作为 http 请求的一部分发送到设置了服务器的域; GTM 位于无法访问您域中设置的 cookie 的 Google 服务器上。因此,如果在您的域上设置了退出 cookie,GTM 服务器将不会知道它。

Cookie 主要是一种客户端技术; GTM 通过将 JavaScript 注入您的页面来与 cookie 交互,以便它在您的域的上下文中运行,然后让脚本评估您的 cookie 的内容(如果您设置了 cookie 变量或自定义脚本)。此时 GTM 代码已经加载。

这就是为什么您不能使用 cookie 来阻止 GTM 加载的原因;但是,您可以使用 cookie 禁用 GTM 中的所有标签。如果这还不够好,您必须编写自己的逻辑来有条件地禁用 GTM(您甚至可以在 CMS 中编写一个不基于 cookie 呈现 GTM 代码的例程 - 毕竟那是您自己的域,所以发送 cookie 数据按照请求;您不能指望 Google 会为您执行此操作)。

GTM 无法自行设置 cookie(除非您使用设置 cookie 的脚本编写自定义 HTML 标签,这与通过内联代码执行此操作没有什么不同),因此我假设您已经有一个名为“选择退出”。该 cookie 中存储的值无关紧要,我们只会检查它是否存在。

转到 GTM,转到“变量”部分,单击“新建”并选择“第一方 Cookie”。命名它,例如“Opt Out Cookie”并将名称字段设置为“opt-out”。保存。现在您有一个变量来检查选择退出 cookie,如果已设置则返回一个值,如果 cookie 不存在则返回“未定义”。

现在转到触发器部分并创建一个页面视图类型的新触发器。称之为例如“退出触发器”。在“触发”部分中,您在第一个字段中选择“退出 Cookie”变量,将“不等于”设置为条件,将“未定义”设置为值(因此当设置 cookie 时触发器评估为真)。

现在检查您的标签并将“退出触发器”添加到您要在设置 cookie 时禁用的标签。保存,发布。

唯一需要注意的是,浏览量触发器可能会在浏览量、DOM 就绪或页面加载时触发。在综合浏览量上触发的异常触发器不会阻止触发设置为 DOM 就绪或页面加载的代码,因此您可能需要多个异常,一个用于加载过程的每个阶段。

【讨论】:

  • 谢谢艾克。我知道你在前四段中所说的。也许有人可以做类似的事情:<script> if (condition) { $('<script>GTM script</' + 'script>').appendTo(document.body); } </script> 关于你的句子但是你可以使用 cookie 来禁用 GTM 中的所有标签你能指点我一些参考吗?我不确定 Google 会为我这样做;)
  • @Gamby,我加了一点解释。
  • @EikePierstorff 不错的答案,我主要根据您分享的想法添加了一个。你认为我错过了什么吗?
  • @EikePierstorff 我很兴奋并添加了第二个答案
【解决方案2】:

简而言之:

是的,您可以将这个 opt-in/opt-out 选项保存在 server side 上,并根据JSP 中的相关属性值。


如何

HTML

<span class="js-ga-opt-out">Disable GA - Server side solution</span>
<span class="js-ga-opt-in">Enable GA - Server side solution</span>

Javascript

function optOutGoogleTracking(){
    setCookie('_ga', undefined);

    // AJAX call to your web service setting the relevant cookie
    $.ajax({ 
      url: <optOutGoogleTrackingUrl>,
      type: 'GET',
      data: { optOutGoogleTracking: true} 
    })
    alert('disabling GA cookies');
    window.location.reload();
}

function optInGoogleTracking(){

    // AJAX call to your web service setting the relevant cookie
    $.ajax({ 
      url: <optOutGoogleTrackingUrl>,
      type: 'GET',
      data: { optOutGoogleTracking: false} 
    })

    alert('enabling GA cookies');
    window.location.reload();
}

$('html').on("click", ".js-ga-opt-out", function(){
    optOutGoogleTracking();
});

$('html').on("click", ".js-ga-opt-in", function(){
    optInGoogleTracking();
});

JSP

这里我们假设您已经设置了一个名为optOutGoogleTracking 的属性的值。

您将其存储在哪里取决于您,但可能在应用程序级别范围内,因为它在您的所有网站中都使用。

我假设您有一个名为allThatJazzcustom JSP Tag as explained here,它允许我访问此值。

<c:if test="${allThatJazz.optOutGoogleTracking==false}">
    // put your Google Tag Manager script here
</c:if>

注意:我自己还没有实现这个

【讨论】:

  • 只是一个问题:如果客户/访问者单击链接并将该应用程序范围变量设置为 false,我的意思是 allThatJazz.optOutGoogleTracking 是一个变量,在您的 JAVA/Spring 框架后面-结束代码,则对所有站点访问者禁用 GTM,而不是特定访问者。我错了吗?
【解决方案3】:

简而言之

Javascript/jQuery / js-cookie 唯一的解决方案,“仅”部分适用于 GTM(Google 跟踪代码管理器)的情况,因为它具有 &lt;noscript&gt; 实现。请参阅下面的详细信息。


如何

HTML

<span class="js-ga-opt-out">Disable GA - Javascript solution</span>
<span class="js-ga-opt-in">Enable GA - Javascript solution</span>

Javascript

// note that setCookie(key, value) is a custom function

function optOutGoogleTracking(){
    setCookie('_ga', undefined);
    setCookie('optOutGoogleTracking', true);
    alert('disabling GA cookies');
    window.location.reload();
}

function optInGoogleTracking(){
    setCookie('optOutGoogleTracking', false);
    alert('enabling GA cookies');
    window.location.reload();
}

$('html').on("click", ".js-ga-opt-out", function(){
    optOutGoogleTracking();
});

$('html').on("click", ".js-ga-opt-in", function(){
    optInGoogleTracking();
});

Google 跟踪代码管理器脚本

注意&lt;noscript&gt;&lt;/noscript&gt;标签内的内容不能被Javascript有条件地跳过。

<script src="https://cdn.jsdelivr.net/npm/js-cookie@3.0.1/dist/js.cookie.min.js"></script>
<!-- Google Tag Manager -->
<noscript>
<iframe src="//www.googletagmanager.com/ns.html?id=GTM-xxxxx"
height="0" width="0" style="display:none;visibility:hidden"></iframe>
</noscript>
<script>
if(Cookies.get('optOutGoogleTracking') === 'false') { // here is your condition
(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-xxxxx');
}
</script>
<!-- End Google Tag Manager -->

我的理解是,&lt;noscript&gt; 标签用于禁用 Javascript 的情况。然后将通过 iframe 进行跟踪。

不过,对于大多数情况,此解决方案可能“足够好”。

这是否符合法律规定?应该不会吧。

【讨论】:

  • Cookie 未定义
  • @karadayi 你是什么意思?
  • Cookies.get('optOutGoogleTracking')定义的Cookies对象在哪里?
  • 据我所知,上面的示例依赖于js-cookie 包来提供Cookies 对象。 github.com/js-cookie/js-cookie
猜你喜欢
  • 1970-01-01
  • 2017-12-28
  • 2014-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多