2009-02-20 2 views
13

Каков наилучший способ сделать строку таблицы HTML ссылкой? В настоящее время я использую jquery для полосы зебры строк, а также для выделения выделенной строки onmouseover/off, поэтому, если JavaScript является ответом, используйте jquery.Ссылка на строку HTML-таблицы

+0

Google поисковый запрос «JQuery тр ссылку» дал мне несколько решений уже. Может быть, вам стоит попробовать? Я не отвечаю на ваш вопрос, потому что у меня нет никакого опыта jquery, поэтому я могу сказать что-то «глупое» ;-) – RuudKok

+8

да, это дает вам результаты, но я бы не рассмотрел большинство ответов. Если я google «dog poop tr link», я также получаю «ответы». :) – hacintosh

+1

Два предлагаемых решения JQuery являются проблематичными для удобства использования и доступности. Решение CSS лучше для любого общедоступного веб-сайта. Смотрите мои комментарии там. –

ответ

40

Я просто использовать 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

Лучшее решение на сегодняшний день. Браузер по-прежнему видит это как ссылку, поэтому« открыть вкладку »или« скопировать ссылку »будет работать. Другие решения ломают мой браузер! Есть возможности для JQuery решение, которое автоматизирует вышеуказанное с помощью DOM-манипуляции. –

+2

У меня возникли проблемы с этим решением. Если в одной из ячеек таблицы содержится достаточно содержимого для обертывания строк, высота соседних ячеек не будет растягиваться до полной высоты. обходной путь для этого случая? – troelskn

+0

Это звучит как проблема режима IE quirks. Я не вижу этого в firefox или IE 7-8 с «- // W3C // DTD XHTML 1.0 Strict // EN». Он также может не работать в IE 6 (но что делает?) –

2

Зарегистрировать обработчик события onclick для элемента tr. Что-то вроде этого с помощью JQuery:

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

Не ссылается ли вы на одно и то же место в каждой строке? – RuudKok

+0

Вы можете использовать скрытый ввод в каждом tr для хранения URL-адреса. –

+0

Это действительно связывает одну и ту же ссылку с каждой строкой, изменяя в соответствии с вашими потребностями. –

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

Хорошо, это здорово, но как вы можете открыть ее в новом окне? Как будто это было бы ... также таким образом (только если вы нажали на , он пройдет через строку Referrer ... с помощью js onclick - no ... – Denis

+2

вы можете use 'window.open' – hunter

+1

Проблема возникает, когда люди пытаются щелкнуть по' tr' так же, как они нажимают на элемент 'a' (например, shift + click или cmd + click для новых вкладок и т. д.). – hohner

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

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

Таким образом, все площадь каждой ячейки будет выступать в качестве связующего звена, следовательно, вся строка действует как ссылка.

+1

не видел принятого решения, да? Не работает в 1999/xhtml, потому что высота: 100% не обязательно охватывает полную ячейку. – dube

1

Это плагин jQuery, основанный на решении Ника.

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

Ожидает, что строки будут обернуты в корпус. Высота устанавливается явно, так как исходное решение Ника не работает для меня на соседних ячейках с разной высотой. Удостоверьтесь, что в качестве блоков заданы элементы a. Если вы хотите применить отступы, применить его к а-элементам вместо ячеек таблицы:

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

Просто позвоните

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

Надеется, что это помогает. Cheers, Richard

2

Вам не нужно Jquery, если вы не возражаете, заменяя таблицу общих элементов:

<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

Вы не сохраняете смысловое значение, которое вы получаете, используя теги table, tr и td с этим решением. – Andreas

Смежные вопросы