2009-02-20 19 views
13

¿Cuál es la mejor manera de hacer que una fila de una tabla HTML sea un enlace? Actualmente estoy usando jquery para cebra stripe las filas y también para resaltar onmouseover/off row seleccionado, así que si JavaScript es la respuesta, usa jquery.Enlace de la fila de la tabla HTML

+0

Google Search consulta 'enlace jQuery tr' me dieron algunas soluciones ya. Tal vez deberías probarlo también? No respondo tu pregunta porque no tengo ninguna experiencia en absoluto, así que podría estar diciendo algo 'estúpido' ;-) – RuudKok

+8

sí, te da resultados, pero no consideraría la mayoría de las respuestas. Si busco en google "dog poop tr link" también obtengo "respuestas". :) – hacintosh

+1

Las dos soluciones propuestas de JQuery son problemáticas para la usabilidad y la accesibilidad. La solución CSS es mejor para cualquier sitio web público. Vea mis comentarios allí. –

Respuesta

40

sólo tiene que utilizar CSS:

<style> 
table.collection {width:500px;border-collapse:collapse;} 
table.collection tr {background-color:#fff; border-bottom: 1px #99b solid;} 
table.collection tr:hover {background-color:#ffe;} 
table.collection td {display:table-cell;border-bottom: 1px #99b solid; padding:0px;} 
table.collection td a {text-decoration:none; display:block; padding:0px; height:100%;} 
</style> 
<table class="collection"> 
<tr> 
    <td><a href="#">Linky1</a></td> 
    <td><a href="#">Data1</a></td> 
</tr> 
<tr> 
    <td><a href="#">Linky2</a></td> 
    <td><a href="#">Data2</a></td> 
</tr> 
</table> 
+4

La mejor solución, de lejos. El navegador aún ve esto como un enlace, así que' abrir en pestaña 'o' copiar enlace 'funcionará. ¡Las otras soluciones rompen mi navegador! Hay posibilidades para un JQuery solución que automatiza lo anterior mediante la manipulación de DOM. –

+2

Tengo problemas con esta solución. Si una de las celdas de la tabla contiene suficiente contenido para envolver líneas, la altura de las celdas vecinas no se extenderá a la altura completa. solución para este caso? – troelskn

+0

Esto suena como un problema en el modo de las peculiaridades de IE. No veo esto en Firefox o IE 7-8 con "- // W3C // DTD XHTML 1.0 Strict // EN". También puede no funcionar en IE 6 (pero ¿qué hace?) –

2

Registre un controlador de eventos onclick para el elemento tr. Algo como esto usando jQuery:

$("tr").bind("click", function(){ 
    window.location = 'http://www.example.com/'; 
}); 
+0

¿Esto no lo vincula a la misma ubicación en cada clic de fila? – RuudKok

+0

Puede usar una entrada oculta en cada tr para almacenar la url. –

+0

De hecho, esto unirá el mismo enlace a cada fila, modifíquelo según sus necesidades. –

18
$(document).ready(function(){ 
    $("tr").click(function(){ 
     /* personally I would throw a url attribute (<tr url="http://www.hunterconcepts.com">) on the tr and pull it off on click */ 
     window.location = $(this).attr("url"); 

    }); 
}); 
+2

Ok, eso es genial, pero ¿cómo lo abren en una nueva ventana? Como si fuera un ... también de esta manera (solo si hace clic en pasa por la cadena de referencia ... con js onclick - no ... – Denis

+2

podría use 'window.open' – hunter

+1

El problema surge cuando las personas intentan hacer clic en el' tr' del mismo modo que hacen clic en un elemento 'a' (es decir, shift + clic o cmd + clic para pestañas nuevas, etc.) – hohner

1
<td> 
    <a href="/whatevs/whatevs"> 
     <div class="tdStreacher"> linkName 
     </div> 
    </a> 
</td> 

.tdStreacher{ 
    height: 100%; 
    width: 100%; 
    padding: 3px; 
} 

De esta manera, toda la superficie de cada célula actuará como enlace, por lo tanto, el conjunto fila actuar como un enlace.

+1

no vio la solución aceptada ¿eh? No funciona en 1999/xhtml porque height: 100% no abarca necesariamente la celda completa. – dube

1

Aquí hay un plugin jQuery basado en la solución de Nick.

(function($) { 
    $.fn.linkWholeRows = function() { 

    // for each object 
    return this.each(function() { 

     // for each row 
     $(this).find('tbody tr').each(function() { 
     // get the first link's href 
     var href = $(this).find('td > a').attr('href'); 
     // if none found then 
     if (href === undefined) { 
      return true; // continue 
     } 

     // wrap all cells with links that do not already have a link 
     $(this).children().not(':has(a)').each(function() { 
      $(this).contents().wrapAll('<a href="' + href + '" />'); 
     }); 

     // apply the row's height to all links 
     // in case that the cells' content have different heights 
     var height = $(this).children().css('height'); 
     $(this).find('td > a').each(function() { 
      $(this).css('height', height); 
      // do not forget to apply display:block to the links 
      // via css to make it work properly 
     }); 
     }); // each row 

    }); // each object 

    }; 
})(jQuery); 

Espera que las filas se envuelvan en tbody's. La altura se establece explícitamente, ya que la solución original de Nick no funcionó para mí en las celdas vecinas con diferentes alturas. Asegúrate de diseñar elementos a como bloques. Si desea aplicar el relleno, que se aplican a los a-elementos en vez de celdas de la tabla:

a { 
    display: block; 
    padding: 0.25em 0.5em; 
} 
tbody td { padding: 0; } 

simplemente llaman

$('#your-table').linkWholeRows(); 

espero que ayude. Saludos, Richard

2

No es necesario jQuery si no te importa la sustitución de la tabla de elementos genéricos:

<style> 
    .table { 
     border-collapse: collapse; 
     border-spacing: 0; 
     display: table; 
    } 
    .tr { 
     display: table-row; 
    } 
    .td { 
     display: table-cell; 
    } 

</style> 

<section class="table"> 
    <a class="tr" href="#"> 
     <div class="td"> 
      A 
     </div> 
     <div class="td"> 
      B 
     </div> 
     <div class="td"> 
      C 
     </div> 
    </a> 
</section> 
+1

No conserva el significado semántico que obtiene utilizando las etiquetas table, tr y td con esta solución. – Andreas

Cuestiones relacionadas