详解JavaScript发送埋点请求的两种方式

 更新时间:2022年06月16日 08:35:36   作者:yuyongyu  
对于发送埋点请求这种应用场景,我们有两种简单的处理方式:动态创建<script>和<img>两种方式。本文就详细讲讲二种方式的实现,需要的可以参考一下

对于统计页面数据这样的情景(俗称埋点),我们常用的方式就是动态创建<img>或<script>,至于原因,一般有以下几点:

1.埋点一般不用关心请求的结果

2.可以实现跨域请求

3.无需使用ajax就能达到发请求的目的

4.都是原生实现,兼容性好

现就两种方式做一下对比和总结:

一、用法

1.动态创建<img>

方式1:通过img标签

function sendByImg(src) {
    var img = document.createElement("img");
    img.src = src;
}

方式2:通过Image对象

function sendByImage(src) {
    var img = new Image();
    img.src = src;
}

2.动态创建<script>

只有一种方式:通过<script>标签

function sendByScript(src){
    var script = document.createElement("script");
    script.src = src;
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(script);
}

二、区别

区别1

如果要触发请求,动态创建的<script>必须要插入到DOM中,而动态创建的<img>则不需要

演示代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Img VS Script</title>
</head>
<body>
<h3>
    请观察浏览器中的Network和Elements!
</h3>
<script>
    function sendByScript(src){
        var script = document.createElement("script");
        script.src = src;
    }

    function sendByScriptInsertDOM(src){
        var script = document.createElement("script");
        script.src = src;
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(script);
    }

    function sendByImage(src) {
        var img = new Image();
        img.src = src;
    }

    function sendByImg(src) {
        var img = document.createElement("img");
        img.src = src;
    }

    function sendRequest(src) {
        //一、通过script:
        //不插入DOM,不会触发请求
        sendByScript(src + '/byScript');

        //插到DOM中,会触发请求
        sendByScriptInsertDOM(src + '/byScriptDOM');


        //二、通过img:
        //不插入DOM,不会触发请求
        sendByImage(src+ '/byImage');

        //不插入DOM,不会触发请求
        sendByImg(src+ '/byImg');
    }

    sendRequest('https://wwww.baidu.com')

</script>
</body>
</html>

用chrome浏览器打开此HTML文件,查看network:

图片描述

可以看到,插入DOM中的<script>触发来请求,而未插入DOM中则没有发起请求;动态创建的<img>的两种方式没有插入DOM,都触发请求。

那么问题来了,为什么动态创建的<script>必须要插入DOM中才会触发请求,而动态创建的<img>则不用?关于这个问题,在网上查了很久也没有找到特别强有力的解释。有人说是因为这两种标签本身的特性决定的:<img>作为展示性标签加载的是图片资源,其对应的地址可以直接访问就能得到资源;<script>往往加载的是JavaScript代码,需要网页这样的执行环境。个人觉得此解释有些牵强,但也没有找到更权威的解释。如果有更好的观点,欢迎留言。

区别2

动态创建的<script>可以对请求结果进行处理,而动态创建的<img>做不到

JSONP的实现原理就是借助动态创建<script>标签,并对返回结果进行处理。

至此,我当时在想,那么借助jQuery发送JSONP请求,岂不是每发一次就要在页面上创建一个<script>标签?观察结果显示并没有。于是去看了下jQuery的源码:

图片描述

如图所示,在<script>加载完成或出错后将标签移除。所以,我们在用动态创建<script>方式发送请求也可以参考这种方式。

三、选择哪种方式

单纯从发送请求的角度看,理论上两者没有特别大的差异,但有一点一定要注意:动态创建<img>的方式在浏览器禁用图片模式下不会触发请求。

例如,在chrome浏览器中设置禁图模式(设置>高级设置>隐私设置和安全性>网站设置>图片>显示全部 去掉),结果:

图片描述

只有动态创建<script>的方式有请求,动态创建<img>的方式没有任何请求记录。

综上,从扩展性和兼容性上看,动态创建<script>的方式是首选。

四、总结

对于发送埋点请求这种应用场景,我们有两种简单的处理方式:动态创建<script>和<img>两种方式,两者最大的差异是:动态创建的<script>必须插入到DOM中才能触发请求,而动态创建<img>的方式则不需要。但动态创建<img>的方式有个致命缺陷:浏览器设置了禁止图片显示时,无法触发请求。所以,对于封装埋点库的时候,动态创建<script>的方式是首选,而且可以参考jQuery,在请求记载完成后对<script>进行清除。

以上就是详解JavaScript发送埋点请求的两种方式的详细内容,更多关于JavaScript发送埋点的资料请关注脚本之家其它相关文章!

相关文章

  • 实现图片首尾平滑轮播(JS原生方法—节流)

    实现图片首尾平滑轮播(JS原生方法—节流)

    下面小编就为大家带来一篇实现图片首尾平滑轮播(JS原生方法—节流)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • JS使用post提交的两种方式

    JS使用post提交的两种方式

    这篇文章主要介绍了JS使用post提交的两种方式,实例分析了两种JavaScript使用post提交的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-12-12
  • 使用JavaScript实现一个炫酷的罗盘时钟

    使用JavaScript实现一个炫酷的罗盘时钟

    在探究前端动画时,想到之前在锁屏壁纸看到的罗盘时钟,看着很是炫酷,于是说干就干,下面就跟随小编一起来学习一下如何使用JS实现一个炫酷的罗盘时钟效果吧
    2024-02-02
  • ThingJS粒子特效一键实现雨雪效果

    ThingJS粒子特效一键实现雨雪效果

    在做3D项目时,我们经常需要模拟下雨,下雪的天气,有时也会模拟喷泉、着火等效果。这些效果需要使用名为粒子系统(particle)的技术来实现。使用ThingJS可以快速编写粒子效果,本文就来看看如何实现
    2021-05-05
  • ES6使用export和import实现模块化的方法

    ES6使用export和import实现模块化的方法

    这篇文章主要介绍了ES6使用export和import实现模块化的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 深入理解Javascript中的循环优化

    深入理解Javascript中的循环优化

    这篇文章介绍了Javascript中的循环优化,有需要的朋友可以参考一下
    2013-11-11
  • js鼠标悬浮出现遮罩层的方法

    js鼠标悬浮出现遮罩层的方法

    这篇文章主要介绍了js鼠标悬浮出现遮罩层的方法,以实例形式较为详细的分析了html及css页面布局与js特效的实现方法,是非常实用的技巧,需要的朋友可以参考下
    2015-01-01
  • js Event对象的5种坐标

    js Event对象的5种坐标

    使用鼠标事件经常碰到这样的需求,比如获取鼠标相对于事件源的位置,鼠标相对于事件源对象父元素的位置
    2011-09-09
  • JavaScript实现将图片地址转成文件流并上传

    JavaScript实现将图片地址转成文件流并上传

    这篇文章主要为大家详细介绍了如何使用JavaScript实现将图片地址转成文件流并上传,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • JavaScript基础篇(6)之函数表达式闭包

    JavaScript基础篇(6)之函数表达式闭包

    这篇文章主要介绍了javascript基础篇(6)之函数表达式闭包的相关资料,需要的朋友可以参考下
    2015-12-12

最新评论