2010-04-26 3 views
2

Je tente de comprendre pourquoi ce outil de suivi des clics ne fonctionne pas. Le code a été écrit par un autre développeur, donc je ne suis pas entièrement sûr si cela a déjà fonctionné.Utilisation de la nouvelle image() .src pour le suivi des clics

function trackSponsor(o, p) { 
     (new Image()).src = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date())); 
    return false; 
} 

De ce que je comprends est que lorsque cette fonction est appelée il crée une nouvelle image »pour tirer un script php de manière asynchrone. Selon Firebug, la requête est faite mais elle est 'avortée' ~ 30ms. La chose étrange est qu'elle fonctionnera 'parfois' comme dans 1 sur 10+ quel que soit le navigateur.

Je préfèrerais beaucoup corriger cela pour que cela fonctionne au lieu de le réécrire comme une requête ajax.

Toute aide est appréciée.

Merci d'avance.

EDIT

En raison du poste de tvanfosson qui me fait penser. J'ai inclus la ligne qui appelle le tracker de clic ci-dessous.

<a onclick="trackSponsor(60, 15077); goToNextStep(1988, 15077, 0); return false;" href="#">view</a> 

La fonction goToNextStep() modifie réellement la page. Je suis sous l'impression qu'il ne serait exécuté qu'après trackSponsor() avait fini.

+0

Ainsi, le script php échoue une fois par 10+ demandes? –

+0

@Cresent - Quoi? Personne n'a dit quoi que ce soit à propos de PHP. –

+2

@Coronatus: * Personne n'a dit quoi que ce soit à propos de PHP *: L'OP indique "quand cette fonction est appelée, elle crée une nouvelle image pour déclencher un script php". –

Répondre

1

Il est en fait assez trivial de réécrire en tant que requête get en utilisant jQuery. La réécriture aidera certainement le développeur suivant à comprendre ce qui se passe et pourrait résoudre votre problème. J'aurais besoin d'en savoir plus sur le contenu des variables - peut-être qu'elles ont besoin d'être codées en url? - avant que je puisse t'aider davantage. Vous pouvez essayer d'urlEncoding eux et voir ce qui se passe.

function trackSponsor(o, p) { 
    var url = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date())); 
    $.get(url); 
    return false; 
} 

EDIT: vous pouvez vérifier qu'un autre gestionnaire ne redirige le navigateur vers un nouvel emplacement lorsque l'événement déclencheur du suivi est invoquée. Cela annulerait toutes les demandes en attente sur la page - et pourrait permettre à quelques uns de réussir en fonction du timing des requêtes et si les résultats sont livrés avant que la page ne soit déchargée.

+0

les variables sont simplement des entiers. trackSponsor (1234, 9876); – user103219

+0

@raz - Est-il possible que ce que vous cliquez sur change réellement l'emplacement? Je vois que le retour est faux, mais peut-être y a-t-il un autre gestionnaire en train de faire une redirection et ce que vous voyez, c'est que la demande est annulée lorsque l'emplacement est remplacé? – tvanfosson

+0

Cela m'a fait réfléchir, j'ai mis à jour mon message pour inclure la ligne qui appelle réellement la fonction. – user103219

0

J'ai utilisé Google Analytics ’ ga.js, qui utilise la méthode new Image() similaire à votre script.

La seule différence que j'ai pu voir était dans la façon dont l'objet est créé. Le script de Google attribue l'objet à une variable.

var d=new Image(1,1);d.src=f; 

Peut-être que ça vous tente?

function trackSponsor(o, p) {  
     var i = new Image(1,1); 
     i.src = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date()));  
    return false;  
} 

Il ne doit pas faire une différence, mais vaut un coup de feu.

1

"(nouvelle image()). Src = url;" il suffit de demander au navigateur de frapper l'URL. Vous devez attendre 50-100 ms pour être sûr que les informations de suivi ont été envoyées au serveur.

function delay(a) { 
    for (var b = +new Date, c = 1; 0 < c; c++) { 
    if (0 == c % 1E3) { 
     var e = +new Date; 
     if (b > e) break; 
     if (e - b > a) break; 
    } 
    } 
} 
function trackSponsor(o, p) { 
    (new Image()).src = PATH_BASE + 'click/' + p + '/' + o + "?_cache=" + (+(new Date())); 
    delay(100); 
    return false; 
} 
+0

Y at-il un moyen de vérifier exactement quand l'image a été «chargée»? –

+0

La propriété complete renvoie si le navigateur a terminé de charger une image. Si l'image est chargée, la propriété complete retourne true, sinon elle renvoie false. http://www.w3schools.com/jsref/prop_img_complete.asp – ilnar

+0

Ainsi, l'achèvement de la fonction 'trackSponsor' annulerait la requête HTTP' Image' ??? –

0

Peut-être essayer ceci, pour éviter Garbage Collection pour que votre journal ne soit pas perdu.

var sendLog = (function() { 
 
    var _unique = (function() { /* 产生唯一标识*/ 
 
     var time = (new Date()).getTime() + '_', 
 
      i = 0; 
 

 
     return function() { 
 
      return time + (i++); 
 
     } 
 
    }()); 
 

 
    var run = function (url) { 
 
     var data = window['imgLogData'] || (window['imgLogData'] = {}), 
 
      img = new Image(), 
 
      uid = _unique(); 
 

 
     data[uid] = img; /* 防止img被垃圾处理*/ 
 

 
     img.onload = img.onerror = function() { /* 成功或失败后销毁对象*/ 
 
      img.onload = img.onerror = null; 
 
      img = null; 
 
      delete data[uid]; 
 
     }; 
 

 
     img.src = url + '&_cache=' + uid; /* 发送统计内容*/ 
 
    }; 
 

 
    return run; 
 
}()); 
 

 

 
sendLog('http://log_');

Questions connexes