まず最初に... Ben Alpert の答えは問題なく、おそらく受け入れられます。
それでもパフォーマンスや速度に問題がある場合は、「昔ながらの方法」で行うことをお勧めします...バニラ JavaScript と DOM トラバーサルを使用します。
ここにフィドルがあります。ここでは、コストのかかるクエリをスキップするために、ハイブリッド JQuery/vanilla-js コードを使用しました。
$('td').click(function() {
//get all the trs in the table.
var trs = this.parentElement.parentElement.parentElement.getElementsByTagName('tr');
for (var i = 0; i < trs.length; i++) {
var tr = trs[i];
if ($(tr).hasClass('headrow')) continue;
var fourth = tr.getElementsByTagName('td')[3];
$(fourth).addClass('someclass');
}
});
DOM からクラスを追加してテストするためのカスタム関数を作成しないと、それよりもはるかに高速になることはありません。これは面倒です。
編集:これは 100% バニラ JS ソリューションのフィドルです。
これは 100% バニラ バージョンです (これは IE でテストしていません)。
function bindAllElements(elements, eventName, fn) {
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
element.addEventListener(eventName, fn);
}
}
function hasClass(element, className) {
if (typeof element.className === 'undefined') return false;
return element.className.indexOf(className) >= 0;
}
function addClass(element, className) {
if (!hasClass(element, className)) {
element.className += ' ' + className;
}
}
var alltds = document.getElementsByTagName('td');
bindAllElements(alltds, 'click', function(e) {
var td = e.target || event.srcElement;
var table = td.parentElement.parentElement.parentElement;
var trs = table.getElementsByTagName('tr');
for (var i = 0; i < trs.length; i++) {
var tr = trs[i];
if (!hasClass(tr, 'headrow')) {
addClass(tr.getElementsByTagName('td')[3], 'someclass');
}
}
});
EDIT2: これは楽しい挑戦でした... これは、 VanillaJS/Jquery/Hybrid のパフォーマンスを示す jsperf です。
VanillaJS バージョンは、他の提案された方法で実行するよりも約 2 倍高速であることを示しています。