Вопрос

Да, я ЗНАЮ о Google Analytics.Мы используем его для общих показателей сайта, и я знаю, что мы можем отслеживать отдельные ссылки.Однако нам нужно было решение для отслеживания очень конкретных ссылок, и нам нужны данные отслеживания, доступные нашему веб-приложению. в настоящее время, поэтому я написал собственное решение:

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 (http://www.digitalbart.com/jquery-and-urlencode/).

Теперь этот код отлично работает с моим сервером PHP и на моей машине, но, похоже, он не работает надежно для всех остальных.Иногда параметры, переданные через jQuery, НЕ передаются, в результате чего в базе данных появляется запись без name, url или ref.

Хоть убей, я не могу понять, почему это может происходить;Я знаю $.post срабатывает, так как в базе данных есть записи (в PHP я записываю еще и IP запроса вместе с меткой времени), но во многих случаях PHP-скрипт получает пустое сообщение $_POST переменные из jQuery.

Я протестировал его в каждом браузере, к которому у меня есть доступ на рабочем месте, и все они у меня работают нормально;однако около 75% всех записей, созданных (не на моих компьютерах), остаются пустыми (большинство из них используют те же браузеры, что и я).

Почему это могло произойти?

Это было полезно?

Решение

Я думаю, что, в конце концов, моя проблема заключалась в том, что для просьбы пробралась слишком много времени, чтобы быть проанализирована, и я довольно непреклонен о том, чтобы не хотеть делать ссылки «зависимыми» на JavaScript (либо, что они не будут Не работайте без этого или что пользователю придется ждать, пока запрос на отслеживание завершит, прежде чем он нажмет на новую страницу).

После просмотра многих других решений в Интернете-заимствовавших от некоторых и вдохновленным другими-я прибыл на решение ниже в Native 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'));

... что кажется намного более хладночным, чем плагин jQuery, который я написал выше, и до сих пор был достаточно быстр, чтобы отслеживать все запросы, которые я бросил на него.

Надеюсь, это поможет кому -то еще!

Другие советы

Эти «клики» могут исходить от ботов или от кого-то, у кого отключен JS.Если вы нажимаете ссылки, которые необходимо отслеживать, почему бы вам не рассматривать только ссылки JS, т.е.поместите URL-адрес в другой атрибут, отличный от href, затем используйте обработчик кликов для его обработки, добавьте проверку рефералов в свой track.php

Также вы проверили, все ли элементы являются ссылками?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top