Frage

Ja, ich KENNE Google Analytics.Wir verwenden es für unsere gesamten Website-Metriken und ich weiß, dass wir einzelne Links verfolgen können.Wir brauchten jedoch eine Tracking-Lösung für sehr spezifische Links und wir benötigen diese Tracking-Daten, die für unsere Webanwendung verfügbar sind in Echtzeit, also habe ich meine eigene Lösung geschrieben:

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

...mit dem jQuery URLEncode-Plugin (http://www.digitalbart.com/jquery-and-urlencode/).

Nun funktioniert dieser Code gut mit meinem PHP-Backend und auf meinem Rechner, aber er scheint bei allen anderen nicht zuverlässig zu funktionieren.Manchmal werden die über jQuery übergebenen Parameter NICHT übergeben, was zu einem Eintrag in der Datenbank mit Nr. führt name, url oder ref.

Ich kann mir beim besten Willen nicht vorstellen, warum das passieren könnte;Ich kenne das $.post wird ausgelöst, da Datensätze in der Datenbank vorhanden sind (im PHP zeichne ich auch die IP der Anfrage zusammen mit dem Zeitstempel auf), aber in vielen Fällen empfängt das PHP-Skript leer $_POST Variablen aus jQuery.

Ich habe es live in jedem Browser getestet, auf den ich an meinem Arbeitsplatz Zugriff habe, und alle funktionieren bei mir einwandfrei.Allerdings sind etwa 75 % aller (nicht von meinen Computern) erstellten Datensätze leer (die meisten verwenden dieselben Browser wie ich).

Warum könnte das passieren?

War es hilfreich?

Lösung

Ich denke 'Ich arbeite nicht ohne es oder dass der Benutzer auf die Verfolgung des Tracking -Antrags warten müsste, bevor er auf die neue Seite drücke).

Nachdem ich viele andere Lösungen online durchsucht hatte-von einigen von einigen und von anderen inspiriert wurde-kam ich zu der Lösung unten in nativem JavaScript an:

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

... was viel schnappiger zu sein scheint als das jQuery -Plugin, das ich oben geschrieben hatte, und war bisher schnell genug, um alle Anfragen zu verfolgen, die ich darauf gestellt habe.

Hoffe das hilft jemand anderem!

Andere Tipps

Diese „Klicks“ könnten von Bots oder jemandem mit deaktiviertem JS stammen.Wenn die angeklickten Links nachverfolgt werden müssen, warum betrachten Sie dann nicht nur JS-Links, d. h.Fügen Sie die URL in ein anderes Attribut als href ein, verwenden Sie dann Ihren Click-Handler, um sie zu verarbeiten, und fügen Sie eine Verweisprüfung in Ihrer track.php hinzu

Haben Sie auch überprüft, ob alle Elemente Links sind?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top