Diberikan tabel berikut, bagaimana saya mendapatkan header tabel yang sesuai untuk setiap elemen td?
<table>
<thead>
<tr>
<th id="name">Name</th>
<th id="address">Address</th>
</tr>
</thead>
<tbody>
<tr>
<td>Bob</td>
<td>1 High Street</td>
</tr>
</tbody>
</table>
Mengingat bahwa saya saat ini memiliki salah satu td
elemen yang tersedia untuk saya, bagaimana saya bisa menemukan th
elemen yang sesuai ?
var $td = IveGotThisCovered();
var $th = GetTableHeader($td);
jquery
jquery-selectors
djdd87.dll
sumber
sumber
Jawaban:
var $th = $td.closest('tbody').prev('thead').find('> tr > th:eq(' + $td.index() + ')');
Atau sedikit disederhanakan
var $th = $td.closest('table').find('th').eq($td.index());
sumber
.parent('table')
sebagai pengganti.closest('table')
var $th = $("table thead tr th").eq($td.index())
Sebaiknya gunakan id untuk mereferensikan tabel jika ada lebih dari satu.
sumber
Anda dapat melakukannya dengan menggunakan indeks td:
var tdIndex = $td.index() + 1; var $th = $('#table tr').find('th:nth-child(' + tdIndex + ')');
sumber
.index()
ini berbasis nol, dannth-child
itu berbasis satu. Jadi hasilnya akan berkurang satu. : o)Solusi yang menangani
colspan
Saya memiliki solusi berdasarkan pencocokan tepi kiri
td
ke tepi kiri yang sesuaith
. Ini harus menangani colspans kompleks sewenang-wenang.Saya memodifikasi kasus uji untuk menunjukkan bahwa arbitrary
colspan
ditangani dengan benar.Demo Langsung
JS
$(function($) { "use strict"; // Only part of the demo, the thFromTd call does the work $(document).on('mouseover mouseout', 'td', function(event) { var td = $(event.target).closest('td'), th = thFromTd(td); th.parent().find('.highlight').removeClass('highlight'); if (event.type === 'mouseover') th.addClass('highlight'); }); // Returns jquery object function thFromTd(td) { var ofs = td.offset().left, table = td.closest('table'), thead = table.children('thead').eq(0), positions = cacheThPositions(thead), matches = positions.filter(function(eldata) { return eldata.left <= ofs; }), match = matches[matches.length-1], matchEl = $(match.el); return matchEl; } // Caches the positions of the headers, // so we don't do a lot of expensive `.offset()` calls. function cacheThPositions(thead) { var data = thead.data('cached-pos'), allth; if (data) return data; allth = thead.children('tr').children('th'); data = allth.map(function() { var th = $(this); return { el: this, left: th.offset().left }; }).toArray(); thead.data('cached-pos', data); return data; } });
CSS
.highlight { background-color: #EEE; }
HTML
<table> <thead> <tr> <th colspan="3">Not header!</th> <th id="name" colspan="3">Name</th> <th id="address">Address</th> <th id="address">Other</th> </tr> </thead> <tbody> <tr> <td colspan="2">X</td> <td>1</td> <td>Bob</td> <td>J</td> <td>Public</td> <td>1 High Street</td> <td colspan="2">Postfix</td> </tr> </tbody> </table>
sumber
colspan
di header dan baris, dan itu masih berfungsi. Saya akan senang mendengar tentang kasus apa pun yang Anda temukan yang tidak akan berhasil dengan ini.Solusi JavaScript murni:
var index = Array.prototype.indexOf.call(your_td.parentNode.children, your_td) var corresponding_th = document.querySelector('#your_table_id th:nth-child(' + (index+1) + ')')
sumber
Temukan yang cocok
th
untuktd
, dengan mempertimbangkancolspan
masalah indeks akun .$('table').on('click', 'td', get_TH_by_TD) function get_TH_by_TD(e){ var idx = $(this).index(), th, th_colSpan = 0; for( var i=0; i < this.offsetParent.tHead.rows[0].cells.length; i++ ){ th = this.offsetParent.tHead.rows[0].cells[i]; th_colSpan += th.colSpan; if( th_colSpan >= (idx + this.colSpan) ) break; } console.clear(); console.log( th ); return th; }
table{ width:100%; } th, td{ border:1px solid silver; padding:5px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <p>Click a TD:</p> <table> <thead> <tr> <th colspan="2"></th> <th>Name</th> <th colspan="2">Address</th> <th colspan="2">Other</th> </tr> </thead> <tbody> <tr> <td>X</td> <td>1</td> <td>Jon Snow</td> <td>12</td> <td>High Street</td> <td>Postfix</td> <td>Public</td> </tr> </tbody> </table>
sumber
Itu sederhana, jika Anda mereferensikannya dengan indeks. Jika Anda ingin menyembunyikan kolom pertama, Anda akan:
Salin kode
$('#thetable tr').find('td:nth-child(1),th:nth-child(1)').toggle();
Alasan saya pertama-tama memilih semua baris tabel dan kemudian td dan th yang merupakan anak ke-n adalah agar kita tidak perlu memilih tabel dan semua baris tabel dua kali. Ini meningkatkan kecepatan eksekusi skrip. Perlu diingat,
nth-child()
ini1
berdasarkan, tidak0
.sumber