使用新的Image()。src进行点击跟踪

时间:2010-04-26 19:32:35

标签: javascript

我试图弄清楚为什么这个点击跟踪器无法正常工作。代码是由另一个开发人员编写的,所以我不完全确定这是否有用。

function trackSponsor(o, p) {
        (new Image()).src = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date()));
    return false;
}

从我可以收集到的是,当调用此函数时,它“创建一个新图像”以异步方式触发php脚本。根据Firebug的说法,这个请求已经被“中止”了大约30毫秒。奇怪的是,无论浏览器是什么,它有时会像每10个中的1个一样工作。

我宁愿修复它,以便它可以工作,而不是将其重写为ajax请求。

感谢任何帮助。

提前致谢。

修改

因为tvanfosson的帖子让我思考。我已经在下面添加了一个调用点击跟踪器的行。

<a onclick="trackSponsor(60, 15077); goToNextStep(1988, 15077, 0); return false;" href="#">view</a>

goToNextStep()实际上会更改页面。我的印象是它只会在trackSponsor()完成后执行。

4 个答案:

答案 0 :(得分:1)

使用jQuery重写为get请求实际上非常简单。重写它肯定会帮助下一个开发人员了解正在发生的事情,并可能解决您的问题。我需要更多地了解变量的内容 - 也许他们需要urlEncoded? - 在我能帮助你之前。您可以尝试urlEncoding他们,看看会发生什么。

function trackSponsor(o, p) {
    var url = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date()));
    $.get(url); 
    return false; 
}

编辑:您可能希望在调用触发跟踪的事件时检查另一个处理程序是否未将浏览器重定向到新位置。这将中止页面上的任何待处理请求 - 并且可能允许少数成员根据请求的时间成功以及是否在卸载页面之前传递结果。

答案 1 :(得分:1)

“(new Image())。src = url;”只是要求浏览器点击网址。 您应该延迟50-100毫秒,以确保将跟踪信息发送到服务器。

function delay(a) {
  for (var b = +new Date, c = 1; 0 < c; c++) {
    if (0 == c % 1E3) {
      var e = +new Date;
      if (b > e) break;
      if (e - b > a) break;
    }
  }
}
function trackSponsor(o, p) {
  (new Image()).src = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date()));
  delay(100);
  return false;
}

答案 2 :(得分:0)

我探讨了谷歌分析'ga.js,它使用与您的脚本类似的new Image()方法。

我能看到的唯一区别在于如何创建对象。 Google的脚本将对象分配给变量。

var d=new Image(1,1);d.src=f;

也许给那个镜头?

function trackSponsor(o, p) {    
        var i = new Image(1,1);
        i.src = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date()));    
    return false;    
}

不应该有所作为,但值得一试。

答案 3 :(得分:0)

也许试试这个,以避免垃圾收集使您的日志不会丢失。

var sendLog = (function () {
    var _unique = (function () {    /* 产生唯一标识*/
        var time = (new Date()).getTime() + '_',
            i = 0;

        return function () {
            return time + (i++);
        }
    }());

    var run = function (url) {
        var data = window['imgLogData'] || (window['imgLogData'] = {}),
            img = new Image(),
            uid = _unique();

        data[uid] = img;    /* 防止img被垃圾处理*/

        img.onload = img.onerror = function () {    /* 成功或失败后销毁对象*/
            img.onload = img.onerror = null;
            img = null;
            delete data[uid];
        };

        img.src = url + '&_cache=' + uid;   /* 发送统计内容*/
    };

    return run;
}());


sendLog('http://log_');