Is it possible to wrap entire table rows in <a>
tags? I want the the entire row to be a clickable link.
If I try the following, the links get rendered above and outside the table:
This:
<table>
<a href="value_url"><tr><td>value</td><td>value</td></tr></a>
<a href="value_url"><tr><td>value</td><td>value</td></tr></a>
</table>
Renders like this:
<a href="value_url"></a>
<a href="value_url"></a>
<table>
<tr><td>value</td><td>value</td></tr>
<tr><td>value</td><td>value</td></tr>
</table>
as a link in each td is not a good alternative and using js is a bit dirty, here is another html/css approach:
HTML:
CSS:
It renders like that because the browser is respecting the W3C specification and only allowing
<tr>
tags as direct descendents of<table>
.As a solution, you could either put an
<a>
tag inside each<td>
that points to the same URL:Or you could bind an
onClick
handler to the<tr>
with JavaScript. A jQuery example would be this:Or, even better, use delegated events (jQuery 1.7+):
Why you don't want to make click event on
tr
? It's not possible to have anchor tag like you want so you can make click event and add aditional CSS for making it to look like anchor.Jquery:
Just in additional to others I have to add that I personnaly prefer to do like this
in case of ASP.NET MVC do it like
It's invalid HTML to have any elements other than
thead
,tbody
ortfoot
as a direct child of atable
, and those elements have onlytr
as their valid children.Any other content must be inside of a
td
orth
to be valid.What you're seeing is the browser restructuring your DOM so that it's as valid as it can be. The problem with relying on that behaviour though is that different browsers react in different ways.
If you need a
tr
to be interactive (and for clicks on those elements to lead somewhere/do something) you should use JavaScript.But, short answer, yes you can do it, but it's not valid to do so, so please don't.
For interactive table rows, though, one solution (in plain JavaScript):
JS Fiddle demo.
(Which, obviously, requires that the
tr
elements have adata-url
attribute to specify where they should link to.)Another simple, CSS only solution is turning
<a>
into block elementsThe CSS would be:
Then the
<a>
would take up the entire<td>
, and making entire row clickable without JS if the link is repeated for each cell in a row.https://jsfiddle.net/evwa451n/