De collega’s van marketing willen bij sommige URL’s onclick event handlers laten toevoegen die elke klik loggen bij een web analytics aanbieder. De Onclick-javascript functie haalt wat gegevens op en voegt die toe aan een request voor een -onzichtbare- image.
Mijn eerste gedacht; niet doen, de onclick wordt eerst uitgevoerd en als de request voor die image te lang duurt (op basis van onze ervaring gingen we uit van ongeveer 0,6 seconden) moet de gebruiker ook extra lang wachten op de pagina die hij/zij opvroeg (want eerst onclick en dan pas request voor de feitelijke pagina in de href). Ik leek hier ook bevestiging voor te vinden op quirksmode dus niet doen?
Dit weekend begon ik me echter af te vragen of dit wel kon kloppen; alle wordpress-blogs bijvoorbeeld, houden klikgedrag op ongeveer die manier (wel niet de traditionele onclick, maar met echte events) bij. En die web analytics aanbieder, zouden die zoiets in productie zetten als dat een probleem zou zijn? Een testje dan maar, met volgende code:
<html>
<head>
<script>
function exec_me() {
//bust cache
rnd=Math.floor(Math.random()*1000000);
url=’http://florentsmet.be/distel.jpg?n=’ + rnd;
//wait a few seconds and then fetch image
setTimeout(“loadimg(url)”,192);
}
function loadimg(url) {
//declare image
var i=new Image(1,1);
//load image
i.src=url;
}
</script>
</head>
<body>
<a href=”http://www.google.com/” onClick=”exec_me();”>gogoogle</a>
</body>
</html>
Ik ga dan in de logs van florentsmet.be (site van mijn vrouwken over haar overleden grootvader die kunstschilder was) kijken en zie dat die image in FF perfect geladen wordt als die timeout op een laag cijfer staat (onder de 190 milliseconden) en nooit als die boven die 195 ms. In MSIE lijkt 215 zo een beetje het punt tot waar dat werkt.
Is dat nu een race-condition? En hangt die dan af met welke browser je werkt? Heeft iemand hier ervaring mee, of een paar goeie links waarin dit beschreven wordt? En vooral, op basis van deze tests zou ik besluiten dat die onclick-logging van geklikte links geen probleem is. Iedereen akkoord daarmee dan?