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

本文涉及的产品
日志服务 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月前
|
监控 网络协议 CDN
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
08-06-06>pe_xscan 精简log分析代码 速度提升一倍
08-06-06>pe_xscan 精简log分析代码 速度提升一倍
|
2月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
116 0
|
3月前
|
消息中间件 Kubernetes Kafka
微服务从代码到k8s部署应有尽有系列(十一、日志收集)
微服务从代码到k8s部署应有尽有系列(十一、日志收集)
|
3月前
|
数据采集 Kubernetes Java
Job类日志采集问题之在日志中添加容器的元信息标签,如何操作
Job类日志采集问题之在日志中添加容器的元信息标签,如何操作
|
3月前
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了
|
4月前
|
Unix Python
Python代码示例:使用`syslog`模块进行日志记录
Python代码示例:使用`syslog`模块进行日志记录
|
5月前
|
安全 Java 编译器
写个代码扫描插件,再也不怕 log4j 等问题
写个代码扫描插件,再也不怕 log4j 等问题
37 0
|
5月前
|
存储 Java 关系型数据库
基于JSP的九宫格日志网站
基于JSP的九宫格日志网站
|
12天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
121 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板