Делаем строку таблицы интерактивной

Интересно, каким был бы лучший способ сделать весь тр кликабельным?

Наиболее распространенное (и единственное?) Решение, похоже, использует JavaScript, используя onclick = "javascript: document.location.href ('bla.htm');" (не забывайте: установка правильного курсора с помощью onmouseover / onmouseout).

Хотя это работает, жаль, что целевой URL-адрес не отображается в строке состояния браузера, в отличие от обычных ссылок.

Так что мне просто интересно, есть ли место для оптимизации? Можно ли отобразить URL-адрес, по которому будет осуществляться переход, в строке состояния браузера? Или есть даже способ, не связанный с JavaScript, сделать tr интерактивным?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
27
0
46 386
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

Ответ принят как подходящий

К счастью или к сожалению, большинство современных браузеров больше не позволяют вам управлять строкой состояния (это было возможно и популярно в те времена) из-за мошеннических намерений.

Лучше всего выбрать атрибут title или всплывающая подсказка javascript.

Если вы уже полагаетесь на javascript для щелчка, вы также можете использовать javascript для отображения URL-адреса в области состояния, изменения курсора или выполнения других действий, чтобы он больше походил на ссылку. Конечно, браузер может игнорировать код, устанавливающий область состояния.

Сейчас это отключено в большинстве браузеров.

Michael Haren 13.10.2008 18:18

Другой подход - фактически связать содержимое каждой ячейки. При необходимости вы можете изменить стиль, чтобы они не выглядели как традиционные ссылки.

Обратите внимание: то, что вы пытаетесь сделать, немного нарушает интуитивно понятный пользовательский интерфейс. Должно быть ясно, что щелчок по строке что-то делает. Обычно я предпочитаю помещать значок на краю каждой строки (увеличительное стекло и т. д.), Который переходит на новую страницу.

Спасибо. в моем случае, насколько я могу судить, это на самом деле улучшает пользовательский опыт (приемочное тестирование пользователей все еще не завершено), но ваша точка зрения, конечно же, верна. Может быть, я поменяю и цвет фона при наведении курсора, чтобы это было действительно заметно

Michael Stum 13.10.2008 18:22

Да, можно изменить цвет фона строки с помощью tr: hover.

Eric Johnson 20.08.2009 14:32

Это взлом, но вы можете добавить это в свой tr:

onmouseover = "window.status='http://bla.com/bla.htm'" 

не забудьте стилизовать свои поддельные ссылки:

tr.clickable {
    cursor: hand; 
    cursor: pointer;
}

С помощью jQuery вы можете сделать что-то в этом роде:

$('tr').click(function () {
  $(this).toggleClass('highlight_row');
}); 

Затем добавьте highlight_row в свой CSS-файл, и эта строка изменит свой класс на highlight_row. Вы можете поменять местами все, что хотите сделать в этой строке (а также изменить $ ('tr'), чтобы оно соответствовало вашей конкретной строке.

Марко Дугонжич в своем блоге maratz.com объяснил, как определить индекс строки таблицы с помощью Javascript. В его примере, когда вы наводите указатель мыши на любую ячейку в строке, вся строка выделяется.

См. Пример, http://webdesign.maratz.com/lab/row_index/

и его статья, http://www.maratz.com/blog/archives/2005/05/18/detect-table-row-index-with-javascript/

После внесения изменений вы можете дополнительно адаптировать его, разместив действие onclick.

Вы также можете попробовать обернуть содержимое ячеек вашей строки в href и с помощью CSS подтолкнуть высоту / ширину href к внутренним границам каждой ячейки. Сама строка не будет доступна для кликов (если вы не добавили дополнительный HTML-код в строку), но большая часть содержимого строки будет действовать как обычная ссылка (курсор, строка состояния и т. д.). Я не могу вспомнить, как именно я это делал раньше, но мне удалось заставить это работать.

Обновлено: комментарий запрашивал более подробную информацию, и они были охвачены более поздним сообщением от другого пользователя, но я не осознавал этого, пока не изучил это предложение и не проверил его.

Если вы добавите тег стиля CSS «display: block» к объектам привязки в ячейках, которые вы хотите активировать, он заставит всю ячейку (без каких-либо отступов) действовать как кнопка. Курсор отображается правильно, и он предварительно просматривает место назначения ссылки в строке состояния. Все это делается с нулевым JavaScript. Удачи.

Есть шанс, что ты сможешь больше узнать об этом. Я с трудом пытаюсь заставить эту стратегию работать должным образом.

troelskn 28.05.2009 13:30

"

Наиболее распространенным (и единственным?) Решением, похоже, является использование JavaScript с использованием onclick = "javascript:document.location.href('bla.htm');" (не забывайте: установка правильного курсора с помощью onmouseover / onmouseout).

"

Команда onclick должна выглядеть так:

onclick = "window.location.href='bla.html';"

И нет необходимости делать что-либо onmouseover / -out с курсором, поскольку свойство cursor работает только тогда, когда мышь наводит курсор на элемент:

style = "cursor:pointer;"

Если в вашей таблице нет ссылок, следующий трюк должен сработать.

Поместите всю таблицу в ссылку и измените атрибут href ссылки в строках onmouseover events.

Демо-код:

<script type = "text/javascript">
function setLink(elRow) {
var elLink = document.getElementById('link');
elLink.href = elRow.rowIndex + ".com";
}
</script>
...
<a id=link>
<table>
    <tr onMouseOver = "setLink(this);"><td>first row</td></tr>
    <tr onMouseOver = "setLink(this);"><td>second row</td></tr>
</table>
</a> 

странно! умные очки. id никогда не использует это (почему бы просто не использовать onclick, если у вас проблемы с onMouseOvers?), но вы получаете баллы за то, что придумываете то, что я никогда не мог себе представить ...

Jordan Sitkin 06.08.2010 11:26

Потому что строка состояния не знает, что собирается делать onclick, и спрашивающий хотел видеть там целевой URL.

buti-oxa 06.08.2010 19:36

К сожалению, XHTML 1.0 Strict недействителен. Элемент уровня блока, такой как «<table>», не может находиться внутри встроенного элемента, такого как «<a>».

PowerKiKi 12.02.2011 19:11

Если вы не хотите использовать javascript, вы можете сделать то, что предложил Крис Портер, заключив содержимое каждого элемента td в соответствующие теги привязки. Затем установите теги привязки на display: block и установите height и line-height, чтобы они были такими же, как высота td. Затем вы должны обнаружить, что td прикосновение плавно, и эффект состоит в том, что вся строка является интерактивной. Следите за отступом на td, который вызовет пробелы в интерактивной области. Вместо этого примените отступы к тегам привязки, так как они станут частью интерактивной области, если вы это сделаете.

Мне также нравится настраивать строку так, чтобы она имела эффект выделения, применяя другой цвет фона к tr: hover.

Пример

Для последней версии Bootstrap (версия 3.0.2) вот несколько быстрых CSS, чтобы показать, как это можно сделать:

table.row-clickable tbody tr td {
    padding: 0;
}

table.row-clickable tbody tr td a {
    display: block;
    padding: 8px;
}

Вот примерная таблица для работы:

<table class = "table table-hover row-clickable">
    <tbody>
        <tr>
            <td><a href = "#">Column 1</a></td>
            <td><a href = "#">Column 2</a></td>
            <td><a href = "#">Column 3</a></td>
        </tr>
    </tbody>
</table>

Вот пример, показывающий это в действии.

Один из недостатков - появление границ на элементе привязки, когда элемент стал «активным». :(

glaz666 01.10.2010 14:31

Пунктирная линия на якорях, когда они «находятся в фокусе», - это функция доступности, поэтому, если вы перемещаетесь с клавиатуры, вы можете видеть, где находится ваш фокус. Это можно удалить с помощью css, но вы должны быть действительно уверены, что ваши пользователи могут справиться без этого (есть также некоторые законы о доступности веб-сайтов).

Alice Davey 02.02.2011 17:35

Я действительно не думаю, что иметь более сложную разметку только для того, чтобы избежать javascript, это так хорошо. Этот трюк очень сложно поддерживать, любое изменение внешнего вида таблицы может привести к неправильной работе ссылки.

Stefan Manastirliu 26.03.2012 18:39

.table a {украшение текста: нет; } примените это к CSS, чтобы удалить подчеркивание ссылки в таблице.

Steven 29.04.2015 00:41

У меня была такая же проблема, я решил ее с помощью только CSS. Думаю, это было лучшее решение для меня, потому что я также использовал его в JSF.

Просто назначьте класс стиля для таблицы, и все готово ...

Вот оно:

CSS:

.myDataTable {
    background: 444;
    width: 100%;
}

.myDataTable thead tr {
    background-image: url('../img/tableHeader.jpg');
}

.myDataTable thead tr th {
    height: 28px;
    font-size: 14px;
    font-family: tahoma, helvetica, arial, sans-serif;
    padding-left: 5px;
}

.myDataTable thead tr th img {
    padding-right: 5px;
    padding-top: 1px;
}

.myDataTable thead tr td {
    height: 15px;
    font-size: 11px;
    font-weight: bold;
    font-family: tahoma, helvetica, arial, sans-serif;
    padding-left: 5px;
}

.myDataTable tbody {
    background: #f2f5f9;
}

.myDataTable tbody tr:nth-child(even) td,tbody tr.even td {
    background: #e2ebf4;
    font-size: 12px;
    padding-left: 5px;
    height: 14px;
}

.myDataTable tbody tr:nth-child(odd) td,tbody tr.odd td {
    background: #f7faff;
    font-size: 12px;
    padding-left: 5px;
    height: 14px;
}

.myDataTable tbody tr:hover td {
    background-color: #e7e7e7;
}

.myDataTable tbody tr td {
    height: 14px;
    padding-left: 5px;
    font-size: 12px;
}

.myDataTable tbody tr td a {
    color: black;
    text-decoration: none;
    font-size: 12px;
    display: block;
}

.myDataTable thead tr th a {
    color: black;
    text-decoration: none;
    font-size: 12px;
    display: inline;
}

Структура вашей таблицы должна быть:

<table class = "myDataTable">
 <thead>
  <tr>
   <th>Heading 1</th>
   <th>Heading 2</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><a href = "#">Data    1 </a></td>
   <td><a href = "#">Data    2 </a></td>
  </tr>
 </tbody>
</table>

Я нашел это решение, которое работает довольно хорошо:

$(document).ready(function() {
    $('#example tr').click(function() {
        var href = $(this).find("a").attr("href");

        if (href) {
            window.location = href;
        }
    });
});

Только не забудьте стилизовать курсор как указатель на tr:hover.

#table tr:hover {cursor: pointer;}

Источник: http://www.electrictoolbox.com/jquey-make-entire-table-row-clickable/

Если все ваши целевые браузеры поддерживают Стили отображения таблиц CSS, вы можете использовать Javascript, чтобы заключить каждую строку в тег <a>, стилизованный под <tbody>.

Вот код JS с использованием jQuery, чтобы это произошло: (jsfiddle)

$(function() {
  $('.table-linked').each(function() {
    var table, tbody;
    table = this;
    tbody = $('tbody', this);
    tbody.children().each(function() {
      var href, row;
      row = $(this);
      href = row.attr('data-href');
      $('<a href = "' + href + '" style = "display: table-row-group" />').append(row).appendTo(table);
    });
    tbody.remove();
  });
});

Этот код преобразует таблицу, которая выглядит так:

<table class = "table-linked">
    <tbody>
        <tr data-href = "/a"><td>a</td><td>1</td></tr>
        <tr data-href = "/b"><td>b</td><td>2</td></tr>
    </tbody>
</table>

В эту структуру DOM в браузере:

<table>
    <a href = "/a" style = "display: table-row-group">
        <tr><td>a</td><td>1</td></tr>
    </a>
    <a href = "/b" style = "display: table-row-group">
        <tr><td>b</td><td>1</td></tr>
    </a>
</table>

Браузеры, похоже, не способны анализировать эту структуру как HTML-код (и, разумеется, он не будет проверять), ее необходимо создать с использованием JS.

Я понимаю, что это старая ветка с совершенно законным решением в ответе Алисы. Однако есть способ сделать это без javascript И без дублирования вашей ссылки * количества столбцов И сохранения вашей разметки / CSS в силе. Мне потребовалось время, чтобы сообразить, поэтому я решил опубликовать это здесь для других, которые тоже случайно попадут в эту ветку, как и я.

Поместите ссылку в первый столбец:

<table class = "search_results">
    <tr>
        <td><a href = "#">Some text</a></td>
        <td>more text</td>
        <td>more text</td>
    </tr>
</table>

Это прекрасная разметка, поэтому единственная реальная проблема заключается в том, чтобы эта ссылка занимала всю ширину вашей таблицы. Я сделал это вот так, используя довольно стандартный CSS:

table.search_results a {position:absolute;display:block;width:98%;}

Измените ширину на все, что хотите, и в принципе все готово и вычищено. Так что все относительно просто, однако, если у вас, как и у меня, есть гибкий / адаптивный макет, а также некоторые стандартные стили для ваших ссылок плюс некоторые отступы в ваших таблицах, вам понадобятся эти правила (необходимо скопировать сверху и добавить дополнительный).

table.search_results td:first-child {padding:0;}
table.search_results a {position:absolute;display:block;width:98%;max-width:1272px;font-weight:normal;color:#000;padding:.5em;}
table.search_results a:hover {background:none;}
table.search_results tr:hover {border-color:#25505b;background:#b5d6dd;}

Объяснить: Первое правило удаляет все отступы ТОЛЬКО на моем первом td. По умолчанию отступ на моем td составляет 0,5em. Второе правило добавляет тот же отступ обратно к ссылке, иначе вы получите смещенное содержимое ячеек. Он также исправляет несколько стандартных стилей, которые у меня есть, чтобы все столбцы выглядели одинаково. Вы можете сделать это и наоборот (добавьте стили ссылок в свой td). С помощью последних двух правил я избавляюсь от эффекта наведения курсора по умолчанию на мои ссылки, а затем помещаю его в tr для любых таблиц с правильным классом.

Это работает в браузерах, которые мне небезразличны, но вы, конечно, должны протестировать тех, кто вам небезразличен :) Надеюсь, я помогу кому-то сэкономить несколько минут с этой записью!

Одним из недостатков является то, что содержимое position: absolute не влияет на размер содержимого td, не может использовать vertical-align: middle и т. д.

Iiridayn 22.03.2017 23:17

Другие вопросы по теме