js限制用户(如何用JS追踪用户)
js限制用户
如何用JS追踪用户目录
- 一、同步 AJAX
- 二、异步 AJAX
- 三、追踪用户点击
- 四、反弹追踪
- 五、Beacon API
- 六、ping 属性
数据发回服务器的常见做法是,将收集好的用户数据,放在unload事件里面,用 AJAX 请求发回服务器。
但是,异步 AJAX 在unload事件里面不一定能成功,因为网页已经处于卸载中,浏览器可能发送,也可能不发送。所以,要改成同步 AJAX 请求。
window.addEventListener('unload', function (event) { let xhr = new XMLHttpRequest(); xhr.open('post', '/log', false); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send('foo=bar'); });
上面代码中,xhr.open()方法的第三个参数是false,表示同步请求。
这种方法最大的问题在于,浏览器逐步将不允许在主线程上面,使用同步 AJAX。所以,上面代码实际上不能用。
二、异步 AJAX异步 AJAX 其实是能用的。前提是unload事件里面,必须有一些很耗时的同步操作。这样就能留出足够的时间,保证异步 AJAX 能够发送成功。
function log() { let xhr = new XMLHttpRequest(); xhr.open('post', '/log', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send('foo=bar'); } window.addEventListener('unload', function(event) { log(); // a time-consuming operation for (let i = 1; i < 10000; i++) { for (let m = 1; m < 10000; m++) { continue; } } });
上面代码中,强制执行了一次双重循环,拖长了unload事件的执行时间,导致异步 AJAX 能够发送成功。
三、追踪用户点击setTimeout也能拖延页面卸载,保证异步请求发送成功。下面是一个例子,追踪用户点击。
// HTML 代码如下 // <a id="target" href="https://baidu.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" >click</a> const clickTime = 350; const theLink = document.getElementById('target'); function log() { let xhr = new XMLHttpRequest(); xhr.open('post', '/log', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send('foo=bar'); } theLink.addEventListener('click', function (event) { event.preventDefault(); log(); setTimeout(function () { window.location.href = theLink.getAttribute('href'); }, clickTime); });
上面代码使用setTimeout,拖延了350毫秒,才让页面跳转,因此使得异步 AJAX 有时间发出。
四、反弹追踪追踪用户点击,还可以使用反弹追踪(bounce tracking)。
所谓"反弹追踪",就是网页跳转时,先跳到一个或多个中间网址,以便收集信息,然后再跳转到原来的目标网址。
// HTML 代码如下 // <a id="target" href="https://baidu.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" >click</a> const theLink = document.getElementById('target'); theLink.addEventListener('click', function (event) { event.preventDefault(); window.location.href = '/jump?url=' + encodeURIComponent(theLink.getAttribute('href')); });
上面代码中,用户点击的时候,会强制跳到一个中间网址,将信息携带过去,处理完毕以后,再跳到原始的目标网址。
谷歌和百度现在都是这样做,点击搜索结果时,会反弹多次,才跳到目标网址。
五、Beacon API上面这些做法,都会延缓网页卸载,严重影响用户体验。
为了解决网页卸载时,异步请求无法成功的问题,浏览器特别实现了一个 Beacon API,允许异步请求脱离当前主线程,放到浏览器进程里面发出,这样可以保证一定能发出。
window.addEventListener('unload', function (event) { navigator.sendBeacon('/log', 'foo=bar'); });
上面代码中,navigator.sendBeacon()方法可以保证,异步请求一定会发出。第一个参数是请求的网址,第二个参数是发送的数据。
注意,Beacon API 发出的是 POST 请求。
六、ping 属性HTML 的<a>标签有一个ping属性,只要用户点击,就会向该属性指定的网址,发出一个 POST 请求。
<a href="https://baidu.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" ping="/log?foo=bar"> click </a>
上面代码中,用户点击跳转时,会向/log这个网址发一个 POST 请求。
ping属性无法指定数据体,似乎只能通过 URL 的查询字符串携带信息。
以上就是如何用JS追踪用户的详细内容,更多关于用JS追踪用户的资料请关注开心学习网其它相关文章!
- js实现分页
- php加密平台(PHP7实现和CryptoJS的AES加密方式互通示例AES-128-ECB加密)
- python3json序列化(Python3.5 Json与pickle实现数据序列化与反序列化操作示例)
- nodejs架构解析(详解NodeJS模块化)
- extjs中treegrid
- js实现string.format 字符串占位符
- 动态加载js脚本
- Extjs menu菜单的简单用法
- js图片水印库(js给图片打马赛克的方法示例)
- 纯css和js有什么区别(CSS语法与JSON、JS对象区别比较)
- js实现继承的五种(JavaScript继承的三种方法实例)
- JS中Location
- js网站前端效果(JS如何让你的移动端交互体验更加优秀)
- nodejs请求页面(node.js+postman实现模拟HTTP服务器与客户端交互)
- vue 富文本图片上传(vue.js云存储实现图片上传功能)
- 利用前端做扫雷游戏(js实现经典扫雷游戏)
- 魔兽世界 设计师爆料,原始版本并无PVP,跨阵营属于返璞归真(魔兽世界设计师爆料)
- 吐槽完《弧光大作战》之后,我们和设计师聊了聊魔兽首款手游的立项初衷和未来(吐槽完弧光大作战之后)
- 魔兽争霸3自定义战役少年杰雷 2(魔兽争霸3自定义战役少年杰雷)
- 今日菜价 芥兰涨幅最高 1.33 ,花菜降幅最高 3.10(今日菜价芥兰涨幅最高)
- 今日菜价 椰菜涨幅最高 3.25 ,水空心菜降幅最高 2.58(今日菜价椰菜涨幅最高)
- 今日菜价 红三鱼涨幅最高 4.41 ,黄鳝降幅最高 5.06(红三鱼涨幅最高)
热门推荐
- thinkphp5开发小程序后台(PHP小程序支付功能完整版基于thinkPHP)
- dedecms5.7能否用5.5的模板(dedecms 5.5 伪静态设置方法)
- sqlserver数据库如何分页(SQL server分页的4种方法示例很全面)
- dede如何添加自定义字段内容(织梦dede模板标签书写格式的规范和相关注意事项)
- 织梦dedecms建站详细流程(修改织梦dedecms后台默认admin账号的方法)
- 如何调用dede标签(浅析Dedecms程序SEO常用的列表标签调用代码集合)
- 阿里云服务器公网ip搭建(阿里云服务器无公网如何上网?)
- win7如何搭建serv-u服务器(使用Serv-U搭建FTP服务器以及bestsync自动同步设置图文教程)
- vue怎么实现倒计时(Vue计时器的用法详解)
- rename重命名mysql表(MySQL 重命名表的操作方法及注意事项)