ua.js中用 image 对象实现页面访问统计
actionlog_js_ua.js混淆编程形式与执行主流程
ua.js中mousedown和mousemove事件自定义函数功能解析
ua.js中JSocket.getlso和JSocket.setlso代码分析
ua.js中arguments.callee.caller的应用
据说目前用image对象实现页面访问统计是比较最常用的一个方法,将类似的JavaScript脚本放在网页里:new Image().src = “http://xxx.com/log?msg=”+ msg; 这种统计方法基本上不会干扰用户的正常操作,大淘宝的ua.js文件中就有用image对象实现页面访问统计。
ua.js中用 image 对象实现页面访问统计的代码
1 2 3 4 5 6 7 8 9 10 |
ytq = function (sb81, d) { var sb = new Image(); var embn = (new window["Date"]())["getTime"]() + window["Math"]["random"](); window[embn] = sb; sb["onload"] = sb["onerror"] = function () { window[embn] = null; }; sb["src"] = sb81 + window["encodeURIComponent"](d); sb = null; }; |
上述代码中给sb[“src”]赋值时,当前脚本就会将相应数据回传至服务器后台。其中代码”window[embn]=sb;sb=null;”是用image对象实现页面访问统计的回收方案。若new image没有赋值给任何变量,那么在这个函数执行结束时,浏览器的垃圾回收机制对这种“无主”的对象是毫不客气的回收的,而正是这种回收行为导致了这个HTTP请求(异步的)没有发出,从而导致统计信息的丢失。百度也用类似的方法来统计页面访问状况。
本节参考文献:用new Image().src作LOG统计的一个注意事项
前端相关数据监控
image 对象实现页面访问统计在ua.js中的调用逻辑
image对象实现页面访问统计的函数ytq在ua.js中仅被函数c5k调用,我们由下表可以看出函数c5k在ua.js中的调用逻辑。c5k函数分为周期性调用和事件驱动性调用。周期性调用的时间由isvz[“SendTimer”]决定,事件驱动性调用在每次鼠标或键盘事件时会判断回传给服务器的数据的大小,当数据达到指定大小时将调用c5k将数据回传给服务器。
image 对象实现页面访问统计的信息类型
要知道ua.js通过image对象实现统计的信息类型,我们必须要来看一看c5k函数的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
c5k = function (s63) { //zin未被赋值时,该函数不执行 //zin = ivsz ["ImgUrl"]; if (!zin) {//该变量在执行load函数后就会被赋值 return; } if (UA_Opt["Token"]) { //var irt = ""; var t3 = irt; t3与irt均为字符串类型 t3 = UA_Opt["Token"] }; var mp4 = new upc["Array"](); //c5k(1)的调用将会执行if分支 if (typeof s63 != "undefined" & !ij) { //从load事件开始,记录c5k函数被调用的次数 fv59 += 1; mp4["push"](s63);//mp4["push"](1) mp4["push"](fv59); mp4["push"](t3);////mp4["push"](UA_Opt["Token"]) mp4["push"](aq1()); mp4["push"](xu); xu = new ere["Array"](); var wz1 = lbet(mp4,0); ytq(zin, wz1); ij = !(0x3e8 * 0144 & 85);//ij=1 } else if (xu["length"] > 0) { fv59 += 1; mp4["push"](0);//c5k函数的调用类型:c5k() mp4["push"](fv59);// mp4["push"](t3);//mp4["push"](UA_Opt["Token"]) mp4["push"](aq1());//时间戳 mp4["push"](xu); xu = new upc["Array"](); var wz1 = lbet(mp4, 0); ytq(zin, wz1); } }; aq1 = function () { var k6n = function (er3k) { var sk2 = 31; i = 0, isr = er3k["length"]; while (i < isr) { sk2 ^= (sk2<<5) + (sk2>>2) + er3k["charCodeAt"](i++); } return sk2; }; //当前时间 : 六位随机数 + 当前网页链接的URI编码 return k6n(new ere["Date"]()["getTime"]() + ":" + ere["Math"]["floor"](or["Math"]["random"]() * 999999) + ere["encodeURI"](upc["location"]["href"])); };//aq1 |
由以上代码可知,ua.js每一次通过image对象像服务器发送的数据类型包含:
1.c5k的调用类型。当前页面被刷新或关闭时,调用类型为c5k(1),其他均为c5k()。
2.c5k的调用次数。该调用次数仅在DOM加载完成时清零一次,在c5k每一次调用都会累加,直到关闭当前访问页面。
3.UA_Opt[“Token”]。
4.c5k的调用时间和当前访问页面的URL;
5.变量xu存储着从DOM加载完成到本次调用c5k时,ua.js收集到的所有的用户访问信息,这些信息会作为image的URL回传至服务器。
学习了vq4和wql之后,我们就知道在load事件中获取的固定信息,鼠标键盘等事件获取的访问轨迹信息不仅会参与生成UA,还会回传至服务器。
文章对我有很大的感悟真心谢谢博主