Javascript 谷歌标签管理器:在每次页面浏览后删除自定义HTML块?

Javascript 谷歌标签管理器:在每次页面浏览后删除自定义HTML块?,javascript,google-tag-manager,Javascript,Google Tag Manager,我们有一个带有GoogleTagManager设置的单页应用程序,以及一个用于跟踪库的自定义HTML片段的工作用法,可以为每个页面视图触发一个JS方法。虽然它可以工作,但它会为每个页面视图留下HTML脚本片段 我的问题:是否有一些现有功能可以删除自定义HTML块 或者我应该在同一脚本中编写自定义代码来清除同一代码段的旧版本吗 用于每页跟踪的自定义HTML代码段: <script type="text/javascript"> someTrackingLibrary.pageVie

我们有一个带有GoogleTagManager设置的单页应用程序,以及一个用于跟踪库的自定义HTML片段的工作用法,可以为每个页面视图触发一个JS方法。虽然它可以工作,但它会为每个页面视图留下HTML脚本片段

我的问题:是否有一些现有功能可以删除自定义HTML块

或者我应该在同一脚本中编写自定义代码来清除同一代码段的旧版本吗

用于每页跟踪的自定义HTML代码段:

<script type="text/javascript">
  someTrackingLibrary.pageViewEvent();
</script>

someTrackingLibrary.pageViewEvent();
注意:自定义脚本块的使用来自于给我们的一些建议,并在以下部分中提到:

第三条不成文的规则是函数只应返回 价值您不应该使用自定义JavaScript变量来修改 例如,通过将值推送到数据层来实现全局命名空间。如果你 如果要篡改函数中的全局变量,最好 为此目的创建自定义HTML标记

建议不要使用变量:

变量决不能有副作用

还记得变量应该如何仅用于返回值吗?好, 有时,您可能会尝试使用变量来更改状态 或将内容设置或推送到数据层。不要这样做 信息技术因为变量可以用多种方式解析,而不仅仅是 正如您所期望的,在标记中,您可能会发现自己正在创建无限 循环,多次或严重地将内容推入数据层 影响页面性能


是否有一些现有功能可以删除自定义HTML块?

不是。GTM是一个标记管理器,您需要编写自定义代码来删除代码块


我建议你通过你的第三方库来做,如果它有一些功能的话。否则,您可以编写自定义JS或添加类似wise的标记。

是否有一些现有功能可以删除自定义HTML块?

不是。GTM是一个标记管理器,您需要编写自定义代码来删除代码块

我建议你通过你的第三方库来做,如果它有一些功能的话。否则,您可以编写自定义JS或添加类似wise的标记。

以下几点:

  • 不要使用变量进行创建/删除操作:您无法控制变量的执行时间(您可以使用控制台输出创建一个伪JS变量,您会惊讶于它被调用的频率和随机性),因此使用变量修改操作是一个非常糟糕的主意
  • 没有内置的GTM功能来实现您想要的功能
  • 您可以创建一个自定义标记来执行此操作:请参见下面的示例。代码逻辑是在执行时(逻辑上,因为浏览器刚刚解析了它),因此很容易检索它。您可以添加一个
    数据层。在脚本块末尾推送
    调用,以通知GTM脚本已执行
如果您试图在不使用数据层的情况下实现解决方案,请按 方法,您将有一个竞争条件,有GTM删除 在执行标记之前编写脚本(因为GTM正在加载异步 并可能在浏览器解析这些脚本块之前准备就绪)

下面是示例页面代码:

<script>
    var removeBlock = function() {
        var scriptTag = document.scripts[document.scripts.length - 1];
        window.dataLayer = window.dataLayer || [];
        window.dataLayer.push({
            event: "delete_block",
            block: scriptTag
        });
    }
</script>
<script id="block1">
    console.log("block1");
</script>
<script id="block2" type="text/javascript">
    // YOUR ANALYTICS CODE HERE BEFORE GTM PUSH
    console.log("block2");
    removeBlock();
</script>
<script id="block3">
    console.log("block3");
</script>
有几件事:

  • 不要使用变量进行创建/删除操作:您无法控制变量的执行时间(您可以使用控制台输出创建一个伪JS变量,您会惊讶于它被调用的频率和随机性),因此使用变量修改操作是一个非常糟糕的主意
  • 没有内置的GTM功能来实现您想要的功能
  • 您可以创建一个自定义标记来执行此操作:请参见下面的示例。代码逻辑是在执行时(逻辑上,因为浏览器刚刚解析了它),因此很容易检索它。您可以添加一个
    数据层。在脚本块末尾推送
    调用,以通知GTM脚本已执行
如果您试图在不使用数据层的情况下实现解决方案,请按 方法,您将有一个竞争条件,有GTM删除 在执行标记之前编写脚本(因为GTM正在加载异步 并可能在浏览器解析这些脚本块之前准备就绪)

下面是示例页面代码:

<script>
    var removeBlock = function() {
        var scriptTag = document.scripts[document.scripts.length - 1];
        window.dataLayer = window.dataLayer || [];
        window.dataLayer.push({
            event: "delete_block",
            block: scriptTag
        });
    }
</script>
<script id="block1">
    console.log("block1");
</script>
<script id="block2" type="text/javascript">
    // YOUR ANALYTICS CODE HERE BEFORE GTM PUSH
    console.log("block2");
    removeBlock();
</script>
<script id="block3">
    console.log("block3");
</script>

作为一个姗姗来迟的答案,不要再使用自定义HTML标记了——对于大多数意图和目的来说,它们已经被替代了

自定义模板允许定义UI(例如,指定帐户ID或标记所需的任何输入)和代码块。唯一的问题(这是一个很好的问题,即使有时很烦人)是,您仅限于Google所称的“沙盒javascript”。也就是说,你不能使用标准JS的所有功能,你必须通过谷歌提供的API——这是一个“好问题”,因为它提供了额外的安全级别,但是有些东西(本质上是不安全的)不适用于沙盒Javascript(例如,不修改对象的原型链,不直接访问DOM和其他一些限制)


但是,它们避免了使用自定义标记的副本过度填充DOM的问题(例如,您可以)。

作为一个迟来的答案,不要再使用自定义HTML标记-对于大多数意图和目的,它们已被替换为

自定义模板允许定义UI(例如,指定帐户ID或标记所需的任何输入)和代码块。唯一的问题(这是一个很好的问题,即使有时很烦人)是,您仅限于Google所称的“沙盒javascript”。也就是说,您不能使用标准JS的所有功能,您必须