可以在gtm脚本上方定义dataLayer,然后将数据推送到gtm脚本下方的dataLayer吗?

can the dataLayer be defined above the gtm script and then data be pushed to dataLayer below the gtm script?

在 google dataLayer 文档中说

If you put the Google Tag Manager container snippet above the dataLayer array, Google Tag Manager may malfunction, and will not be able to read the variables defined in the array.

我的问题是:是否可以在GTM容器上方声明变量(dataLayer),然后将事件推送到GTM下方的它(dataLayer)?

是的。这不仅是可能的,这就是 GTM 本身所做的(如果您声明了一个 dataLayer 变量,GTM 会将其 gtm.js、gtm.dom 和 gtm.load 事件推送到现有的 dataLayer(如果未定义它声明变量本身)。

您需要记住的一件事是您需要推送一个 GTM 事件 - 从字面上看,一个 key/value 对,其中密钥是 "event"。 GTM 代码修改了数据层的原生推送方法以扫描 "event" 关键字,如果找到关键字,它会更新其内部变量(即在推送 GTM 事件之前您无法访问新变量) .

例如如果你想要一个数据层变量 "foo" 的值为 "bar" 你需要做

dataLayer.push({
"foo":"bar",
"event":"myCustomEvent"
});

然后您可以访问 foo 变量并检索它的值。您还可以做一个自定义事件类型触发器,它会在事件 "myCustomEvent" 被推送时立即触发(您不必这样做,但是 "bar" 值将保留到页面被卸载,您将另一个值推送到 "foo" 键,或者您重置 dataLayer)。

点击、提交和可见性等一些触发器类型提供了它们自己的事件。

另一件要记住的事情是,在 GTM 代码加载后,您不得再次声明 dataLayer 变量,否则您将删除 GTM 对 dataLayer 所做的更改和 GTM 中断。

但简而言之,是的,这完全是它应该工作的对象,您可以在 GTM 代码之后推送值。