jQuery: Нажмите отслеживание PHP

Да, я ЗНАЮ о 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'); });
    });
  };

... использование плагина URLEncode jQuery (http://www.digitalbart.com/jquery-and-urlencode/).

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

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

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

Почему это могло происходить?

9
задан neezer 11 December 2009 в 16:26
поделиться

3 ответа

Думаю, в конце концов, моя проблема оказалась, что это слишком много времени, чтобы просьба была проанализирована jQuery, и я довольно Adamant о том, что не хотел делать ссылки «зависимыми» на 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'));

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

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

7
ответ дан 4 December 2019 в 23:06
поделиться

These "clicks" might be coming from bots, or someone with JS disabled. If you the links clicked must be tracked why don't you consider JS only links, ie. put URL in a different attr other than href, then use your click handler to process it, add referral check in your track.php

Also have you checked if all elements are links?

0
ответ дан 4 December 2019 в 23:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: