网站流量日志埋点收集 --埋点代码编写--匿名函数自调用创建标签引入|学习笔记

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 快速学习网站流量日志埋点收集--埋点代码编写--匿名函数自调用创建标签引入

开发者学堂课程【大数据分析之企业级网站流量运营分析系统开发实战(第一阶段)网站流量日志埋点收集--埋点代码编写--匿名函数自调用创建标签引入】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/693/detail/12175


网站流量日志埋点收集--埋点代码编写--匿名函数自调用创建标签引入


内容简介

一、js 自调用匿名函数

二、第二种代码编写方式的逻辑解读和如何实现

三、小结


一、js 自调用匿名函数

格式:(function(){})()

首先这里定义了两个小括号,第一个小括号定义了函数function,但它没有名字,所以是匿名函数,后面是函数的参数列表,{}是函数体,实现函数逻辑的地方。那么第一个小括号表明定义了一个没有名字的匿名函数,第二个小括号表示立即对前面的匿名函数自己调用自己并且只调用一次。

有这么一个语法功能,可以自己调用自己并且只调用一次,这个js自调用匿名函数可以用于页面初始化,也即我们在页面上写上一段匿名自调用逻辑,当它执行至此时就可以进行页面初始化工作。而在我们初始化过程中,我们需要完成的就是把我们收集数据的 js 给引入到页面上。


二、第二种代码编写方式的逻辑解读和如何实现

首先把(function(){})()复制,回到 HBulider 中

代码为:

<html>

<head>

<script  type=“text/javascript”src=”js/jQuery.js”></script>

<script  type=“text/javascript”>

(function(){})()

</script>

</head>

<body>

<a id=“myid”href=www.baidu.comtarget=“_blank”></a>

</body>

</html>

这时候还是需要先写 script 标签<script >,还是 type=“text/javascript”,因为页面可以引入很多 js,这时先讨论定义的匿名函数(function(){})()

我们的核心逻辑是我们打开的页面可以从上往下执行,执行至

<script  type=“text/javascript”>

(function(

){})()

它会自己调用自己,在这个过程中就会完成 js 引入至页面的工作。

我们在我们的页面上要想引入一个 js,除了自己手动写死,还可以通过 dom 对象去创建一个标签,把它添加至我们的页面上。所以通过匿名函数调用自己时可以动态的创建标签,创建 script 标签,然后把我们收集数据的 js 引入到页面上。

接下来学习上述逻辑如何实现:

<script type="text/javascript">

var_ mag =_ mag | | [];

maq.push([' setAccount',  'UA XXXXX-X']) ;

(function() {

var ma = document.createElement (‘ script') ; ma. type =

. text/javascript'; ma.async =true;

ma.src = ’ xxxxx/ma.js'

var s = document :.getElementsByTagName ('script') [0];

s. parentNode.insertBefore (ma, s) ;

})();

</script>

其中:{

var ma = document.createElement (‘ script') ; ma. type =

. text/javascript'; ma.async =true;

ma.src = ’ xxxxx/ma.js' ;

var s = document :.getElementsByTagName ('script') [0];

s. parentNode.insertBefore (ma, s) ;

}) 是函数体

这一段

(function() { ↓

var ma = document.createElement (‘ script') ; ma. type =

.’text/javascript'; ma.async =true;

ma.src = ’ xxxxx/ma.js' ;↓

var s = document :getElementsByTagName ('script') [0];

s. parentNode.insertBefore (ma, s) ;

})是匿名函数

()表示立即调用前面的匿名函数

代码解读:

首先通过 document 对象创建了新的标签,叫做 script 标签,标签名字叫做 ma,标签的 type 为 text/javascript,属性为 ma.async =true,这个属性是 html5新的属性,如果我们在页面写上一个 html 属性引入一个 js,若 js 不存在,就会造成解析的阻塞,那如何降低没有 js 而造成的阻塞问题?通过 html5新的属性;异步调用外部 js 文件,即当不存在时先通过,当完成引入之后才异步执行。

比如:

var ma = document.createElement (‘ script') ; ma. type =

.’text/javascript'; ma.async =true;

是异步加载的,ma.src = ’ xxxxx/ma.js'这就真正指向我们收集数据的路径

现在创建的标签:

var ma = document.createElement (‘ script') ; ma. type =

. text/javascript'; ma.async =true;

ma.src = ’ xxxxx/ma.js'

和我们的页面没有关系,那如何把标签放在页面上?

我们先学习下面这段代码:

Var s = document :getElementsByTagName ('script') [0];

s. parentNode.insertBefore (ma, s) ;

document :getElementsByTagName 表示根据标签名(script)获取元素,只要所有script标签中的第一个,起名”s”,再找到“s”标签的父标签,就是 head 标签,然后调用它的方法是 insertBefore,把我们刚才创建的 ma 标签放在 s 标签的前面

即:

image.png


三、小结

首先埋点代码是:

<script  type=“text/javascript”>

(function(){

})()

埋点的逻辑发生了改变,但是目标和之前一样,还是如何把 js 文件引入页面上去,只不过不是直接引入,而是匿名函数创建动态标签

用户打开页面后,会多一个标签

<script type=“text/javascript”async=“true”src=”xxx/

collect.js”></script>

这个标签就是我们动态创建的标签

总结如下图

image.png

埋点代码的编写

本来埋点代码的逻辑就是真正进行数据收集的逻辑,但是为了后续维护方便把真正收集数据的js提取出变成了 js 文件,在这种情况下,埋点代码的变成了如何把这个 js 文件引入到页面上。

1.直接通过src属性引入

<script  src=www. itcast.cn/collect.js">

2.js 匿名函数自调用

创建匿名函数自己调用自己并且调用一次通常用于页面初始化操作

(function() {

var ma = document . createElement('script'); ma.type =

'text/javascript' ;

ma.async = true;

ma.src = 'xxxxx/ma.js';

var s = document . getE lementsByTagName('script')[0];

s. parentNode . insertBefore(ma, s);

})();

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
监控 测试技术 开发者
一行代码改进:Logtail的多行日志采集性能提升7倍的奥秘
一个有趣的现象引起了作者的注意:当启用行首正则表达式处理多行日志时,采集性能出现下降。究竟是什么因素导致了这种现象?本文将探索Logtail多行日志采集性能提升的秘密。
147 23
|
1月前
|
运维 监控 Cloud Native
一行代码都不改,Golang 应用链路指标日志全知道
本文将通过阿里云开源的 Golang Agent,帮助用户实现“一行代码都不改”就能获取到应用产生的各种观测数据,同时提升运维团队和研发团队的幸福感。
|
3月前
|
PyTorch 算法框架/工具
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
本文介绍了PyTorch中的F.softmax()和F.log_softmax()函数的语法、参数和使用示例,解释了它们在进行归一化处理时的作用和区别。
569 1
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
|
5月前
|
jenkins 持续交付
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
|
3月前
|
数据可视化
Tensorboard可视化学习笔记(一):如何可视化通过网页查看log日志
关于如何使用TensorBoard进行数据可视化的教程,包括TensorBoard的安装、配置环境变量、将数据写入TensorBoard、启动TensorBoard以及如何通过网页查看日志文件。
343 0
08-06-06>pe_xscan 精简log分析代码 速度提升一倍
08-06-06>pe_xscan 精简log分析代码 速度提升一倍
|
4月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
228 0
|
5月前
|
消息中间件 Kubernetes Kafka
微服务从代码到k8s部署应有尽有系列(十一、日志收集)
微服务从代码到k8s部署应有尽有系列(十一、日志收集)
|
5月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
|
6月前
|
Unix Python
Python代码示例:使用`syslog`模块进行日志记录
Python代码示例:使用`syslog`模块进行日志记录