いいえ、ハードコーディングする必要はありません。(td-clickハンドラーで)この要素の一部の兄弟がすでに強調表示されていることを確認するだけです。たとえば、クラス'.highlight'を割り当てると、クエリは次のようになります。
$(this).siblings('.highlight');
...これは、強調表示されている同じ行の要素のみを返します。
更新:質問を読み間違え、実際に横の列を強調表示する必要があると考えました。垂直方向で作業する必要がある場合は、クエリにいくつか追加index
しnth-child
ます。
$('td').click(function() {
var $this = $(this),
index = $this.index();
var $columnCells = $this.parents('table')
.find('tr td:nth-child(' + (index + 1) + ')');
$columnCells.toggleClass('highlight');
});
デモ。
更新#2:完全なcol-highlightingコードの(確かに、少し大まかな)例は次のとおりです。
$('td').click(function() {
var $this = $(this),
index = $this.index(),
$table = $this.parents('table'),
$rows = $table.find('tr'),
$columnCells = $rows.find('td:nth-child(' + (index + 1) + ')');
var $hiCells = $columnCells.filter('.highlight');
if ($hiCells.length) {
var thisRowIndex = $this.parent().index(),
$firstHiRow = $( $hiCells[0] ).parent(),
firstHiIndex = $firstHiRow.index(),
$lastHiRow = $( $hiCells[$hiCells.length - 1] ).parent(),
lastHiIndex = $lastHiRow.index();
if (thisRowIndex > lastHiIndex) {
$rows.slice(lastHiIndex, thisRowIndex + 1)
.find('td:nth-child(' + (index + 1) + ')').addClass('highlight');
} else if (thisRowIndex < firstHiIndex) {
$rows.slice(thisRowIndex, firstHiIndex)
.find('td:nth-child(' + (index + 1) + ')')
.addClass('highlight');
}
} else {
$table.find('td').removeClass('highlight');
$this.addClass('highlight');
}
});
デモ。
ご覧のとおり、セルがクリックされるたびに、列内のすべてのセルが取得され、それらのハイライト状態が確認されます。それらのいくつかが強調表示されている場合、最初と最後に強調表示された行を取得し、基本的に同じ操作を実行します。1)クリックされた行と最後に強調表示された行の間にあるすべての行を取得します。2)同じ列のすべてのセルを取得し、3)'em!をマークします。この列で強調表示されているセルがない場合は、強調表示セットを削除してから、クリックしたセルを強調表示します。
ただし、すべての列番号がキャッシュされている場合(たとえば、「data-column」属性を使用)、これはかなり合理化できます。しかし、一般的な方法はまだ同じだと思います。