使用 new Image() 打点时的一个注意事项

本文源自 http://hi.baidu.com/meizz/blog/item/a0f4fc0ae9d8be1694ca6b05.html,但是不幸的是这篇文章已经不能访问了,因此我在这儿将它的要点整理一下。

网站分析中,我们经常会用 new Image() 的方式向服务器发送一条打点消息,例如:

(new Image()).src = "http://log.mysite.com/1.gif?a=1&b=2&c=xxx";

这种方式简单易用,因而被广泛采用。但上面这段代码的问题是这个 new Image() 是一个没有引用的临时变量,随时可能被浏览器的垃圾回收机制回收。如果这个图片的 HTTP 请求尚未建立,那么在被回收时这个请求就会被取消,导致打点并没有真正发出。如果打点所在的页面比较复杂,浏览器垃圾回收机制可能会被频繁触发,那么这种方式打点的丢失率可能会高达 10% 以上。

解决方法很简单,将这个图片赋值给一个全局变量即可,例如:

var img = new Image();
var rnd_id = "_img_" + Math.random();

window[rnd_id] = img; // 全局变量引用

img.onload = img.onerror = function () {
	window[rnd_id] = null; // 删除全局变量引用
}

img.src = "http://log.mysite.com/1.gif?a=1&b=2&c=xxx";
分类:编程标签:JavaScript

相关文章:

评论:

swaydeng

确实,很周到的设计。
btw,第4行的 'img' 拼错了。

oldj

果然拼错了,已更正,多谢!:)

vvg

打点主要是用来干什么?请指教

oldj

一般用来收集用户访问日志,然后从这些日志中分析用户的行为,可以参考Google Analytics之类的系统。

行骏

的确存在这个问题,曾经在alibaba.com一个流量较大的页面上做过这个实验,差值在5%左右。

关于使用JavaScript脚本记录用户鼠标点击行为 | oldj's blog

[…] img 就会被强制回收,请求也就发不出去了。关于这个问题,可以参考这个页面。比较好的做法是,先将 img 在某个全局变量中引用,等 img onload 或 onerror […]

发表评论: