jQuery:用PHP单击跟踪

jQuery:用PHP单击跟踪,php,jquery,click-tracking,Php,Jquery,Click Tracking,是的,我知道谷歌分析。我们使用它来衡量网站的整体质量,我知道我们可以跟踪单个链接。但是,我们需要一个针对特定链接的跟踪解决方案,我们需要实时跟踪web应用程序可用的数据,因此我编写了自己的解决方案: jQuery: $.fn.track = function () { var source, url, name, ref, $this; $this = $(this); if (window.location.search.substring(1) != '') {

是的,我知道谷歌分析。我们使用它来衡量网站的整体质量,我知道我们可以跟踪单个链接。但是,我们需要一个针对特定链接的跟踪解决方案,我们需要实时跟踪web应用程序可用的数据,因此我编写了自己的解决方案:

jQuery:

  $.fn.track = function () {
    var source, url, name, ref, $this;
    $this = $(this);
    if (window.location.search.substring(1) != '') {
      source = window.location.pathname + "?" + window.location.search.substring(1);
    } else {
      source = window.location.pathname;
    }
    url = jQuery.URLEncode($this.attr('href'));
    name = $this.attr('name');
    ref = jQuery.URLEncode(source);
    $this.live('click', function (click) {
      click.preventDefault();
      $.post('/lib/track.php', {
        url: url,
        name: name,
        ref: ref
      }, function () { window.location = $this.attr('href'); });
    });
  };
。。。使用jQuery URLEncode插件()

现在,这段代码在我的PHP后端和我的机器上都可以正常工作,但它似乎不能可靠地为其他所有人工作。有时通过jQuery传入的参数没有传入,导致数据库中的记录没有
名称
url
参考

就我的一生而言,我不明白为什么会发生这种事;我知道会触发
$.post
,因为数据库中有记录(在PHP中,我也会记录请求的IP和时间戳),但在许多情况下,PHP脚本会从jQuery接收空白的
$\u post
变量

我在工作场所的每一个浏览器上都对它进行了现场测试,所有这些浏览器对我来说都很好;然而,大约75%的所有创建的记录(不是由我的计算机创建的)都是空白的(大多数记录都使用与我相同的浏览器)

为什么会发生这种情况?

这些“点击”可能来自机器人,或者来自禁用JS的人。如果你点击的链接必须被跟踪,为什么不考虑JS唯一的链接,例如,将URL放在不同于HREF之外的TART中,然后使用你的点击处理程序来处理它,在你的轨道中添加推荐检查。
你也检查过所有元素是否都是链接了吗?

我想,最后我的问题是,jQuery解析请求的时间太长了,我非常坚决不想让链接“依赖”javascript(要么他们没有它就无法工作,要么用户必须等待跟踪请求完成后才能进入新页面)

在浏览了许多其他在线解决方案之后——借鉴了一些解决方案并受到了其他解决方案的启发——我用本机javascript找到了以下解决方案:

if (document.getElementsByClassName === undefined) { // get elements by class name, adjusted for IE's incompetence
    document.getElementsByClassName = function(className) {
      var hasClassName, allElements, results, element;

        hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
        allElements = document.getElementsByTagName("*");
        results = [];

        for (var i = 0; (element = allElements[i]) !== null; i++) {
            var elementClass = element.className;
            if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass)) {
                results.push(element);
            }
        }

        return results;
    };
}

function addTracker(obj, type, fn) { // adds a tracker to the page, like $('xxx').event
  if (obj.addEventListener) {
    obj.addEventListener(type, fn, false);
  } else if (obj.addEventListener) {
    obj['e' + type + fn] = fn;
    obj[type + fn] = function() {
      obj['e' + type + fn]( window.event );
    };
    obj.attachEvent('on' + type, obj[type + fn]);
  }
}

function save_click(passed_object) { // this function records a click
  var now, then, path, encoded, to, from, name, img;

  now = new Date();
  path = '/lib/click.php';
  from = (window.decode) ? window.decodeURI(document.URL) : document.URL;
  to = (window.decodeURI) ? window.decodeURI(passed_object.href) : passed_object.href;
  name = (passed_object.name && passed_object.name != '') ? passed_object.name : '[No Name]';

  // timestamp the path!
  path += '?timestamp=' + now.getTime();

  path += '&to=' + escape(to) + '&from=' + escape(from) + '&name=' + name; // compile the path with the recorded information
  img = new Image();
  img.src = path; // when we call the image, we poll the php page; genius!

  while (now.getTime() < then) {
    now = new Date(); // resets the timer for subsequent clicks
  }
}

function get_targeted_links(target) { // finds targeted elements and wires them up with an event handler
  var links, link;
  if (document.getElementsByClassName) {
    links = document.getElementsByClassName(target);
    for (var i = 0; i < links.length; i++) {
      link = links[i];
      if (link.href) {
        addTracker(links[i], 'mousedown', save_click(links[i])); 
      }
    }
  }
}

addTracker(window, 'load', get_targeted_links('trackit'));
if(document.getElementsByClassName==undefined){//get-elements-by-class-name,针对IE的无能进行了调整
document.getElementsByClassName=函数(类名){
变量hasClassName、等位基因、结果、元素;
hasClassName=newregexp((?:^ | \\s)“+className+”(?:$| \\s)”);
Allegements=document.getElementsByTagName(“*”);
结果=[];
对于(变量i=0;(元素=等位基因[i])!==null;i++){
var elementClass=element.className;
if(elementClass&&elementClass.indexOf(className)!=-1&&hassclassname.test(elementClass)){
结果:推(元素);
}
}
返回结果;
};
}
函数addTracker(obj,type,fn){//向页面添加一个跟踪器,如$('xxx')。事件
if(对象添加列表器){
obj.addEventListener(类型,fn,false);
}else if(对象添加列表器){
obj['e'+类型+fn]=fn;
obj[type+fn]=函数(){
obj['e'+类型+fn](window.event);
};
对象附件('on'+类型,对象[type+fn]);
}
}
函数save\u click(传递的对象){//此函数记录单击
var now,then,path,encoded,to,from,name,img;
现在=新日期();
path='/lib/click.php';
from=(window.decode)?window.decodeURI(document.URL):document.URL;
to=(window.decodeURI)?window.decodeURI(passed_object.href):passed_object.href;
name=(传递的_object.name&&passed_object.name!=“传递的”?“传递的_object.name:“[没有名称]”;
//给路径加时间戳!
path+='?timestamp='+now.getTime();
path+='&to='+escape(to)+'&from='+escape(from)+'&name='+name;//用记录的信息编译路径
img=新图像();
img.src=path;//当我们调用图像时,我们轮询php页面;genius!
while(now.getTime()
…这似乎比我上面写的jQuery插件要快得多,到目前为止,它的速度已经足够快,可以跟踪我抛出的所有请求

希望这能帮助其他人!

也许这会帮助你:
再看看这个:

是的,到目前为止,我只测试了一个元素,它是一个具有所有正确属性的链接。因为要访问这个链接,必须登录到该站点,我不认为它可能是机器人;我承认我很难相信我们75%的用户都在浏览SAN Javascript。我不确定我理解你的意思不过,你能解释一下吗?很明显,你在这个解决方案上投入了一些时间,但以防万一;你见过Mixpanel吗?撇开成本不谈,它正是你想要做的。。。