1

这是我在随机页面上经常看到的代码。

我认为这是一个谷歌跟踪代码,但有人可以确认吗?

当我在 JSFiddle 中运行它时,似乎什么也没发生。

var tvt = tvt || {};
tvt.captureVariables = function(a) {
  for (var b = new Date, c = {}, d = Object.keys(a || {}), e = 0, f; f = d[e]; e++)
    if (a.hasOwnProperty(f) &&
      "undefined" != typeof a[f]) try {
      var g = [];
      c[f] = JSON.stringify(a[f], function(a, b) {
        try {
          if ("function" !== typeof b) {
            if ("object" === typeof b && null !== b) {
              if (b instanceof HTMLElement || b instanceof Node || -1 != g.indexOf(b)) return;
              g.push(b)
            }
            return b
          }
        } catch (c) {}
      })
    } catch (l) {}
    a = document.createEvent("CustomEvent");
  a.initCustomEvent("TvtRetrievedVariablesEvent", !0, !0, {
    variables: c,
    date: b
  });
  window.dispatchEvent(a)
};
window.setTimeout(function() {
  tvt.captureVariables({
    'dataLayer': window['dataLayer']
  })
}, 2000);

4

2 回答 2

10

这是由 Google 的Tag Assistant扩展注入的脚本。源头要大得多。

我已经对源代码进行了精简,可以Gist 上找到它。请注意,它的长度约为 6300 行——对于这个答案来说,大约两万个字符太长了。

注入发生在第 3030 行附近,带有一个动态创建的脚本。注意kg,以及它们是如何依赖Function.prototype.toString来获取函数的源代码的。

lg = function(a) {
  if (!a.Ab && (a.Ab = !0, a = a.X(), a = Object.keys(a).map(function(a) {
    return "'" + a + "': window['" + a + "']"
  }), 0 < a.length && (!aa.tvt || !aa.tvt.captureVariables))) {
    var b = document.createElement("script");
    b.textContent = "var tvt = tvt || {}; tvt.captureVariables = " + kg + ";window.setTimeout(function() {tvt.captureVariables({" + a.join(",") + "})}, 2000);";
    (document.head || document.documentElement).appendChild(b)
  }
}

kg之后可以立即找到,如下所示,与您发布的内容相对应。

kg = function(a) {
  for (var b = new Date, c = {}, d = Object.keys(a || {}), e = 0, f; f = d[e]; e++)
    if (a.hasOwnProperty(f) &&
      "undefined" != typeof a[f]) try {
      var g = [];
      c[f] = JSON.stringify(a[f], function(a, b) {
        try {
          if ("function" !== typeof b) {
            if ("object" === typeof b && null !== b) {
              if (b instanceof HTMLElement || b instanceof Node || -1 != g.indexOf(b)) return;
              g.push(b)
            }
            return b
          }
        } catch (c) {}
      })
    } catch (l) {}
  a = document.createEvent("CustomEvent");
  a.initCustomEvent("TvtRetrievedVariablesEvent", !0, !0, {
    variables: c,
    date: b
  });
  window.dispatchEvent(a)
};

关于扩展的简介,来自About Tag Assistant

关于标签助手

Tag Assistant 是一个 Chrome 扩展程序,可自动验证 Google 跟踪脚本在任何给定页面上的实施。它目前适用于:

  • 谷歌分析 (ga.js)

  • 谷歌分析 (dc.js)

  • AdWords 转化跟踪

  • AdWords 再营销(旧版)

  • AdWords 再营销(新的再营销代码)

  • 双击 Floodlight

  • 谷歌标签管理器

标签助手的工作原理

安装扩展程序后,您将在您正在查看的页面上看到一个指示标签状态的图标。

  • 带有“x”的灰色图标表示在页面上未找到代码

  • 如果找到有效标签,将显示绿色指示器。图标中的数字表示找到的标签数量

  • 蓝色指示器将显示有关改善整体标记健康的建议

  • 黄色指示符将显示发现存在轻微实施问题的标签

  • 红色指示器将显示发现存在严重实施问题的标签

单击该图标可打开一个包含标签详细信息的窗口。它显示找到了多少标签、找到了多少错误、任何错误,以及指向可用于解决问题的最相关帮助文档的链接。此外,Tag Assistant 会在可以进行改进时提出建议。例如,如果安装了过时的 Analytics 代码,Tag Assistant 可能会建议您更新到较新的代码。

于 2016-02-28T18:25:51.820 回答
2

它只是用于检查是否定义了变量的简码,如果没有定义,则将其定义为空对象。它类似于:

if(tvt === undefined){
   tvt = {};
}

基本上,它确保两者:

  • 变量被定义(和一个对象)
  • 它保留任何以前的属性(如果有)

var obj1 = {prop: 123};
var obj2 = obj1 || {}; // obj2 will have the value of obj1 because obj1 is defined
var obj3 = obj3 || {}; // obj will be an empty object

document.write(JSON.stringify({obj2: obj2, obj3: obj3}));


免责声明:我只回答了代码的第一行,因为我明白这就是你从标题中提出的问题。但现在我看到您可能指的是整个代码块。如果是这样,请忽略此答案。

于 2016-02-28T18:06:26.983 回答