【问题标题】:Page stop responding while loading custom javascript加载自定义 javascript 时页面停止响应
【发布时间】:2019-09-01 23:06:07
【问题描述】:

我是 GTM 新手

  1. 我正在一个变量中运行以下自定义 javascript。
function(){
    if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
    let data = dataLayer.push({'event':'prefers-color-scheme','prefers-color-scheme':'dark'});
      return data;
    }
}

  1. 我创建了一个触发器,当条件设置为 1 时,在 DOM Ready 上触发,因为 1 在 JS 中表示 true。

  2. 我创建了一个 Google Universal Analytics 标记,它跟踪事件并触发我在第二步中发送的内容,在这一步中,我为事件类别、操作和标签命名。 我还制作了版本 2 的数据层变量。prefers-color-scheme

我对 Light 重复了相同的步骤,但不受支持,但浏览器似乎卡住了,我必须关闭浏览器窗口。

我做错了什么?

【问题讨论】:

  • 是您无法在 UI 中查看数据的问题吗?
  • @bamdan 我已经解释了我的问题,因为我能够继续前进
  • 浏览器似乎没有理由在运行上述功能时卡住。你能分享更多的代码吗?也许原因在别处
  • @Royson 我想知道这是否是这样做的方法?今天早上我尝试在我的类别周围添加 {{}} 并将 Non-Interaction Hit 设置为 false。我不知道为什么这个问题会在早上冻结整个网站。
  • @Nofel 能否请您至少提供一些类似 i 的代码。 e.您在哪里调用匿名函数、DOM 就绪事件侦听器以及嵌入脚本的 HTML 代码?根据您对问题的稀疏描述,很遗憾,我们无法真正为您提供帮助,因为 任何事情 都可能是浏览器挂起的原因 - 递归函数调用/无限循环/太大的响应等等等。

标签: javascript google-tag-manager


【解决方案1】:

您通过在自定义 javascript 变量定义中推送到 dataLayer 创建了一个无限循环的事件;每当将新数据推送到 dataLayer 时,都会分析一个变量。

您的 Color Theme 变量应该是:

function() {
    if (window.matchMedia("(prefers-color-scheme: no-preference)").matches) {        
      return 2;
    }
    if (window.matchMedia("(prefers-color-scheme: dark)").matches) {        
      return 1;
    }
    return 0;
}

那么prefers-color-scheme 在技术上可能是您的测试用例的一个恒定“黑暗”,但更一般地说,它可能是Color Theme 上的查找表:

Lookup on {{Color Theme}}
  2 no-preference
  1 dark
  0 light

或者通过返回所需的显示名称,它可以是一个独立的自定义变量:

function() {
    if (window.matchMedia("(prefers-color-scheme: no-preference)").matches) {        
      return "no-preference";
    }
    if (window.matchMedia("(prefers-color-scheme: dark)").matches) {        
      return "dark";
    }
    return "light";
}

允许您根据需要限制prefers-color-scheme 上的触发并将其用作事件标签的操作,从而从触发规则中排除Theme 变量。

【讨论】:

  • 谢谢,我想知道我是怎么做一个无限循环的?在您的第一个选项中,它将返回符合触发条件的 1?但是例如,我给出了一个场景,因为有 r 夫妇更像是光,不受支持等,我可以将它们放入一个函数或为每个函数创建每个自定义 JavaScript(就像我现在拥有它一样)?在您的第二个选项中,您返回的词是深色或浅色。我是否需要使用这些名称创建变量名称并在触发器中传递它们以使其相等。
  • 每个 dataLayer.push() 运行每个自定义变量 function(){} 以获取任何触发器等的结果,如果您处于暗模式,则此函数的每次运行都是数据层推送.. 所以任何处于黑暗模式的人都处于评估此功能并再次推送的无限循环中..
  • 您可以为许多不同的情况返回相同的值(即,旧浏览器中的供应商等价物可能都返回 1)或在一个自定义变量中为许多不同的情况返回许多不同的值,然后使用否定触发规则,例如不是 0 或不是“默认”(如果您像我上一个示例中那样返回已识别类型的字符串)来为所有内容触发相同的标签,但一些无趣的默认值..您还可以使用 customvar 的许多变体,但它们会更难组合成有用的触发器和标签。
  • 在我直接将 prefers-color-scheme 定义为返回类别字符串的自定义 var 的示例中,您可以匹配字符串以将触发器限制为 prefers-color-scheme 而不是“light”不想要这些事件,但想要黑暗和无偏好或您给状态的任何其他名称。除非您无法决定永久类别名称,否则不需要其他变量,以至于您无法保持触发器中引用的字符串以阻止或触发,以及 customvar 返回的字符串同步。
  • 我可能有点失落。那么如何记录事件呢?因为prefers-color-scheme 是事件类别,所以动作可以是暗的、亮的等。在你的代码中我没有看到任何推入dataLayer 或者我如何记录这些事件?
猜你喜欢
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
相关资源
最近更新 更多