Да, я ЗНАЮ о 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% всех созданных записей (не моими компьютерами) проникают как пробел (большинство из них использует те же браузеры, которые я).
Почему это могло происходить?
Думаю, в конце концов, моя проблема оказалась, что это слишком много времени, чтобы просьба была проанализирована 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, который я написал Выше, и до сих пор было достаточно быстро, чтобы отслеживать все запросы, которые я бросил на него.
Надеюсь, что поможет кому-то еще!
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?
Возможно, это вам поможет: http://www.digitalistic.com/2009/09/16/click-tracking-with-jquery / Взгляните и на этот: http://think2loud.com/use-jquery-with-google-analytics-to-track-clicks-on-outgoing-links-from -ваш-сайт /