テーブルセル(td)から対応するテーブルヘッダー(th)を取得するにはどうすればよいですか?


86

次のテーブルがある場合、各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>

現在td、すでに利用可能な要素のいずれかがあるとすると、対応するth要素をどのように見つけることができますか?

var $td = IveGotThisCovered();
var $th = GetTableHeader($td);

2
私のユースケースである1より大きいcolspanを持つ可能性を考慮した回答はありません:(
Dexygen 2015

1
@GeorgeJempty私の答えはcolspansを処理します。
doug65536 2016年

回答:


137
var $th = $td.closest('tbody').prev('thead').find('> tr > th:eq(' + $td.index() + ')');

または少し簡略化

var $th = $td.closest('table').find('th').eq($td.index());

2
テーブルにさらにテーブルを配置する場合は、.parent('table')代わりに.closest('table')
Dead.Rabit 2013

14
colspansはどうですか?
bradvido 2015年

@ bradvido-私の答えはそれを考慮に入れています
vsync 2017

10
var $th = $("table thead tr th").eq($td.index())

テーブルが複数ある場合は、IDを使用してテーブルを参照することをお勧めします。


ページに複数のテーブルが含まれている可能性があるため、このソリューションの信頼性が低くなります
vsync 2017

5

処理するソリューション colspan

Iは、の左エッジをマッチングに基づく溶液有するtd対応の左端にしますth。任意に複雑なcolspanを処理する必要があります。

テストケースを変更して、任意colspanが正しく処理されることを示しました。

ライブデモ

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>

テストケースを拡張colspanして、ヘッダーと行の任意の組み合わせを同時に使用しましたが、それでも機能しました。これでうまくいかないことがわかった場合は、喜んでお聞きします。
doug65536 2016年

4

あなたはtdのインデックスを使用することによってそれを行うことができます:

var tdIndex = $td.index() + 1;
var $th = $('#table tr').find('th:nth-child(' + tdIndex + ')');

1
これ.index()はゼロベースであり、nth-child1ベースであることを忘れないでください。したがって、結果は1つずれます。:o)
user113716 2010

3

純粋なJavaScriptのソリューション:

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) + ')')

1

インデックスの問題を考慮thしてtd、の一致を見つけcolspanます。

$('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>


0

インデックスで参照すれば、それは簡単です。最初の列を非表示にする場合は、次のようにします。

コードをコピーする

$('#thetable tr').find('td:nth-child(1),th:nth-child(1)').toggle();

最初にすべてのテーブル行を選択し、次にn番目の子であるtdとthの両方を選択した理由は、テーブルとすべてのテーブル行を2回選択する必要がないようにするためです。これにより、スクリプトの実行速度が向上します。覚えておいてください、ではなく、nth-child()1基づいてい0ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.