No JS Click Tracking
Why
Being able to track how a user interacts with your application is important for you to develop a smooth experience.
Being accessible to all environments is also important.
However, this led to a question: How do you measure interaction of a user that hasn't got JS enabled?
How
All the following techniques revolve around this single browser optimization:
it won't request an image used in CSS if it's state is not currently applicable
Using HTML elements that can maintain/change state (anchors, inputs, buttons), you can infer an interaction has occurred.
Please keep this in mind: Due to the way browsers cache the resources, each interaction will only be tracked once per session . Which means, you'll only be able to know if an action has been triggered in a certain session, not how many times it has happened.
How does it work?
Take a look at this JS Fiddle for an idea of how it works.
Requisites
- Have your own tracking gif. If you have a Google Analytics account, you could use the GA tracking gif with the proper parameters. For these examples we use a placeholder image.
- If you're already tracking using JS, mark your page with the presence or absence of JS. This is usually done with a 'js' or 'no-js' class on the HTML element. Either use Modernizr or set a 'no-js' class and remove it with JS. Restrict the below selector to '.no-js' if that's the case.
Technique #1 ( anchor + hover + active )
a:hover:active:after{
content: url(http://lorempixel.com/20/20/cats/1/?kpi1);
}
<a href="http://ink.sapo.pt" target="_blank">Click me!</a>
Pros
- Easy to use
- Can be used to track outbound links
Cons
- May trigger false positives as you can trigger a mousedown without a click (right click, mousedown on element and mouseup outside of element).
- Doesn't work on keyboard navigation.
Technique #2 ( button + focus + active )
button:focus:active:after{
content: url(http://lorempixel.com/20/20/cats/1/?kpi2);
}
<button>Click me!</button>
Pros
- Works with keyboard navigation
Cons
- May trigger false positives as you can trigger a mousedown without a click (right click, mousedown on element and mouseup outside of element)
Technique #3 ( radio button )
input:checked:after {
content: url(http://lorempixel.com/20/20/cats/1/?kpi3);
}
<input id="kpi3" type="radio" value="" />
<label for="kpi3">Click me</label>
Pros
- Works with keyboard navigation
- No false positives for the right click
Cons
- Hard to use
- Very narrow
Variant #4 ( multiple KPI )
You can use CSS3 multiple background image to pick several endpoints at once. Note that this will reduce the browser compatibility.
button:focus:active:after{
content: '';
background-image: url(http://lorempixel.com/20/20/cats/1/?kpi4), url(http://lorempixel.com/20/20/cats/1/?kpi5);
}
<button>Multiple Images!</button>
What
What can you track
- Pageviews ( using the image on the body )
- Clicks on anchors
- Clicks on buttons
- Active links (through the use of :target)
- Active form elements
- Some device metrics ( through the creative use of media-queries )
What you can't track
- How many clicks occurred
- When an element became visible on the viewport
- User info ( IP, location, referer, user agent, etc ). Although you could infer this if you control your tracking bug/gif and if you could dynamically generate the CSS server side.
When
The usability is marginal, but when you have rich CSS only components like a CSS3 slider, CSS3 Tabs or even a CSS Modal, why not have a CSS only way to track interaction as well?
Use it wisely and have fun tracking!
Written by Mario Gonçalves
Related protips
1 Response
Nice write up. Very interesting stuff.
Have a fresh tip? Share with Coderwall community!
JavaScript on a page runs with the privileges of that origin. One altered library, tag manager, or snippet can read inputs, change what people see, and call your APIs as the user.
Security insights from Cside