有人可以解释一下Google代码管理器(容器)代码,并帮助我学习:
<script>
(
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],
var j = d.createElement(s),
var 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>
行:
为什么以开括号开头? (&#34;(功能......&#34;)w d s l i的5个参数是什么?
此外,如果页面html中已经存在某个数据,那么此代码究竟是如何生成数据层的?我知道它必须在此容器代码之前,否则GTM无法使用dataLayer中的数据。
完全迷失在这里,所以任何帮助都非常感激!
编辑2: 我完全忘记了一行,而且我最难解读这一行:
var dl = l != 'dataLayer' ? '&l=' +l : '' ;
&#34; IF变量dl(dataLayer?)设置为值l(dataLayer?)但没有&#34; dataLayer&#34;然后(奇怪的东西)+ l(添加dataLayer)ELSE nothing / empty string
谢谢!
答案 0 :(得分:1)
1。为什么它从一个开放的父母开始。 (“(function ...”)5个参数是什么
w
,d
,s
,l
,i
?
这是 IIFE ,查看调用括号(点9
)以查看5个args是什么
2。将“w”数组的“L”元素设置为自身或设置为空数组
w
是window
,l
是'dataLayer'
,所以它说if (!window['dataLayer']) window['dataLayer'] = [];
否则window['dataLayer'] = window['dataLayer']
3。将一个对象推入w数组的最后一个位置,2个属性和2个值
是
4。将var f设置为s数组的第一个元素
s
为'script'
,因此f
被设置为<script>
中的第一个d
,document
5。将var j设置为元素s(但是什么是“d。”?)
j
是调用document.createElement('script')
6。异步加载true,全部清除
在元素上设置属性 j
7。 javascript源码,全部清除
大
8。绝对不知道这个人做了什么,与DOM有关的东西?
它说,从<script>
(我们称之为document
)中的第一个f
开始,找到.parentNode
,然后添加新的<script>
元素j
之前的f
9。这似乎是函数调用?函数原型中的第一个字母似乎对应于这些括号内的参数?
这是关闭和调用 IIFE ,因此这里传递的内容对应于开头的参数名称
此外,如果页面html中还没有这个代码,那么这段代码究竟是如何生成一个dataLayer的呢?
请参阅2
答案 1 :(得分:1)
在我得到解释之前,我想指出这是缩小的代码,这就是为什么它如此难以阅读。他们这样做是为了让他们不必反复重复使用相同的值,这会占用宝贵的字节。
一个。 为什么它以一个开放的parenth开始?因为它们封装了一个稍后称为传入(window, document,'script','dataLayer','GTM-xxxxx')
的函数。
湾 5个参数是什么w
d
s
l
i
?以后会在代码中传递它们。它们分别是window,
document
,script
,dataLayer
和GMT-xxxxx
。
将l
数组的w
元素设置为自身或设置为空数组。如果w[l]
已定义,则已作为数组,不要覆盖它。否则,创建它(您不能在未初始化的数组上调用数组函数)。这基本上是说(在传入值之后)是:
window['dataLayer'] = window['dataLayer'] || []
将对象推送到w
数组的最后一个位置,2个属性和2个值你有一个正确的
将var f
设置为s
数组的第一个元素,这意味着:
var f = document.getElementsByTagName('script')[0]
将获得第一个script
标记。
将var j
设置为元素s
(但d
是什么?)这实际上意味着:
var j = document.createElement('script')
异步加载为true,全部清除这些非常简单
javascript来源,全部清除再次,轻松
绝对不知道这个人做了什么,与DOM有关的东西?这意味着:
f
元素的父级(即封装节点),在这种情况下可能是<head>
j
元素<script>
元素(这是一个新的f
)
这似乎是函数调用?函数原型中的第一个字母似乎对应于这些括号内的参数?是