Estou usando o Bootstrap e o seguinte não funciona:
<tbody>
<a href="#">
<tr>
<td>Blah Blah</td>
<td>1234567</td>
<td>£158,000</td>
</tr>
</a>
</tbody>
html
html-table
bootstrap-4
user1038814
fonte
fonte
Respostas:
Nota do autor I:
Por favor, olhe para outras respostas abaixo, especialmente aquelas que não usam jquery.
Nota do autor II:
Preservada para a posteridade, mas com certeza a abordagem errada em 2020. (Não era idiomática mesmo em 2017)
Resposta original
Você está usando o Bootstrap, o que significa que está usando o jQuery: ^); portanto, uma maneira de fazer isso é:
É claro que você não precisa usar href ou mudar de local; pode fazer o que quiser na função manipulador de cliques. Leia sobre
jQuery
e como escrever manipuladores;A vantagem de usar uma classe sobre o ID é que você pode aplicar a solução a várias linhas:
e sua base de códigos não muda. O mesmo manipulador cuidaria de todas as linhas.
Outra opção
Você pode usar retornos de chamada do Bootstrap jQuery como este (em um
document.ready
retorno de chamada):Isso tem a vantagem de não ser redefinido na classificação da tabela (o que acontece com a outra opção).
Nota
Uma vez que este foi publicado,
window.document.location
é obsoleto (ou descontinuado, no mínimo)window.location
.fonte
href
atributo atr
, pois não é um atributo válido para este elemento. Use atributos de dados:data-url="{linkurl}"
e no código js:$(this).data('url')
clickable_row
(CamelCase é contra os padrões HTML e deve estar em letras minúsculas (tive problemas com vários navegadores algumas vezes com isso)) e o jQuery é$('.clickable_row tr').click(function ...
But realmente você deve usardata-
para armazenar dados, em vez dehref
já que essa é a especificação para dados personalizados.data-url
e jQuery vai acessá-lo como$(this).data(url);
a
tagdisplay: block;
dentro de cada célula é um pouco chato, mas parece a maneira mais útil de resolver esse problema.Você não pode fazer isso. É HTML inválido. Você não pode colocar um
<a>
entre a<tbody>
e a<tr>
. Tente isso:adicionar estilo para a visualização do ponteiro
Ao trabalhar com isso, você deseja usar o JavaScript para atribuir o manipulador de cliques fora do HTML.
fonte
<a>
dentro da linha clicada. (que também degrada graciosamente)onClick={() => window.open('https://stackoverflow.com/', '_blank')}
Você pode incluir uma âncora dentro de cada
<td>
, assim:Você pode usar
display:block;
as âncoras para tornar a linha completa clicável.Exemplo jsFiddle aqui.
Provavelmente, isso é o melhor possível, a menos que você recorra ao JavaScript.
fonte
tabindex="-1"
tudo, exceto o primeiro<td>
link, para que o usuário tabule linha por linha, não célula por célula. Além disso, você ainda pode destacar / delinear a linha inteira se desejar usar a:focus-within
pseudo classe CSS.Uma linha de tabela vinculada é possível, mas não com os
<table>
elementos padrão . Você pode fazer isso usando asdisplay: table
propriedades de estilo. Aqui e aqui estão algumas violações para demonstrar.Este código deve fazer o truque:
Observe que as funções do ARIA são necessárias para garantir a acessibilidade adequada, pois os
<table>
elementos padrão não são usados. Pode ser necessário adicionar funções adicionais, comorole="columnheader"
se aplicável. Saiba mais no guia aqui.fonte
/
chave no Firefox), navegação (tab
chave), localização do link de cópia, abrir em uma nova aba / janela, etc. mesmo para acessíveis / especiais precisa de navegadores. Meu único argumento é que eu não aninharia um<div>
dentro de um<a>
, para que as células fiquem melhor marcadas como<span>
._tables.scss
e algumas outras partes aleatórias, substituindo todas as ocorrências de elementos da tabela pelas classes CSS que eu escolhi usar (que são simplesmente as mesmas que os elementos:th
→.th
) Não há muito trabalho comparado aos benefícios, realmente .<table>
existe por um motivo. Mas isso ainda bate qualquer solução javascript :)Conseguido usando o Bootstrap 4.3+ padrão da seguinte maneira - não é necessário jQuery nem nenhuma classe extra de CSS!
A chave é usar
stretched-link
no texto dentro da célula e definir<tr>
como um bloco contendo.Você pode definir o bloco contendo de maneiras diferentes, por exemplo, definindo
transform
como valor nenhum (como no exemplo acima).Para mais informações leia aqui está a documentação Bootstrap para
stretched-link
.fonte
scope="row"
? Eu não uso o escopo e a linha ainda se comporta como um link.scope="row"
- verifique o histórico se você quiser ver o que mais pode ter sido editado. No entanto, não reverti as edições, pois o trecho de código parece funcionar (assim como o original) e não tive a chance de testar exaustivamente o novo código :-)tr
marca que não é reconhecida como as regras para o bloco que contém os navegadores ... stackoverflow.com/questions/61342248/…Uma solução muito mais flexível é direcionar qualquer coisa com o atributo data-href. Foi assim que você pode reutilizar o código facilmente em lugares diferentes.
Em seu jQuery, basta direcionar qualquer elemento com esse atributo:
E não se esqueça de estilizar seu css:
Agora você pode adicionar o atributo data-href a qualquer elemento e ele funcionará. Quando escrevo trechos como esse, gosto que eles sejam flexíveis. Sinta-se livre para adicionar uma solução vanilla js a isso, se você tiver uma.
fonte
Você pode usar este componente de autoinicialização:
http://jasny.github.io/bootstrap/javascript/#rowlink
Jasny Bootstrap
Os componentes ausentes para sua estrutura front-end favorita.
Uso
Via atributos de dados
Adicione classe
.rowlink
e atributodata-link="row"
a um<table>
ou<tbody>
elemento. Para outras opções, adicione o nome aos dados, pois emdata-target="a.mainlink"
Uma célula pode ser excluída adicionando a.rowlink-skip
classe a<td>
.Via JavaScript
Chame a máscara de entrada via javascript:
fonte
Existe uma boa maneira de fazer isso tecnicamente com a
<a>
tag interna<tr>
, que pode estar semanticamente incorreta (pode fornecer um aviso ao navegador), mas funcionará sem necessidade deJavaScript/jQuery
:PS: Observe que o truque aqui é colocar a
<a>
tag como último elemento, caso contrário, ela tentará ocupar o espaço da primeira<td>
célula.PPS: agora sua linha inteira será clicável e você pode usar este link para abrir também uma nova guia (Ctrl / CMD + clique)
fonte
<tr>
elementos não podem ter um<a>
elemento quando criança. Filhos únicos<td>
e<th>
válidos. Veja: stackoverflow.com/questions/12634715/…Você pode usar o método javascript onclick em tr e torná-lo clicável, também se precisar criar seu link devido a alguns detalhes, você pode declarar uma função em javascript e chamá-la em onclick, passando alguns valores.
fonte
Aqui está uma maneira de colocar um elemento A transparente sobre as linhas da tabela. As vantagens são:
Desvantagens:
A tabela permanece como está:
Adicione os links (para cada linha) via jQuery JavaScript, inserindo um elemento A em cada primeira coluna e definindo as propriedades necessárias:
A configuração de largura e altura pode ser complicada, se forem usados muitos preenchimentos e margens, mas, em geral, alguns pixels de distância não devem importar.
Demonstração ao vivo aqui: http://jsfiddle.net/qo0dx0oo/ (funciona no Firefox, mas não no IE ou no Chrome, o link está posicionado errado)
Corrigido para Chrome e IE (ainda funciona no FF também): http://jsfiddle.net/qo0dx0oo/2/
fonte
onmouseover
Você pode adicionar a função de botão a uma linha da tabela e o Bootstrap alterará o cursor sem nenhuma alteração no css. Decidi usar essa função como uma maneira de tornar facilmente qualquer linha clicável com muito pouco código.
Html
jQuery
Você pode aplicar esse mesmo princípio para adicionar a função do botão a qualquer tag.
fonte
Este código abaixo tornará sua tabela inteira clicável. Clicar nos links neste exemplo mostrará o link em uma caixa de diálogo de alerta em vez de seguir o link.
O HTML:
Aqui está o HTML por trás do exemplo acima:
O CSS
E o CSS:
O jQuery
E finalmente o jQuery que faz a mágica acontecer:
O que faz é quando uma linha é clicada, uma pesquisa é feita para o href pertencente a uma âncora. Se um for encontrado, o local da janela é definido para esse href.
fonte
Uma opção muito fácil é apenas usar on-click e mais correto, no meu ponto de vista, porque isso separa a view e o controller, e você não precisa codificar a URL ou o que mais precisa realizar com o click . Também funciona com ng-click angular.
Exemplo trabalhando aqui
fonte
Outra opção usando
<a>
posições CSS, e jQuery ou JS :HTML:
CSS:
Então você precisa dar a largura, usando, por exemplo, jQuery:
fonte
Eu sei que alguém já escreveu praticamente o mesmo, no entanto, meu caminho é o caminho correto (div não pode ser filho de A) e também é melhor usar classes.
Você pode imitar uma tabela usando CSS e transformar um elemento A na linha
css:
fonte
eu preferiria usar
onclick=""
atributo, pois é fácil de usar e entender para iniciantes comofonte
Aqui está a solução simples ..
fonte
A resposta aceita é ótima, mas proponho uma pequena alternativa se você não quiser repetir a URL em cada tr. Então você coloca o url ou href na tabela data-url e não o tr.
Isso também é bom porque você também não precisa adicionar o atributo de dados de clique a cada tr. A outra coisa boa é que não estamos usando uma classe para acionar um clique, pois as classes só devem ser realmente usadas para estilizar.
fonte
Uma solução que não foi mencionada anteriormente é usar um único link em uma célula e algum CSS para estender esse link pelas células:
fonte
Embora a principal solução aqui seja ótima, minha solução elimina a necessidade de aulas. Tudo que você precisa fazer é adicionar o atributo data-href com a URL nele.
fonte
Eu investi muito tempo tentando resolver esse problema.
Existem 3 abordagens:
Use JavaScript. As desvantagens claras: não é possível abrir uma nova guia nativamente e, ao passar o mouse sobre a linha, não haverá indicação na barra de status, como os links regulares têm. Acessibilidade também é uma questão.
Use apenas HTML / CSS. Isso significa colocar
<a>
aninhados em cada um<td>
. Uma abordagem simples como essa rabeca não funciona - porque a superfície clicável não é necessariamente igual para cada coluna. Esta é uma séria preocupação de UX. Além disso, se você precisar de um<button>
na linha, não é HTML válido aninha-lo em<a>
tag (embora os navegadores estejam de acordo com isso).Eu encontrei três outras maneiras de implementar essa abordagem. Primeiro está tudo bem, os outros dois não são ótimos.
a) Veja este exemplo :
Funciona, mas devido a inconsistências entre o Chrome e o Firefox, é necessário um hack específico do navegador para superar as diferenças. Além disso, o Chrome sempre alinha o conteúdo da célula ao topo, o que pode causar problemas com textos longos, especialmente se houver alturas de linha variadas.
b) Configurando
<td>
para{ display: contents; }
. Isso leva a 2 outros problemas:b1 Se alguém tentar estilizar diretamente a
<td>
tag, como configurá-la{ width: 20px; }
, precisamos passar esse estilo de alguma forma para o<a>
tag. Precisamos de alguma mágica para fazer isso, provavelmente mais mágica do que na alternativa Javascript.b2
{ display: contents; }
ainda é experimental; especificamente, não é suportado no Edge.c) Configurando
<td>
para{ height: --some-fixed-value; }
. Isso simplesmente não é flexível o suficiente.A última abordagem, que eu recomendo pensar seriamente, é não usar linhas clicáveis . Linhas clicáveis não são uma ótima experiência de experiência do usuário: não é fácil marcá-las visualmente como clicáveis e apresenta desafios quando várias partes são clicáveis nas linhas, como botões. Portanto, uma alternativa viável poderia ser ter uma
<a>
tag apenas na primeira coluna, exibida como um link regular, e atribuir a ela o papel de navegar por toda a linha.fonte
Aqui está outra maneira ...
O HTML:
O jQuery:
fonte
Substitua # pelo URL,
tabindex="0"
torne qualquer elemento focalizávelfonte
Você pode dar um ID à linha, por exemplo
<tr id="special"> ... </tr>
e então use jquery para dizer algo como:
$('#special').onclick(function(){ window="http://urltolinkto.com/x/y/z";})
fonte
Por que não devemos usar as tags "div" ....
fonte