Question

Oui, je sais que sur Google Analytics. Nous l'utilisons pour nos indicateurs globaux du site, et je sais que nous pouvons suivre les liens individuels. Cependant, nous avons besoin d'une solution de suivi des liens très précis et nous avons besoin que les données de suivi disponibles à notre application web en temps réel , donc je l'ai écrit ma propre solution:

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

... en utilisant le plugin jQuery URLEncode ( http://www.digitalbart.com/ jquery-et-urlencode / ).

Maintenant, ce code fonctionne très bien avec mon backend PHP et sur ma machine, mais il ne semble pas fonctionner de manière fiable pour tout le monde. Parfois, les paramètres passés via jQuery sont pas passés dans, entraînant un enregistrement dans la base de données sans name, url ou ref.

Pour la vie de moi, je ne peux pas comprendre pourquoi cela pourrait se produire; Je sais que le $.post déclenche, car il y a des enregistrements dans la base de données (en PHP, j'enregistre également l'adresse IP de la demande ainsi que l'horodatage), mais dans de nombreux cas, le script PHP reçoit des des variables vides de $_POST de jQuery.

Je l'ai testé en direct sur tous les navigateurs, j'ai accès à mon lieu de travail, et tous fonctionnent très bien pour moi; Cependant, environ 75% de tous les documents créés (et non par mes ordinateurs) viennent à travers comme blanc (la plupart d'entre eux utilisent les mêmes navigateurs que je suis).

Pourquoi cela pourrait se produire?

Était-ce utile?

La solution

Je pense que, à la fin, mon problème a fini par être qu'il prenait trop de temps pour la demande à analyser par jQuery, et je suis assez catégorique de ne pas vouloir faire les liens « dépendants » javascript (soit qu'ils ne travailleraient pas sans elle ou que l'utilisateur doit attendre la demande de suivi pour terminer avant de frapper la nouvelle page).

Après avoir parcouru beaucoup d'autres solutions en ligne - empruntant certains et être inspiré par d'autres - je suis arrivé à la solution ci-dessous en javascript natif:

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

... qui semble être beaucoup plus souplement que le plugin jQuery j'avais écrit ci-dessus, et a jusqu'à présent été assez rapide pour suivre toutes les demandes que je l'ai jeté à elle.

L'espoir qui aide quelqu'un d'autre!

Autres conseils

Ces « clics » pourraient être à venir de bots, ou quelqu'un avec JS désactivé. Si vous les liens cliqués doivent être suivis pourquoi ne vous considérez pas seulement JS liens, par exemple. mettre l'URL dans une autre attr autre que href, utilisez votre gestionnaire de clic pour traiter, ajouter chèque référence dans votre track.php

ont également vous vérifié si tous les éléments sont des liens?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top