Respostas:
Você tem duas maneiras de fazer isso:
Usando javascript:
<tr onclick="document.location = 'links.html';">
Usando âncoras:
<tr><td><a href="">text</a></td><td><a href="">text</a></td></tr>
Eu fiz o segundo trabalho usando:
table tr td a {
display:block;
height:100%;
width:100%;
}
Para se livrar do espaço morto entre as colunas:
table tr td {
padding-left: 0;
padding-right: 0;
}
Aqui está uma demonstração simples do segundo exemplo: DEMO
Eu criei uma função jquery personalizada:
<tr data-href="site.com/whatever">
$('tr[data-href]').on("click", function() {
document.location = $(this).data('href');
});
Fácil e perfeito para mim. Espero que ajude você.
(Eu sei que OP quer CSS e HTML apenas, mas considere jQuery)
Acordado com Matt Kantor usando dados Attr. Resposta editada acima
data-href
ou algo assim.
<table class='tr_link' >
e dê .tr_link{cursor:pointer}
em css para melhor uso.
tr[data-href] { cursor: pointer }
às suas folhas de estilo
Se você estiver em um navegador compatível, poderá usar CSS para transformar o <a>
em uma linha de tabela:
.table-row { display: table-row; }
.table-cell { display: table-cell; }
<div style="display: table;">
<a href="..." class="table-row">
<span class="table-cell">This is a TD... ish...</span>
</a>
</div>
Claro, você está limitado a não colocar elementos de bloco dentro do <a>
. Você também não pode misturar isso com um normal<table>
Se você tiver que usar uma tabela, pode colocar um link em cada célula da tabela:
<table>
<tbody>
<tr>
<td><a href="person1.html">John Smith</a></td>
<td><a href="person1.html">123 Fake St</a></td>
<td><a href="person1.html">90210</a></td>
</tr>
<tr>
<td><a href="person2.html">Peter Nguyen</a></td>
<td><a href="person2.html">456 Elm Ave</a></td>
<td><a href="person2.html">90210</a></td>
</tr>
</tbody>
</table>
E faça com que os links preencham todas as células:
table tbody tr td a {
display: block;
width: 100%;
height: 100%;
}
Se você puder usar <div>
s em vez de uma tabela, seu HTML pode ser muito mais simples e você não obterá "lacunas" nos links, entre as células da tabela:
<div class="myTable">
<a href="person1.html">
<span>John Smith</span>
<span>123 Fake St</span>
<span>90210</span>
</a>
<a href="person2.html">
<span>Peter Nguyen</span>
<span>456 Elm Ave</span>
<span>90210</span>
</a>
</div>
Aqui está o CSS que acompanha o <div>
método:
.myTable {
display: table;
}
.myTable a {
display: table-row;
}
.myTable a span {
display: table-cell;
padding: 2px; /* this line not really needed */
}
A maneira usual é atribuir algum JavaScript ao onClick
atributo do TR
elemento.
Se você não pode usar JavaScript, deve usar um truque:
Adicione o mesmo link a cada uma TD
das mesmas linhas (o link deve ser o elemento mais externo da célula).
Transforme links em elementos de bloco: a { display: block; width: 100%; height: 100%; }
O último forçará o link a preencher toda a célula, portanto, clicar em qualquer lugar invocará o link.
Você não pode envolver um <td>
elemento com uma <a>
tag, mas pode realizar uma funcionalidade semelhante usando o onclick
evento para chamar uma função. Um exemplo é encontrado aqui , algo como esta função:
<script type="text/javascript">
function DoNav(url)
{
document.location.href = url;
}
</script>
E adicione-o à sua mesa assim:
<tr onclick="DoNav('http://stackoverflow.com/')"><td></td></tr>
A resposta de sirwilliam me cabe melhor Melhorei o Javascript com suporte para tecla de atalho Ctrl + LeftClick (abre página em nova aba). O evento ctrlKey
é usado por PCs, metaKey
por Mac.
Javascript
$('body').on('mousedown', 'tr[url]', function(e){
var click = e.which;
var url = $(this).attr('url');
if(url){
if(click == 2 || (click == 1 && (e.ctrlKey || e.metaKey))){
window.open(url, '_blank');
window.focus();
}
else if(click == 1){
window.location.href = url;
}
return true;
}
});
Exemplo
Sei que esta pergunta já foi respondida, mas ainda não gosto de nenhuma solução nesta página. Para as pessoas que usam JQuery, fiz uma solução final que permite dar à linha da tabela quase o mesmo comportamento da <a>
tag.
Esta é a minha solução:
jQuery Você pode adicionar isso, por exemplo, a um arquivo javascript incluído padrão
$('body').on('mousedown', 'tr[url]', function(e){
var click = e.which;
var url = $(this).attr('url');
if(url){
if(click == 1){
window.location.href = url;
}
else if(click == 2){
window.open(url, '_blank');
window.focus();
}
return true;
}
});
HTML Agora você pode usar isso em qualquer <tr>
elemento dentro do seu HTML
<tr url="example.com">
<td>value</td>
<td>value</td>
<td>value</td>
<tr>
document.querySelector('tr[url]').addEventListener("mousedown", function(e){ var click = e.which; var url = this.getAttribute("url"); if(url){ if(click == 1){ window.location.href = url; } else if(click == 2){ window.open(url, '_blank'); window.focus(); } return true; } });
Quando quero simular um <tr>
com um link mas respeitando os padrões html, faço isso.
HTML:
<table>
<tr class="trLink">
<td>
<a href="#">Something</a>
</td>
</tr>
</table>
CSS:
tr.trLink {
cursor: pointer;
}
tr.trLink:hover {
/*TR-HOVER-STYLES*/
}
tr.trLink a{
display: block;
height: 100%;
width: 100%;
}
tr.trLink:hover a{
/*LINK-HOVER-STYLES*/
}
Desta forma, quando alguém passa com o mouse em um TR, toda a linha (e esses links) fica com o estilo pairar e ele não consegue ver que existem vários links.
Espero que possa ajudar alguém.
Fiddle AQUI
//Style
.trlink {
color:blue;
}
.trlink:hover {
color:red;
}
<tr class="trlink" onclick="function to navigate to a page goes here">
<td>linktext</td>
</tr>
Algo nesse sentido, talvez? Embora use JS, mas essa é a única maneira de tornar uma linha (tr) clicável.
A menos que você tenha uma única célula com uma marca de âncora que preencha toda a célula.
E então, você não deveria usar uma mesa de qualquer maneira.
Depois de ler este tópico e alguns outros, descobri a seguinte solução em javascript:
function trs_makelinks(trs) {
for (var i = 0; i < trs.length; ++i) {
if (trs[i].getAttribute("href") != undefined) {
var tr = trs[i];
tr.onclick = function () { window.location.href = this.getAttribute("href"); };
tr.onkeydown = function (e) {
var e = e || window.event;
if ((e.keyCode === 13) || (e.keyCode === 32)) {
e.preventDefault ? e.preventDefault() : (e.returnValue = false);
this.click();
}
};
tr.role = "button";
tr.tabIndex = 0;
tr.style.cursor = "pointer";
}
}
}
/* It could be adapted for other tags */
trs_makelinks(document.getElementsByTagName("tr"));
trs_makelinks(document.getElementsByTagName("td"));
trs_makelinks(document.getElementsByTagName("th"));
Para usá-lo colocar o href em tr / td / th que você deseja ser clicável como: <tr href="http://stackoverflow.com">
. E certifique-se de que o script acima seja executado após o elemento tr ser criado (por sua colocação ou usando manipuladores de eventos).
A desvantagem é que isso não fará com que os TRs se comportem totalmente como links como divs com Edit: Eu fiz a navegação do teclado funcionar definindo onkeydown, role e tabIndex, você poderia remover essa parte se apenas o mouse fosse necessário. Eles não mostrarão a URL na barra de status ao passar o mouse.display: table;
, e eles não serão selecionáveis pelo teclado ou terão texto de status.
Você pode estilizar especificamente o link TRs com o seletor CSS "tr [href]".
Eu tenho outro jeito. Especialmente se você precisar postar dados usando jQuery
$(document).on('click', '#tablename tbody tr', function()
{
var test="something";
$.post("ajax/setvariable.php", {ID: this.id, TEST:test}, function(data){
window.location.href = "http://somepage";
});
});
Set variable configura variáveis em SESSIONS nas quais a página que você está indo pode ler e agir.
Eu realmente gostaria de uma forma de postar direto para um local de janela, mas não acho que seja possível.
Você pode adicionar uma tag A à linha?
<tr><td>
<a href="./link.htm"></a>
</td></tr>
É isso que você está perguntando?