jQuery: Cliquez suivi avec PHP
-
19-09-2019 - |
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?
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?
Peut-être que cela vous aidera à: http: // www.digitalistic.com/2009/09/16/click-tracking-with-jquery/ Prenez regarder celui-ci aussi: http://think2loud.com/use-jquery-with-google-analytics-to-track-clicks-on-outgoing-links-from-your-site/