Estoy usando Bootstrap y lo siguiente no funciona:
<tbody>
<a href="#">
<tr>
<td>Blah Blah</td>
<td>1234567</td>
<td>£158,000</td>
</tr>
</a>
</tbody>
html
html-table
bootstrap-4
usuario1038814
fuente
fuente
Respuestas:
Nota del autor I:
Mire otras respuestas a continuación, especialmente las que no usan jquery.
Nota del autor II:
Preservado para la posteridad, pero seguramente el enfoque equivocado en 2020. (No era idiomático incluso en 2017)
Respuesta original
Está utilizando Bootstrap, lo que significa que está utilizando jQuery: ^), por lo que una forma de hacerlo es:
Por supuesto, no tiene que usar href o cambiar ubicaciones, puede hacer lo que quiera en la función de controlador de clic. Siga leyendo
jQuery
y cómo escribir controladores;La ventaja de usar una clase sobre la identificación es que puede aplicar la solución a varias filas:
y su base de código no cambia. El mismo controlador se encargaría de todas las filas.
Otra opción
Puede usar las devoluciones de llamada Bootstrap jQuery de esta manera (en una
document.ready
devolución de llamada):Esto tiene la ventaja de que no se restablece al ordenar la tabla (lo que sucede con la otra opción).
Nota
Dado que esto se publicó
window.document.location
es obsoleto (o en desuso, como mínimo), usewindow.location
en su lugar.fuente
href
atributo en untr
, ya que no es un atributo válido para este elemento. Utilice los atributos de datos en su lugar:data-url="{linkurl}"
y en el código js:$(this).data('url')
clickable_row
(CamelCase está en contra de los estándares HTML y debería estar en minúsculas (tuve problemas con el navegador cruzado varias veces con esto)) y luego jQuery es$('.clickable_row tr').click(function ...
Pero realmente deberías estar usandodata-
para retener datos, en lugar dehref
porque esa es la especificación para datos personalizados.data-url
y jquery accederá a él como$(this).data(url);
a
etiquetadisplay: block;
dentro de cada celda es un poco molesto, pero parece ser la forma más útil de resolver este problema.No puedes hacer eso. Es HTML inválido. No se puede poner un
<a>
entre a<tbody>
y a<tr>
. Intenta esto en su lugar:agregar estilo para vista de puntero
Cuando lo haga, querrá usar JavaScript para asignar el controlador de clics fuera del HTML.
fuente
<a>
dentro de la fila cliqueada. (eso también se degradaría con gracia)onClick={() => window.open('https://stackoverflow.com/', '_blank')}
Podría incluir un ancla dentro de cada
<td>
, así:Luego, puede usar
display:block;
los anclajes para hacer clic en la fila completa.Ejemplo jsFiddle aquí.
Probablemente sea lo más óptimo posible, a menos que recurra a JavaScript.
fuente
tabindex="-1"
todo menos el primer<td>
enlace, por lo que el usuario tabula fila por fila, no celda por celda. Además, aún puede resaltar / delinear toda la fila si desea utilizar la:focus-within
pseudoclase CSS.Es posible una fila de tabla vinculada, pero no con los
<table>
elementos estándar . Puedes hacerlo usando lasdisplay: table
propiedades de estilo. Aquí y aquí hay algunos violines para demostrar.Este código debería hacer el truco:
Tenga en cuenta que los roles ARIA son necesarios para garantizar la accesibilidad adecuada, ya que los
<table>
elementos estándar no se utilizan. Es posible que deba agregar roles adicionales como,role="columnheader"
si corresponde. Obtenga más información en la guía aquí.fuente
/
clave en Firefox), navegación (tab
clave), Copiar ubicación del enlace, Abrir en una nueva pestaña / ventana, etc., incluso para acceso / especial necesita navegadores Mi único inconveniente es que no anidaría<div>
dentro<a>
, por lo que las celdas estarían mejor marcadas como<span>
._tables.scss
y algunas otras piezas aleatorias, reemplazando todas las apariciones de elementos de la tabla con las clases CSS que elegí usar (que son simplemente las mismas que los elementos:th
→.th
) No mucho trabajo en comparación con los beneficios, realmente .<table>
está ahí por una razón. Pero esto todavía supera cualquier solución de JavaScript :)Logrado usando Bootstrap 4.3+ estándar de la siguiente manera: ¡no se necesitan jQuery ni ninguna clase de CSS adicional!
La clave es usar
stretched-link
el texto dentro de la celda y definirlo<tr>
como un bloque contenedor.Puede definir que contiene el bloque de diferentes maneras, por ejemplo, estableciendo
transform
un valor que no sea ninguno (como en el ejemplo anterior).Para obtener más información, lea aquí la documentación de Bootstrap para
stretched-link
.fuente
scope="row"
? No uso el alcance y la fila todavía se comporta como un enlace.scope="row"
- revise el historial si desea ver qué más puede haber sido editado. Sin embargo, no revertí las ediciones, ya que el fragmento de código parece funcionar (como lo hizo el original) y no tuve la oportunidad de probar el nuevo código exhaustivamente :-)tr
etiqueta que no se reconoce como las reglas para el bloque de contención entre los navegadores ... stackoverflow.com/questions/61342248/…stretched-link
.Una solución mucho más flexible es apuntar a cualquier cosa con el atributo data-href. Esto es, puede reutilizar el código fácilmente en diferentes lugares.
Luego, en su jQuery solo apunte a cualquier elemento con ese atributo:
Y no olvides diseñar tu CSS:
Ahora puede agregar el atributo data-href a cualquier elemento y funcionará. Cuando escribo fragmentos como este, me gusta que sean flexibles. Siéntase libre de agregar una solución vainilla js a esto si tiene una.
fuente
Puede usar este componente de arranque:
http://jasny.github.io/bootstrap/javascript/#rowlink
Jasny Bootstrap
Los componentes que faltan para su marco front-end favorito.
Uso
Vía atributos de datos
Agregue clase
.rowlink
y atributodata-link="row"
a un elemento<table>
o<tbody>
. Para otras opciones, agregue el nombre a los datos, ya que endata-target="a.mainlink"
una celda se puede excluir agregando la.rowlink-skip
clase a<td>
.Vía JavaScript
Llame a la máscara de entrada a través de javascript:
fuente
Hay una buena manera de hacerlo técnicamente con la
<a>
etiqueta dentro<tr>
, que puede ser semánticamente incorrecta (puede que le dé una advertencia al navegador), pero funcionará sinJavaScript/jQuery
necesidad:PD: Observe que el truco aquí es colocar la
<a>
etiqueta como último elemento, de lo contrario, tratará de ocupar el espacio de la primera<td>
celda.PPS: Ahora se podrá hacer clic en toda su fila y también puede usar este enlace para abrir en una pestaña nueva (Ctrl / CMD + clic)
fuente
<tr>
elementos no pueden tener un<a>
elemento como niño. Solo<td>
y<th>
son niños válidos. Ver: stackoverflow.com/questions/12634715/…Puede usar el método onclick javascript en tr y hacer que se pueda hacer clic, también si necesita construir su enlace debido a algunos detalles, puede declarar una función en javascript y llamarlo en onclick, pasando algunos valores.
fuente
Aquí hay una manera de poner un elemento A transparente sobre las filas de la tabla. Las ventajas son:
Desventajas
La tabla se queda como está:
Agregue los enlaces (para cada fila) a través de jQuery JavaScript insertando un elemento A en cada primera columna y estableciendo las propiedades necesarias:
El ajuste de ancho y alto puede ser complicado, si se utilizan muchos rellenos y márgenes, pero en general, unos pocos píxeles de distancia ni siquiera deberían importar.
Demostración en vivo aquí: http://jsfiddle.net/qo0dx0oo/ (funciona en Firefox, pero no en IE o Chrome, allí el enlace está mal colocado)
Corregido para Chrome e IE (todavía funciona en FF también): http://jsfiddle.net/qo0dx0oo/2/
fuente
onmouseover
Puede agregar la función de botón a una fila de la tabla y Bootstrap cambiará el cursor sin ningún cambio de CSS. Decidí usar ese rol como una forma de hacer que cualquier fila sea clicable con muy poco código.
HTML
jQuery
Puede aplicar este mismo principio para agregar la función de botón a cualquier etiqueta.
fuente
Aquí hay una solución simple ...
fuente
Este código debajo hará que se pueda hacer clic en toda la tabla. Al hacer clic en los enlaces de este ejemplo, se mostrará el enlace en un cuadro de diálogo de alerta en lugar de seguir el enlace.
El HTML:
Aquí está el HTML detrás del ejemplo anterior:
El CSS
Y el CSS:
El jQuery
Y finalmente el jQuery que hace que la magia suceda:
Lo que hace es que cuando se hace clic en una fila, se realiza una búsqueda de la href que pertenece a un ancla. Si se encuentra uno, la ubicación de la ventana se establece en esa href.
fuente
Una opción muy fácil es simplemente usar al hacer clic, y más correcto, en mi punto de vista, porque esto separa la vista y el controlador, y no necesita codificar la URL o lo que sea que necesite hacer con el clic . Funciona con Angular ng-click también.
Ejemplo trabajando aquí
fuente
Otra opción usando un
<a>
, posiciones CSS y algunos jQuery o JS :HTML:
CSS:
Luego debe dar un ancho, usando por ejemplo jQuery:
fuente
Sé que alguien ya ha escrito más o menos lo mismo, sin embargo, mi forma es la correcta (div no puede ser hijo de A) y también es mejor usar clases.
Puede imitar una tabla usando CSS y hacer que un elemento A sea la fila
css:
fuente
preferiría usar el
onclick=""
atributo ya que es fácil de usar y entender para novatos comofuente
La respuesta aceptada es excelente, pero propongo una pequeña alternativa si no desea repetir la URL en cada tr. Entonces pones la url o href en la tabla data-url y no el tr.
Esto también es bueno porque tampoco necesita agregar el atributo de datos de clic a cada tr. La otra cosa buena es que no estamos usando una clase para activar un clic, ya que las clases solo deberían usarse para diseñar.
fuente
Una solución que no se mencionó anteriormente es usar un solo enlace en una celda y algo de CSS para extender este enlace sobre las celdas:
fuente
Si bien la solución principal aquí es excelente, mi solución elimina la necesidad de clases. Todo lo que necesita hacer es agregar el atributo data-href con la URL.
fuente
He invertido mucho tiempo tratando de resolver este problema.
Hay 3 enfoques:
Utiliza JavaScript. Los inconvenientes claros: no es posible abrir una nueva pestaña de forma nativa, y al pasar el cursor sobre la fila no habrá ninguna indicación en la barra de estado como los enlaces regulares. La accesibilidad también es una pregunta.
Use solo HTML / CSS. Esto significa poner
<a>
anidados debajo de cada uno<td>
. Un enfoque simple como este violín no funciona, porque la superficie en la que se puede hacer clic no es necesariamente igual para cada columna. Esta es una seria preocupación de UX. Además, si necesita un<button>
en la fila, no es HTML válido anidarlo bajo la<a>
etiqueta (aunque los navegadores están bien con eso).He encontrado otras 3 formas de implementar este enfoque. Primero está bien, los otros dos no son geniales.
a) Echa un vistazo a este ejemplo :
Funciona, pero debido a las inconsistencias entre Chrome y Firefox, requiere un hack específico del navegador para superar las diferencias. Además, Chrome siempre alineará el contenido de la celda en la parte superior, lo que puede causar problemas con textos largos, especialmente si hay alturas de línea variables.
b) Configuración
<td>
a{ display: contents; }
. Esto lleva a otros 2 problemas:b1. Si alguien más intenta
<td>
darle estilo directamente a la etiqueta, como configurarla{ width: 20px; }
, debemos pasar ese estilo de alguna manera a la<a>
etiqueta. Necesitamos algo de magia para hacer eso, probablemente más magia que en la alternativa de Javascript.b2.
{ display: contents; }
sigue siendo experimental; específicamente no es compatible con Edge.c) Configuración
<td>
a{ height: --some-fixed-value; }
. Esto simplemente no es lo suficientemente flexible.El último enfoque, que recomiendo pensar seriamente, es no usar filas en las que se pueda hacer clic . Las filas en las que se puede hacer clic no son una gran experiencia de UX: no es fácil marcarlas visualmente como clicables, y plantea desafíos cuando se puede hacer clic en varias partes dentro de las filas, como los botones. Por lo tanto, una alternativa viable podría ser tener una
<a>
etiqueta solo en la primera columna, mostrada como un enlace regular, y darle la función de navegar por toda la fila.fuente
Aquí hay otra forma ...
El HTML:
El jQuery:
fuente
Reemplace # con la url,
tabindex="0"
hace que cualquier elemento sea enfocablefuente
Podría darle a la fila una identificación, por ejemplo
<tr id="special"> ... </tr>
y luego usa jquery para decir algo como:
$('#special').onclick(function(){ window="http://urltolinkto.com/x/y/z";})
fuente
¿Por qué no deberíamos usar etiquetas "div" ...
fuente