Simple snippet of jQuery code to create a clickable anything without breaking middle-click
If you’ve ever made something like a directory listing or supposedly clickable items in a table, you’ve no doubt experienced the need to make entire table rows clickable. The following snippet of code will not only take care of that, but it will also turn anything – literally anything! – into something clickable. Here comes the kicker: it makes things clickable as if they are a normal hyperlink, without being in the way of habits like middle-clicking. It uses a data attribute and simple classes to keep your markup clean.
When you click on one of these elements with your middle mouse button, it will open the target URL in a new tab or page, just like a hyperlink would. This means that the common issue where certain elements replace the current page when middle-clicking (whereas the user would expect them to open in a new tab), no longer occurs.
It also allows you to specify external links – these will be opened in a new tab or window (depending on user settings) regardless of whether they are left-clicked or middle-clicked. Here comes the code:
$(document).ready(function() { $('.clickable').click(function(event) { if($(this).data('url')) { url = $(this).data('url'); if(event.which == 1) { if($(this).hasClass('external')) { window.open(url); } else { window.location = url; } } else if(event.which == 2) { window.open(url); } } }); });
Here’s how you use it for an internal link:
<tr class="clickable" data-url="http://www.targetsite.com/targetpage.html">
<td>Some content goes here.</td>
<td>Another cell of content goes here.</td>
</tr>
Here’s how you use it for an external link (note the extra class!):
<tr class="clickable external" data-url="http://www.externalsite.com/targetpage.html">
<td>Some (external) content goes here.</td>
<td>When you click this row, it will send you to an external page in a new tab.</td>
</tr>
Obligatory warning: do not use this for normal hyperlinks! This solution requires Javascript, and you should never rely on something that uses Javascript unless there is no other option. If you can use a normal hyperlink without breaking your document validity, then use that option!
What if you want your table row to also be clickable to users without Javascript? While not a perfect solution, an acceptable fallback is putting the text in the most important table cell, in an <a> element. This way there is at least something that users without Javascript can click. This approach will not conflict with the above snippet of code.