2009-02-20 14 views
13

Qual è il modo migliore per creare un collegamento a una riga di una tabella HTML? Attualmente sto usando jquery per zebra stripe le righe e anche per evidenziare onmouseover/off row selezionato, quindi se JavaScript è la risposta, per favore usa jquery.Link riga tabella HTML

+0

Google criteri di ricerca 'collegamento jquery tr' mi ha dato un paio di soluzioni già. Forse dovresti provarlo anche tu? Non sto rispondendo alla tua domanda perché non ho alcuna esperienza jquery, quindi potrei dire qualcosa di 'stupido' ;-) – RuudKok

+8

sì, ti dà risultati ma non prenderei in considerazione la maggior parte di loro risposte. Se io google "dog poop tr link" ottengo anche "risposte". :) – hacintosh

+1

Le due soluzioni JQuery proposte sono problematiche per usabilità e accessibilità. La soluzione CSS è migliore per qualsiasi sito web pubblico. Vedi i miei commenti lì. –

risposta

40

mi basta usare i 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 migliore soluzione di gran lunga.Il browser continua a vedere questo come un collegamento, quindi' Apri in scheda 'o' copia collegamento 'funzionerà.Le altre soluzioni si rompono il mio browser! C'è spazio per un JQuery soluzione che automatizza il precedente tramite la manipolazione del DOM. –

+2

Ho problemi con questa soluzione: se una delle celle della tabella contiene abbastanza contenuto per avvolgere linee, l'altezza delle celle vicine non si estenderà fino alla massima altezza. soluzione alternativa per questo caso? – troelskn

+0

Questo suona come un problema di modalità strane IE. Non vedo questo in firefox o IE 7-8 con "- // W3C // DTD XHTML 1.0 Strict // EN". Potrebbe anche non funzionare in IE 6 (ma cosa fa?) –

2

Registrare un gestore di eventi onclick per l'elemento tr. Qualcosa di simile utilizzando jQuery:

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

Questo link non ti collega alla stessa posizione su ogni riga? – RuudKok

+0

È possibile utilizzare un input nascosto in ogni tr per memorizzare l'url. –

+0

Questo effettivamente collegherà lo stesso link ad ogni riga, modificherà secondo le tue esigenze .. –

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
+2

si potrebbe usa 'window.open' – hunter

+1

Il problema si presenta quando le persone cercano di fare clic su' tr' nello stesso modo in cui fanno clic su un elemento 'a' (ad esempio shift + clic o cmd + clic per nuove schede, ecc.) – hohner

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

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

In questo modo, tutta l'area di ciascuna cella agirà come un link, di conseguenza, l'intera la fila funge da collegamento.

+1

non ha visto la soluzione accettata eh? Non funziona nel 1999/xhtml perché altezza: il 100% non copre necessariamente la cella completa. – dube

1

Ecco un plugin jQuery basato sulla soluzione di 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); 

Si aspetta che le righe vengano avvolte nel tbody's. L'altezza è impostata in modo esplicito in quanto la soluzione originale di Nick non ha funzionato per me su celle vicine con altezze diverse. Assicurati di disegnare a-elementi come blocchi. Se si desidera applicare imbottiture, applicarlo alla A-elementi, invece di celle di una tabella:

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

Chiamate

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

Speranza che aiuta. Cheers, Richard

2

Non hai bisogno di jQuery, se non ti dispiace la sostituzione del tavolo da elementi generici:

<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

Non si mantiene il significato semantico ottenuto usando i tag table, tr e td con questa soluzione. – Andreas

Problemi correlati