一个数据统计的项目总结——JavaScript部分
其实这个项目中我负责的JS就只有一个,而且我也就只花了半小时就完成第一版。但是后续在生成环境里的调试却花费了两周。。
此JS的作用类似于Google Analytics里的 ga.js,是网站流量监测的数据来源。
故需要先简单解释一下网站流量监测的方法:
在目标网站的需要被监测的页面中执行一段js,这段js加载完毕后自动运行,它可以读取到很多值,如我们最关心的 Referrer Page,当然那些Page title, Page URL, User-Agnet, Screen size等等就更不在话下了。当这些属性都获取后,向监测服务器发送一个GET请求(一般是一个1×1的小图片),把获取的值以参数的形式传递过去。同时再在Cookie里记录一些必要的值。
非常简单,对吧。
生产环境的问题是,我们的数据非常不准——少很多,有相当数据丢失了:
对小图片的请求数大概只有对JS文件请求的60%,实际上他们应该差不多才对的
于是又在页面上加入了其它几个第三方工具,对比结果显示的确有问题
自己折腾了一周,完全无果。只是发现了img对象的一个表现是只要赋上src,浏览器就会直接去请求图片,各浏览器的表现全部这样。
我想大概是思维受限了,于是上网求助。
又经过一番折腾,加上网友提示,终找到核心问题所在——被监测网站服务器网速不够。当然我们的监测服务器网速也可能不够。
所以解决办法是:
- 将引用js的script标签从页面底部移到head标签内
- JS加载完马上执行对应方法,不等document.onload完成(实际上我第一回写的时候是这么整的)
- 不再把图片往document.body上添加,但为了防止被浏览器垃圾回收,需要放到window对象内(网友的方法)
最后问题完美解决。写这篇日志的原因是,这种问题,没遇上的话没半点事,一旦遇上却很难找到问题的根源。
附上代码:
(function(){
function initData(){xxx;}
function submit(){
var img = new Image();
var id = "tracker-img";
img.id = id;
img.onload = img.onerror = img.onabort = function() { window[id] = undefined; };
window[id] = img; // 避免img对象被浏览器垃圾回收了
img.src = "http://www.sample.com/1.gif?" + params;
}
initData();
submit();
})()
内部测试时没有发现问题是因为内网的网络足够的快,而放公网后自己依旧测不出问题也是因为网络够好。
抱怨一下,真尼马天朝真是够苦逼啊:交着全世界数一数二的贵网费,享受着与之完全不匹配的带宽,上外网被墙,上内网也是小水管。
| anyShare分享到: | |
| |