2009-02-20 21 views
13

Jaki jest najlepszy sposób, aby wiersz tabeli HTML był linkiem? Obecnie używam jquery do zebrania pasków w wierszach, a także do wyróżnienia wybranego wiersza onmouseover/off, więc jeśli JavaScript jest odpowiedzią, użyj jquery.Link do wiersza tabeli HTML

+0

Google wyszukiwane „Link jquery tr” dał mi kilka rozwiązań już. Może powinieneś też spróbować? Nie odpowiadam na twoje pytanie, ponieważ nie mam żadnego doświadczenia jQuery, więc mogę powiedzieć coś "głupiego" ;-) – RuudKok

+8

tak, daje wyniki, ale nie uważam, że większość z nich odpowiada. Jeśli google "pies kupa tr link" otrzymuję "odpowiedzi" również. :) – hacintosh

+1

Dwa proponowane rozwiązania JQuery mają problem z użytecznością i dostępnością. Rozwiązanie CSS jest lepsze dla każdej publicznej strony internetowej. Zobacz moje komentarze tam. –

Odpowiedz

40

po prostu użyć 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

Najlepsze rozwiązanie zdecydowanie. Przeglądarka nadal widzisz to jako link, więc" Otwórz w karcie "lub" Kopiuj link "będzie działać.Pozostałe rozwiązania przerwać moją przeglądarkę! Istnieje zakres dla JQuery rozwiązanie automatyzujące powyższe przez manipulację DOM –

+2

Mam problem z tym rozwiązaniem.Jeśli jedna z komórek tabeli zawiera wystarczającą ilość treści do zawijania linii, wysokość sąsiednich komórek nie zostanie rozciągnięta do pełnej wysokości. obejście tego przypadku? – troelskn

+0

To brzmi jak problem z trybem dziwactw IE. Nie widzę tego w firefoxie lub IE 7-8 z "- // W3C // DTD XHTML 1.0 Strict // EN". Może również nie działać w IE 6 (ale co robi?) –

2

Zarejestruj procedurę obsługi zdarzeń onclick dla elementu tr. Coś jak ten przy użyciu jQuery:

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

Czy to nie prowadzi do tej samej lokalizacji w każdym wierszu? – RuudKok

+0

Możesz użyć ukrytego wejścia w każdym tr, aby zapisać adres URL. –

+0

To rzeczywiście będzie wiązało to samo łącze z każdym wierszem, modyfikuj zgodnie z Twoimi potrzebami. –

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

możesz użyj 'window.open' – hunter

+1

Kłopot pojawia się, gdy ludzie próbują kliknąć na" tr "w taki sam sposób, w jaki klikają element" a "(np. shift + kliknięcie lub cmd + kliknięcie dla nowych zakładek itp.) – hohner

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

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

ten sposób cały obszar każdej komórki będą działać jako łącznik, a więc cała rząd działa jako łącze.

+1

nie widział zaakceptowanego rozwiązania, huh? Nie działa w 1999/xhtml, ponieważ wysokość: 100% niekoniecznie obejmuje całą komórkę. – dube

1

Oto wtyczka jQuery oparta na rozwiązaniu Nicka.

(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); 

Oczekuje, że wiersze zostaną zawinięte w tbody. Wysokość jest ustawiona jawnie, ponieważ oryginalne rozwiązanie Nicka nie zadziałało dla mnie na sąsiednich komórkach o różnych wysokościach. Pamiętaj, aby stylizować elementy jako bloki. Jeśli chcesz zastosować wyściółkę, stosuje się go do A-elementów zamiast komórek tabeli:

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

Wystarczy zadzwonić

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

Nadzieję, że to pomaga. Wiwaty, Richard

2

Nie trzeba jQuery, jeśli nie przeszkadza wymianie tabelę elementów ogólnych:

<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

Nie zachowujesz semantycznego znaczenia, jakie uzyskujesz, używając tagów table, tr i td z tym rozwiązaniem. – Andreas