html - строка таблицы как ссылка

82

Я не могу установить строку таблицы как ссылку на что-то. Я могу использовать только css и html. Я пробовал разные вещи от div в строке к чему-то другому, но все равно не могу заставить его работать.

Теги:
hyperlink
html-table

14 ответов

153
Лучший ответ

У вас есть два способа сделать это:

  • Использование javascript:

    <tr onclick="document.location = 'links.html';">

  • Использование якорей:

    <tr><td><a href="">text</a></td><td><a href="">text</a></td></tr>

Я сделал вторую работу, используя:

table tr td a {
    display:block;
    height:100%;
    width:100%;
}

Чтобы избавиться от мертвого пространства между столбцами:

table tr td {
    padding-left: 0;
    padding-right: 0;
}

Ниже приведена простая демонстрация второго примера: DEMO

  • 7
    Поскольку OP сказал "только css и html", я предполагаю, что согласие было для второго ответа. Обратите внимание, что если у вас нет border = 0, вы получите пробел «недостающее звено» между ячейками таблицы.
  • 1
    Клетки таблицы IIRC просто должны быть свернуты, но могут иметь границу.
Показать ещё 7 комментариев
44

Я создал пользовательскую функцию jquery:

Html

<tr data-href="site.com/whatever">

JQuery

$('tr[data-href]').on("click", function() {
    document.location = $(this).data('href');
});

Легко и идеально для меня. Надеюсь, это поможет вам.

(Я знаю, что OP хочет только CSS и HTML, но рассмотрим jQuery)

Изменить

Согласовано с Мэттом Кантором, используя данные attr. Отредактированный ответ выше

  • 0
    Это довольно элегантно на самом деле. Интересно, считается ли он недействительным HTML по стандартам w3c.
  • 13
    Я бы использовал data-href или что-то подобное.
Показать ещё 3 комментария
25

Если вы используете браузер, который поддерживает его, вы можете использовать CSS для преобразования <a> в строку таблицы:

.table-row { display: table-row; }
.table-cell { display: table-cell; }

<div style="display: table;">
    <a href="..." class="table-row">
        <span class="table-cell">This is a TD... ish...</span>
    </a>
</div>

Конечно, вы ограничены тем, что не кладете элементы блока внутри <a>. Вы также не можете смешивать это с помощью обычного <table>

  • 1
    Отличная идея, спасибо! Вроде работает на Opera 8.5 / , Firefox 0.8 / , IE8, iPhone Simulator / Safari / очень старая :)
  • 1
    Это должен быть метод, который разработчики пытаются применить, учитывая, что таблицы CSS поддерживаются всеми текущими браузерами: caniuse.com/#feat=css-table Единственная проблема в том, что я не могу использовать это с Bootstrap! : '(
11

Обычный способ - присвоить JavaScript JavaScript атрибуту onClick элемента TR.

Если вы не можете использовать JavaScript, вы должны использовать трюк:

  • Добавьте одну и ту же ссылку к каждой TD той же строки (ссылка должна быть самым внешним элементом в ячейке).

  • Поверните ссылки на элементы блока: a { display: block; width: 100%; height: 100%; }

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

8

Если вам нужно использовать таблицу, вы можете поместить ссылку в каждую ячейку таблицы:

<table>
  <tbody>
    <tr>
      <td><a href="person1.html">John Smith</a></td>
      <td><a href="person1.html">123 Fake St</a></td>
      <td><a href="person1.html">90210</a></td>
    </tr>
    <tr>
      <td><a href="person2.html">Peter Nguyen</a></td>
      <td><a href="person2.html">456 Elm Ave</a></td>
      <td><a href="person2.html">90210</a></td>
    </tr>
  </tbody>
</table>

И заставьте ссылки заполнить все ячейки:

table tbody tr td a {
  display: block;
  width: 100%;
  height: 100%;
}

Если вы можете использовать <div> вместо таблицы, ваш HTML может быть намного проще, и вы не получите "пробелов" в ссылках между ячейками таблицы:

<div class="myTable">
  <a href="person1.html">
    <span>John Smith</span>
    <span>123 Fake St</span>
    <span>90210</span>
  </a>
  <a href="person2.html">
    <span>Peter Nguyen</span>
    <span>456 Elm Ave</span>
    <span>90210</span>
  </a>
</div>

Вот CSS, который идет с методом <div>:

.myTable {
  display: table;
}
.myTable a {
  display: table-row;
}
.myTable a span {
  display: table-cell;
  padding: 2px; /* this line not really needed */
}
  • 0
    Если вы хотите отображать табличные данные, всегда используйте таблицу. Использование коллекции элементов div и span семантически некорректно, если вы потеряете CSS, и вам будет трудно читать контент, который недоступен для тех, кто использует программу чтения с экрана.
6

Вы не можете обернуть элемент <td> тегом <a>, но вы можете выполнить аналогичные функции, используя событие onclick для вызова функции. Пример здесь, что-то вроде этой функции:

<script type="text/javascript">
function DoNav(url)
{
   document.location.href = url;
}
</script>

И добавьте его в таблицу следующим образом:

<tr onclick="DoNav('http://stackoverflow.com/')"><td></td></tr>
  • 18
    Одна из проблем, связанных с использованием onClick для таких целей, заключается в том, что пользователи больше не могут использовать среднюю кнопку мыши или нажатие клавиши управления, чтобы открывать ссылки на новой вкладке (что может быть очень неприятно для тех из нас, кто любит открывать ссылки таким образом). , Еще одно замечание: нет причин усложнять ситуацию, создавая функцию, которая выполняет только одну простую команду. Если вы собираетесь это сделать, просто поместите «document.location.href = ...» непосредственно в атрибуте onclick.
5

Ответ от sirwilliam лучше всего подходит мне. Я улучшил Javascript с поддержкой горячей клавиши Ctrl + LeftClick (открывается страница на новой вкладке). Событие ctrlKey используется ПК, metaKey для Mac.

Javascript

$('body').on('mousedown', 'tr[url]', function(e){
    var click = e.which;
    var url = $(this).attr('url');
    if(url){
        if(click == 2 || (click == 1 && (e.ctrlKey || e.metaKey))){
            window.open(url, '_blank');
            window.focus();
        }
        else if(click == 1){
            window.location.href = url;
        }
        return true;
    }
});

Пример

http://jsfiddle.net/vlastislavnovak/oaqo2kgs/

  • 0
    Хорошо. Ctrl + LeftClick не нарушает UIX
  • 0
    Это великолепно. Command-click работает правильно. Престижность!
3

Я знаю, что этот вопрос уже ответил, но мне все еще не нравится какое-либо решение на этой странице. Для людей, которые используют JQuery, я сделал окончательное решение, которое позволяет вам привести строку таблицы почти так же, как тег <a>.

Это мое решение:

Javascript. Вы можете добавить это, например, в стандартный файл javascript.

$('body').on('mousedown', 'tr[url]', function(e){
    var click = e.which;
    var url = $(this).attr('url');
    if(url){
        if(click == 1){
            window.location.href = url;
        }
        else if(click == 2){
            window.open(url, '_blank');
            window.focus();
        }
        return true;
    }
});

HTML Теперь вы можете использовать это для любого элемента <tr> внутри вашего HTML

<tr url="example.com">
    <td>value</td>
    <td>value</td>
    <td>value</td>
<tr>
  • 0
    Так близко к чистому JS. document.querySelector('tr[url]').addEventListener("mousedown", function(e){ var click = e.which; var url = this.getAttribute("url"); if(url){ if(click == 1){ window.location.href = url; } else if(click == 2){ window.open(url, '_blank'); window.focus(); } return true; } });
  • 1
    В 2014 году, который не был доступен в Vanilla JS , вы испортили паршивец; P.
0

Когда я хочу имитировать ссылку со ссылкой, но соблюдая стандарты html, я делаю это.

HTML:

<table>
    <tr class="trLink">
        <td>
            <a href="#">Something</a>
        </td>
    </tr>
</table>

CSS

tr.trLink {
    cursor: pointer;
}
tr.trLink:hover {
   /*TR-HOVER-STYLES*/
}

tr.trLink a{
    display: block;
    height: 100%;
    width: 100%;
}
tr.trLink:hover a{
   /*LINK-HOVER-STYLES*/
}

Таким образом, когда кто-то идет с помощью мыши на TR, вся строка (и эта ссылка) получает стиль наведения, и он не видит, что существует несколько ссылок.

Надежда может помочь кому-то.

Fiddle ЗДЕСЬ

0

У меня есть другой путь. Особенно, если вам нужно отправить данные с помощью jQuery

$(document).on('click', '#tablename tbody tr', function()
{   
    var test="something";
    $.post("ajax/setvariable.php", {ID: this.id, TEST:test}, function(data){        
        window.location.href = "http://somepage";
    });
});

Установите переменную, задающую переменные в SESSIONS, на которых вы будете читать и действовать. страница

Мне бы очень хотелось, чтобы вы отправлялись прямо в окно, но я не думаю, что это возможно.

0

После прочтения этой темы и некоторых других я придумал следующее решение в javascript:

function trs_makelinks(trs) {
    for (var i = 0; i < trs.length; ++i) {
        if (trs[i].getAttribute("href") != undefined) {
            var tr = trs[i];
            tr.onclick = function () { window.location.href = this.getAttribute("href"); };
            tr.onkeydown = function (e) {
                var e = e || window.event;
                if ((e.keyCode === 13) || (e.keyCode === 32)) {
                    e.preventDefault ? e.preventDefault() : (e.returnValue = false);
                    this.click();
                }
            };
            tr.role = "button";
            tr.tabIndex = 0;
            tr.style.cursor = "pointer";
        }
    }
}

/* It could be adapted for other tags */
trs_makelinks(document.getElementsByTagName("tr"));
trs_makelinks(document.getElementsByTagName("td"));
trs_makelinks(document.getElementsByTagName("th"));

Чтобы использовать его, поставьте href в tr/td/th, который вы хотите кликать, например: <tr href="http://stackoverflow.com">. И убедитесь, что script выше выполняется после создания элемента tr (путем размещения или использования обработчиков событий).

Недостатком является то, что TRs не будет полностью работать как ссылки, такие как divs с display: table;, и они не будут выбираться на клавиатуре или иметь текст состояния. Изменить: я сделал навигация по клавиатуре, установив onkeydown, role и tabIndex, вы можете удалить эту часть, если нужна только мышь. Они не будут показывать URL-адрес в строке состояния при наведении курсора.

Вы можете специально указать ссылку TRs с помощью "tr [href]" селектора CSS.

0

Это избавит вас от необходимости дублировать ссылку в tr - просто выкинь ее из первого a.

$(".link-first-found").click(function() {
 var href;
href = $(this).find("a").attr("href");
if (href !== "") {
return document.location = href;
}
});
0
//Style
  .trlink {
    color:blue;
  }
  .trlink:hover {
    color:red;
  }

<tr class="trlink" onclick="function to navigate to a page goes here">
<td>linktext</td>
</tr>

Что-то вроде этого? Хотя он использует JS, но это единственный способ сделать строку (tr) доступной.

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

И тогда вы не должны использовать таблицу в любом случае.

-2

Можете ли вы добавить тег A в строку?

<tr><td>
<a href="./link.htm"></a>
</td></tr>

Это то, о чем вы спрашиваете?

  • 1
    Нет, мне нужно щелкнуть по всей области строк.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню