Pregunta

Sí, yo SÉ acerca de Google Analytics.La usamos para nuestro sitio métricas, y sé que puede realizar el seguimiento de enlaces individuales.Sin embargo, necesitábamos una solución de seguimiento muy específicas de enlaces y necesitamos que los datos de seguimiento disponibles para nuestra aplicación web en tiempo real, así que escribí mi propia solución:

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'); });
    });
  };

...usando el jQuery URLEncode plugin (http://www.digitalbart.com/jquery-and-urlencode/).

Ahora, este código funciona muy bien con mi PHP backend y en mi máquina, pero no parece funcionar de forma fiable, para todos los demás.A veces, los parámetros que se pasa a través de jQuery NO pasa, lo que resulta en un registro en la base de datos sin name, url o ref.

Para la vida de mí, no puedo entender por qué esto podría estar sucediendo;Sé el $.post se está produciendo, desde que hay registros en la base de datos (en el PHP, yo también registrar la IP de la solicitud junto con la fecha y hora), pero en muchos casos el script de PHP que está recibiendo en blanco $_POST variables de jQuery.

Lo he probado en vivo en todos los navegadores que tengo acceso a mi lugar de trabajo, y todos ellos funcionan muy bien para mí;sin embargo, alrededor del 75% de todos los registros creados (no por mis equipos) vienen a través como en blanco (la mayoría de ellos están utilizando el mismo navegadores que lo soy).

¿Por qué puede estar sucediendo esto?

¿Fue útil?

Solución

Creo que, al final, mi problema terminó siendo que estaba tomando demasiado tiempo para que la solicitud sea analizado por jQuery, y estoy bastante inflexible acerca de no querer hacer que los enlaces "dependiente" de Javascript (ya sea que no iban a trabajar sin ella, o que el usuario tendría que esperar a que la solicitud de seguimiento se complete antes de que lleguen a la nueva página).

Después de navegar por muchas otras soluciones en línea - los préstamos de unos y de haber sido inspirado por otros - yo llegamos a la solución de abajo en javascript orígenes:

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'));

... que parece ser mucho más ágil que el plugin de jQuery que había escrito anteriormente, y hasta ahora ha sido lo suficientemente rápido para realizar un seguimiento de todas las solicitudes que he tirado en ella.

La esperanza de que ayude a alguien más!

Otros consejos

Estos "clicks" podrían venir los robots, o alguien con JS desactivados. Si los enlaces click deben ser rastreados por qué no se tiene en cuenta JS sólo enlaces, es decir. poner el URL en un attr diferente que no sea href, a continuación, utilizar el controlador de clic para procesarlo, agregar comprobación de referencia en su track.php

También Ha comprobado si todos los elementos son enlaces?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top