首先... Ben Alpert 的回答很好,并且可能是可以接受的。
如果您仍然发现性能或速度存在问题,我建议您使用“老式方式”......使用 vanilla 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% vanilla JS 解决方案的小提琴
这是它的 100% vanilla 版本(我没有在 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 版本的速度大约是其他建议方式的两倍。